okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

dawnadd charm tui skillf7fcae1

main
2.1 KiB74 linesraw
1// picker is a runnable demonstration, not a deployment tool.
2package main
3
4import (
5	tea "charm.land/bubbletea/v2"
6	"flag"
7	"fmt"
8	"github.com/charmbracelet/x/term"
9	"os"
10)
11
12var servers = []item{
13	{"dev-eu", "development", "eu · ready"},
14	{"stage-eu", "staging", "eu · ready"},
15	{"prod-eu", "production", "eu · healthy"},
16	{"prod-jp", "東京 production", "jp · healthy"},
17	{"queue-eu", "queue worker", "eu · busy"},
18}
19
20func run(args []string) (int, error) {
21	flags := flag.NewFlagSet("picker", flag.ContinueOnError)
22	id := flags.String("id", "", "select an exact ID without opening a terminal")
23	list := flags.Bool("list", false, "print IDs and labels without opening a terminal")
24	if err := flags.Parse(args); err != nil {
25		if err == flag.ErrHelp {
26			return 0, nil
27		}
28		return 2, err
29	}
30	if flags.NArg() != 0 {
31		return 2, fmt.Errorf("unexpected arguments")
32	}
33	if *list && *id != "" {
34		return 2, fmt.Errorf("choose either --list or --id")
35	}
36	if *list {
37		for _, row := range servers {
38			if _, err := fmt.Fprintf(os.Stdout, "%s\t%s\n", row.ID, row.Label); err != nil {
39				return 2, err
40			}
41		}
42		return 0, nil
43	}
44	if *id != "" {
45		for _, row := range servers {
46			if row.ID == *id {
47				return finish(os.Stdout, outcome{Accepted: true, ID: row.ID})
48			}
49		}
50		return 2, fmt.Errorf("unknown ID %q", *id)
51	}
52	// stdout may be a pipe. Only stdin and the UI's stderr must be terminals.
53	// Do not open a hidden /dev/tty in unattended jobs.
54	if !term.IsTerminal(os.Stdin.Fd()) || !term.IsTerminal(os.Stderr.Fd()) {
55		return 2, fmt.Errorf("interactive mode needs terminal stdin and stderr; use --list or --id")
56	}
57	final, err := tea.NewProgram(newModel(servers), tea.WithInput(os.Stdin), tea.WithOutput(os.Stderr)).Run()
58	if err != nil {
59		return 2, fmt.Errorf("picker: %w", err)
60	}
61	m, ok := final.(*model)
62	if !ok {
63		return 2, fmt.Errorf("unexpected final model %T", final)
64	}
65	return finish(os.Stdout, m.result)
66}
67
68func main() {
69	code, err := run(os.Args[1:])
70	if err != nil {
71		fmt.Fprintln(os.Stderr, err)
72	}
73	os.Exit(code) // run's defers and Bubble Tea cleanup have already completed.
74}