diff options
Diffstat (limited to 'modes.go')
| -rw-r--r-- | modes.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/modes.go b/modes.go new file mode 100644 index 0000000..8f652fa --- /dev/null +++ b/modes.go @@ -0,0 +1,62 @@ +package main + +import ( + "errors" + "github.com/ewy1/pik/completion" + "github.com/ewy1/pik/flags" + "github.com/ewy1/pik/model" + "github.com/ewy1/pik/paths" + "github.com/ewy1/pik/run" + "github.com/ewy1/pik/spool" + "os" +) + +type ModeMap[T any] map[*bool]T + +func (m ModeMap[T]) Traverse(then func(in T) error) { + for enabled, mode := range m { + var err error + if *enabled { + err = then(mode) + } + if errors.Is(err, Continue) { + continue + } else if err != nil { + _, _ = spool.Warn("%v\n", err) + os.Exit(1) + } else { + os.Exit(0) + } + } +} + +var statelessModes = ModeMap[func() error]{ + flags.Version: func() error { + _, err := spool.Print("%s\n", version) + return err + }, + flags.Completion: func() error { + return completion.Echo() + + }, +} + +var Continue = errors.New("not an error; continue flow") + +var statefulModes = ModeMap[func(st *model.State) error]{ + flags.List: func(st *model.State) error { + for _, s := range st.Sources { + _, _ = spool.Print("%v", s.Label()+paths.Ifs) + for _, t := range s.Targets { + _, _ = spool.Print("%v", t.ShortestId()+paths.Ifs) + } + } + return nil + }, +} + +var selectionModes = ModeMap[func(st *model.State, src *model.Source, t model.Target) error]{ + flags.Edit: func(st *model.State, src *model.Source, t model.Target) error { + return run.Edit(t, src) + }, +} |
