package main import ( "fmt" "io" "os" "strings" "sync" ) var ( executeMu sync.Mutex commandStdout io.Writer = os.Stdout commandStderr io.Writer = os.Stderr ) func Execute(args []string, stdout, stderr io.Writer) int { executeMu.Lock() defer executeMu.Unlock() prevStdout := commandStdout prevStderr := commandStderr commandStdout = stdout commandStderr = stderr defer func() { commandStdout = prevStdout commandStderr = prevStderr }() if len(args) < 1 { usage() return 2 } if args[0] == "help" { if len(args) == 1 { usage() return 0 } if err := runCommand([]string{args[1], "--help"}); err != nil { _, _ = fmt.Fprintln(commandStderr, err) return 1 } return 0 } if isHelpToken(args[0]) { usage() return 0 } if err := runCommand(args); err != nil { _, _ = fmt.Fprintln(commandStderr, err) return 1 } return 0 } func isHelpToken(value string) bool { switch strings.TrimSpace(value) { case "-h", "--help": return true default: return false } } func runCommand(args []string) error { switch args[0] { case "init": return runInit(args[1:]) case "add": return runAdd(args[1:]) case "ingest": return runIngest(args[1:]) case "search": return runSearch(args[1:]) case "list": return runList(args[1:]) case "events": return runEvents(args[1:]) case "link": return runLink(args[1:]) case "verify": return runVerify(args[1:]) case "repos": return runRepos(args[1:]) default: usage() return fmt.Errorf("unknown command %s", args[0]) } }