From 46d032cd21b0e8e2c94a32333d3805ec76980cca Mon Sep 17 00:00:00 2001 From: ewy Date: Mon, 1 Jun 2026 18:47:44 +0200 Subject: add man(1) generation --- main.go | 72 ++++++++++++++++++++++++++++++----------------------------------- 1 file changed, 33 insertions(+), 39 deletions(-) (limited to 'main.go') 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 } -- cgit v1.3.1