command.go 858 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package control
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "strings"
  7. )
  8. type Description struct {
  9. Short string
  10. Usage []string
  11. }
  12. type Command interface {
  13. Name() string
  14. Description() Description
  15. Execute(args []string) error
  16. }
  17. var (
  18. commandRegistry = make(map[string]Command)
  19. ctllog = log.New(os.Stderr, "v2ctl> ", 0)
  20. )
  21. func RegisterCommand(cmd Command) error {
  22. entry := strings.ToLower(cmd.Name())
  23. if entry == "" {
  24. return newError("empty command name")
  25. }
  26. commandRegistry[entry] = cmd
  27. return nil
  28. }
  29. func GetCommand(name string) Command {
  30. cmd, found := commandRegistry[name]
  31. if !found {
  32. return nil
  33. }
  34. return cmd
  35. }
  36. type hiddenCommand interface {
  37. Hidden() bool
  38. }
  39. func PrintUsage() {
  40. for name, cmd := range commandRegistry {
  41. if _, ok := cmd.(hiddenCommand); ok {
  42. continue
  43. }
  44. fmt.Println(" ", name, "\t\t\t", cmd.Description())
  45. }
  46. }