package main import ( "encoding/json" "fmt" "math/rand" "os" "os/exec" "time" "github.com/AlecAivazis/survey/v2" ) func main() { var err error if len(os.Args) > 2 { fmt.Println("expected zero or one arguments") } if len(os.Args) > 1 { arg := os.Args[1] switch arg { case "-r", "--random": err = visitRandomUser() default: err = visitUsername(os.Args[1]) } } else { err = visitPrompt() } if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } } func visitRandomUser() error { rand.Seed(time.Now().UnixNano()) usernames, err := getUsernames() if err != nil { return err } return visitUser(usernames[rand.Intn(len(usernames))]) } func visitUsername(username string) error { usernames, err := getUsernames() if err != nil { return err } for _, name := range usernames { if name == username { return visitUser(username) } } return fmt.Errorf("no such user: %s", username) } func visitPrompt() error { usernames, err := getUsernames() if err != nil { return err } username := "" prompt := &survey.Select{ Message: "Choose a townie to visit!", Options: usernames, } survey.AskOne(prompt, &username) return visitUser(username) } func visitUser(username string) error { fmt.Println("TODO visit", username) return nil } func getUsernames() ([]string, error) { cmd := exec.Command("/bin/bash", "-c", "town stats | jq -r '.users|map(.username)'") output, err := cmd.Output() if err != nil { return nil, err } usernames := []string{} err = json.Unmarshal(output, &usernames) if err != nil { return nil, err } return usernames, nil }