148 lines
2.4 KiB
Go
148 lines
2.4 KiB
Go
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)
|
|
}
|