aboutsummaryrefslogtreecommitdiff
path: root/internal/cmd/registry.go
blob: e0564699c77c2da8f5cd0ce96d6c719c43850f17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
}