package main import ( "flag" "io" "log" "strings" "github.com/chzyer/readline" ) var ( cmdMode = flag.String("c", "", "") helpMode = flag.Bool("h", false, "") quietMode = flag.Bool("q", false, "") promptMode = flag.Bool("p", false, "") ) func main() { state, err := buildInitialState() if err != nil { log.Fatal(err) } flag.Parse() if *helpMode { if err := Help(state, "cli"); err != nil { writeError(err.Error()) } return } if *cmdMode != "" { state.Quiet = true if err := handleCmdLine(state, *cmdMode); err != nil { writeError(err.Error()) } return } if *quietMode { state.Quiet = true } if *promptMode { runInteractivePrompt(state, flag.Args()) } else { runTUI(state, flag.Args()) } } func buildReadline(prompt string, conf *Config) (*readline.Instance, error) { rl, err := readline.New(prompt) if err != nil { return nil, err } if conf.VimKeys { rl.SetVimMode(true) } return rl, nil } func buildInitialState() (*BrowserState, error) { conf, err := getConfig() if err != nil { return nil, err } if err := getTofuStore(); err != nil { return nil, err } state := NewBrowserState(conf) marks, err := getMarks() if err != nil { return nil, err } state.Marks = marks tours, err := getTours() if err != nil { return nil, err } state.NamedTours = tours idents, err := getIdentities() if err != nil { return nil, err } state.Identities = idents rl, err := buildReadline(prompt(), conf) if err != nil { log.Fatal(err) } state.Readline = rl return state, nil } func runInteractivePrompt(state *BrowserState, args []string) { state.Printer = PromptPrinter{} if len(args) > 0 { if err := Go(state, args[0]); err != nil { state.Printer.PrintError(err.Error()) } } for { state.Readline.SetPrompt(prompt()) line, err := state.Readline.Readline() if err == io.EOF { break } if err != nil { log.Fatal(err) } if err := handleCmdLine(state, line); err != nil { state.Printer.PrintError(err.Error()) } } } func handleCmdLine(state *BrowserState, line string) error { for _, cmd := range strings.Split(line, ";") { if c, err := ParseCommand(strings.TrimSpace(cmd)); err != nil { return err } else if err := RunCommand(c, state); err != nil { return err } } return nil } func prompt() string { return promptStyle.Render("X-1") + "> " } func writeError(msg string) { _ = PromptPrinter{}.PrintError(msg) }