summaryrefslogtreecommitdiff
path: root/modes.go
diff options
context:
space:
mode:
Diffstat (limited to 'modes.go')
-rw-r--r--modes.go62
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)
+ },
+}