okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
f7fcae1
main
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 ) { 21flags := flag .NewFlagSet ("picker" ,flag .ContinueOnError ) 22id := flags .String ("id" ,"" ,"select an exact ID without opening a terminal" ) 23list := flags .Bool ("list" ,false ,"print IDs and labels without opening a terminal" ) 24if err := flags .Parse (args );err != nil { 25if err == flag .ErrHelp { 26return 0 ,nil 27 } 28return 2 ,err 29 } 30if flags .NArg ()!= 0 { 31return 2 ,fmt .Errorf ("unexpected arguments" ) 32 } 33if * list && * id != "" { 34return 2 ,fmt .Errorf ("choose either --list or --id" ) 35 } 36if * list { 37for _ ,row := range servers { 38if _ ,err := fmt .Fprintf (os .Stdout ,"%s\t%s\n" ,row .ID ,row .Label );err != nil { 39return 2 ,err 40 } 41 } 42return 0 ,nil 43 } 44if * id != "" { 45for _ ,row := range servers { 46if row .ID == * id { 47return finish (os .Stdout ,outcome {Accepted :true ,ID :row .ID }) 48 } 49 } 50return 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. 54if ! term .IsTerminal (os .Stdin .Fd ())|| ! term .IsTerminal (os .Stderr .Fd ()) { 55return 2 ,fmt .Errorf ("interactive mode needs terminal stdin and stderr; use --list or --id" ) 56 } 57final ,err := tea .NewProgram (newModel (servers ),tea .WithInput (os .Stdin ),tea .WithOutput (os .Stderr )).Run () 58if err != nil { 59return 2 ,fmt .Errorf ("picker: %w" ,err ) 60 } 61m ,ok := final .(* model ) 62if ! ok { 63return 2 ,fmt .Errorf ("unexpected final model %T" ,final ) 64 } 65return finish (os .Stdout ,m .result ) 66} 67 68func main () { 69code ,err := run (os .Args [1 :]) 70if err != nil { 71fmt .Fprintln (os .Stderr ,err ) 72 } 73os .Exit (code )// run's defers and Bubble Tea cleanup have already completed. 74}