x-1/main.go

148 lines
2.4 KiB
Go
Raw Permalink Normal View History

package main
2024-01-03 15:29:40 +00:00
import (
"flag"
2024-01-03 15:29:40 +00:00
"io"
"log"
"strings"
2024-01-03 15:29:40 +00:00
"github.com/chzyer/readline"
)
2024-01-17 15:55:42 +00:00
var (
2024-02-16 16:44:52 +00:00
cmdMode = flag.String("c", "", "")
helpMode = flag.Bool("h", false, "")
quietMode = flag.Bool("q", false, "")
promptMode = flag.Bool("p", false, "")
2024-01-17 15:55:42 +00:00
)
func main() {
2024-01-17 15:55:42 +00:00
state, err := buildInitialState()
2024-01-03 15:29:40 +00:00
if err != nil {
log.Fatal(err)
}
2024-01-08 18:10:24 +00:00
flag.Parse()
if *helpMode {
if err := Help(state, "cli"); err != nil {
writeError(err.Error())
}
return
}
if *cmdMode != "" {
state.Quiet = true
2024-01-17 15:55:42 +00:00
if err := handleCmdLine(state, *cmdMode); err != nil {
writeError(err.Error())
}
return
}
2024-01-15 02:54:15 +00:00
if *quietMode {
state.Quiet = true
}
2024-02-16 16:44:52 +00:00
if *promptMode {
runInteractivePrompt(state, flag.Args())
} else {
runTUI(state, flag.Args())
}
2024-01-17 15:55:42 +00:00
}
func buildReadline(prompt string, conf *Config) (*readline.Instance, error) {
rl, err := readline.New(prompt)
if err != nil {
2024-01-17 15:55:42 +00:00
return nil, err
}
2024-01-03 19:17:37 +00:00
if conf.VimKeys {
rl.SetVimMode(true)
}
2024-01-03 15:29:40 +00:00
2024-01-17 15:55:42 +00:00
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
}
2024-01-17 15:55:42 +00:00
state.Identities = idents
2024-02-16 16:44:52 +00:00
rl, err := buildReadline(prompt(), conf)
2024-01-17 15:55:42 +00:00
if err != nil {
log.Fatal(err)
}
state.Readline = rl
return state, nil
}
2024-01-24 05:42:18 +00:00
func runInteractivePrompt(state *BrowserState, args []string) {
state.Printer = PromptPrinter{}
if len(args) > 0 {
if err := Go(state, args[0]); err != nil {
2024-02-16 16:44:52 +00:00
state.Printer.PrintError(err.Error())
2024-01-24 05:42:18 +00:00
}
}
2024-01-03 15:29:40 +00:00
for {
2024-02-16 16:44:52 +00:00
state.Readline.SetPrompt(prompt())
2024-01-17 15:55:42 +00:00
line, err := state.Readline.Readline()
2024-01-03 15:29:40 +00:00
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
2024-01-17 15:55:42 +00:00
if err := handleCmdLine(state, line); err != nil {
2024-02-16 16:44:52 +00:00
state.Printer.PrintError(err.Error())
2024-01-03 15:29:40 +00:00
}
}
}
2024-01-17 15:55:42 +00:00
func handleCmdLine(state *BrowserState, line string) error {
for _, cmd := range strings.Split(line, ";") {
if c, err := ParseCommand(strings.TrimSpace(cmd)); err != nil {
return err
2024-01-17 15:55:42 +00:00
} else if err := RunCommand(c, state); err != nil {
return err
}
2024-01-03 15:29:40 +00:00
}
return nil
2024-01-03 15:29:40 +00:00
}
2024-02-16 16:44:52 +00:00
func prompt() string {
return promptStyle.Render("X-1") + "> "
}
2024-01-03 15:29:40 +00:00
func writeError(msg string) {
2024-02-16 16:44:52 +00:00
_ = PromptPrinter{}.PrintError(msg)
}