package main import ( "fmt" "io" "os" "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 err := runCommand(args); err != nil { _, _ = fmt.Fprintln(commandStderr, err) return 1 } return 0 } 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]) } }