diff options
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 +} |
