aboutsummaryrefslogtreecommitdiff
path: root/internal/cmd
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-09 05:59:20 -0400
committerhistoria <[not public]>2026-06-09 05:59:20 -0400
commit9eb5ab1818b6b19501fd7209db1987c9e06cc919 (patch)
tree76e046b0bf611dfe939a8c8f6507467de2e9e20f /internal/cmd
downloadthehouseoficarus-9eb5ab1818b6b19501fd7209db1987c9e06cc919.tar.gz
first commit
Diffstat (limited to 'internal/cmd')
-rw-r--r--internal/cmd/registry.go48
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
+}