summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go72
1 files changed, 33 insertions, 39 deletions
diff --git a/main.go b/main.go
index 25b570e..496d09b 100644
--- a/main.go
+++ b/main.go
@@ -2,13 +2,11 @@ package main
import (
_ "embed"
- "errors"
"fmt"
"github.com/ewy1/pik/cache"
"github.com/ewy1/pik/crawl"
"github.com/ewy1/pik/flags"
"github.com/ewy1/pik/git"
- "github.com/ewy1/pik/help"
"github.com/ewy1/pik/indexers/pikdex"
"github.com/ewy1/pik/menu"
"github.com/ewy1/pik/model"
@@ -73,9 +71,6 @@ var ForceConfirm = false
// used for stripping out results to prevent double-index
var SourcesWithoutResults *cache.Cache
-//go:embed version.txt
-var version string
-
func main() {
result := pik()
if profileFd != nil {
@@ -85,38 +80,36 @@ func main() {
_, _ = spool.Warn("%v\n", err)
}
}
- if result != 0 {
- os.Exit(result)
+ if result.Value != 0 {
+ result.Exit()
}
}
-func mode[T any](list ModeMap[T], fire func(mode T) error) *int {
- err := list.Traverse(func(in T) error {
+func mode[T any](list ModeMap[T], fire func(mode T) *spool.ExitCode) *spool.ExitCode {
+ code := list.Traverse(func(in T) *spool.ExitCode {
return fire(in)
})
- if errors.Is(err, Success) {
- zero := 0
- return &zero
- } else if err != nil {
- _, _ = spool.Warn("%v\n", err)
- one := 1
- return &one
+ if code != nil {
+ code.Exit()
}
return nil
}
-func pik() int {
- pflag.Usage = help.Echo
+func pik() spool.ExitCode {
+
+ // initialize the flags outside the main method so it can re-run in case
+ // pik changes its own configuration at runtime
+ pflag.Usage = func() { _ = uninitializedModes[flags.Help]() }
pflag.Parse()
- code := mode(uninitializedModes, func(mode func() error) error {
+ code := mode(uninitializedModes, func(mode func() *spool.ExitCode) *spool.ExitCode {
return mode()
})
if code != nil {
return *code
}
- code = mode(statelessModes, func(mode func() error) error {
+ code = mode(statelessModes, func(mode func() *spool.ExitCode) *spool.ExitCode {
return mode()
})
if code != nil {
@@ -133,19 +126,24 @@ func pik() int {
here, err := os.Getwd()
if err != nil {
_, _ = spool.Warn("%v\n", err)
- return 1
+ return spool.WorkingDirectoryFailure
}
locs := append(crawl.RichLocations(here), paths.System.String())
root, err := os.OpenRoot("/")
- defer root.Close()
+ defer func(root *os.Root) {
+ err := root.Close()
+ if err != nil {
+ _, _ = spool.Warn("%v\n", err)
+ }
+ }(root)
if root == nil {
_, _ = spool.Warn("%v\n", err)
- return 1
+ return spool.OpenRootFailure
}
fs := root.FS()
if err != nil {
_, _ = spool.Warn("%v\n", err)
- return 1
+ return spool.RootFsFailure
}
var st *model.State
var stateErrors []error
@@ -167,7 +165,7 @@ func pik() int {
c, err = cache.LoadFile(fs, paths.ContextsFile.String()[1:])
if err != nil {
_, _ = spool.Warn("%v\n", err)
- return 1
+ return spool.CacheReadFailure
}
st, stateErrors = cache.LoadState(fs, c, indexers, runners)
}
@@ -175,7 +173,7 @@ func pik() int {
_, _ = spool.Warn("%v\n", stateErrors)
}
- code = mode(statefulModes, func(mode func(st *model.State) error) error {
+ code = mode(statefulModes, func(mode func(st *model.State) *spool.ExitCode) *spool.ExitCode {
return mode(st)
})
if code != nil {
@@ -191,7 +189,7 @@ func pik() int {
md, err := menu.Show(st, hydrators)
if err != nil {
_, _ = spool.Warn("%v\n", err)
- return 1
+ return spool.HydrationFailure
}
cancelled = md.Cancel
source, target := md.Result()
@@ -214,35 +212,31 @@ func pik() int {
// TODO: Move auto-all logic into Search?
if !*flags.All && result.Target == nil && len(result.Args) > 0 && SourcesWithoutResults == nil && !ForceConfirm {
ForceConfirm = true
- if err != nil {
- _, _ = spool.Warn("%v\n", err)
- return 1
- }
SourcesWithoutResults = c
return pik()
}
if cancelled {
- _, _ = spool.Warn("no target selected\n")
- return 0
+ _, _ = spool.Warn("operation cancelled\n")
+ return spool.Cancelled
}
if result.Target == nil {
_, _ = spool.Warn("target not found\n")
- return 1
+ return spool.NotFoundFailure
}
if result.NeedsConfirmation || ForceConfirm {
- _, _ = fmt.Fprintf(os.Stderr, "this target is out of tree.\n")
+ _, _ = fmt.Fprintf(os.Stderr, "this target is out of tree\n")
if !menu.Confirm(os.Stdin, result.Source, result.Target, args...) {
- return 0
+ return spool.Cancelled
}
}
if result.Overridden {
_, _ = fmt.Fprintln(os.Stderr, menu.OverrideWarning(result.Target))
}
- code = mode(selectionModes, func(mode func(st *model.State, src *model.Source, t model.Target) error) error {
+ code = mode(selectionModes, func(mode func(st *model.State, src *model.Source, t model.Target) *spool.ExitCode) *spool.ExitCode {
return mode(st, result.Source, result.Target)
})
if code != nil {
@@ -253,8 +247,8 @@ func pik() int {
if err != nil {
_, _ = spool.Warn("%v\n", err)
- return 1
+ return spool.MenuFailure
}
- return 0
+ return spool.Success
}