diff options
| author | historia <[not public]> | 2026-06-09 05:59:20 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-09 05:59:20 -0400 |
| commit | 9eb5ab1818b6b19501fd7209db1987c9e06cc919 (patch) | |
| tree | 76e046b0bf611dfe939a8c8f6507467de2e9e20f /internal/cmd/registry.go | |
| download | thehouseoficarus-9eb5ab1818b6b19501fd7209db1987c9e06cc919.tar.gz | |
first commit
Diffstat (limited to 'internal/cmd/registry.go')
| -rw-r--r-- | internal/cmd/registry.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/internal/cmd/registry.go b/internal/cmd/registry.go new file mode 100644 index 0000000..e056469 --- /dev/null +++ b/internal/cmd/registry.go @@ -0,0 +1,48 @@ +package cmd + +import ( + "fmt" + "strings" +) + +type Handler func(args []string) + +type Command struct { + Name string + Aliases []string + Handler Handler + MinArgs int +} + +type Registry struct { + cmds map[string]Command +} + +func NewRegistry() *Registry { + return &Registry{cmds: make(map[string]Command)} +} + +func (r *Registry) Register(cmd Command) { + r.cmds[cmd.Name] = cmd + for _, a := range cmd.Aliases { + r.cmds[a] = cmd + } +} + +func (r *Registry) Dispatch(input string) error { + parts := strings.Fields(input) + if len(parts) == 0 { + return nil + } + name := strings.ToLower(parts[0]) + cmd, ok := r.cmds[name] + if !ok { + return fmt.Errorf("unknown command: %s", name) + } + args := parts[1:] + if len(args) < cmd.MinArgs { + return fmt.Errorf("usage: %s requires at least %d arguments", cmd.Name, cmd.MinArgs) + } + cmd.Handler(args) + return nil +} |
