x-1/main.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)
}