From f590c62b64ac21b37923924de07a5edfc8d52350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20Alt=C4=B1?= Date: Wed, 10 Dec 2025 22:50:37 -0500 Subject: [PATCH] Update main func --- internal/boltbrowser/main.go | 89 +++++----------------------------- main.go | 88 +++++++++++++++++++++++++++++++++ pkg/boltbrowser/boltbrowser.go | 9 ++++ 3 files changed, 109 insertions(+), 77 deletions(-) create mode 100644 main.go create mode 100644 pkg/boltbrowser/boltbrowser.go diff --git a/internal/boltbrowser/main.go b/internal/boltbrowser/main.go index 3ef18c7..51acab3 100644 --- a/internal/boltbrowser/main.go +++ b/internal/boltbrowser/main.go @@ -1,10 +1,8 @@ package boltbrowser import ( - "errors" "fmt" "os" - "strings" "time" "github.com/nsf/termbox-go" @@ -14,6 +12,7 @@ import ( var ProgramName = "boltbrowser" var VersionNum = 2.0 +var AppArgs Args var databaseFiles []string var db *bbolt.DB var memBolt *BoltDB @@ -22,91 +21,26 @@ var currentFilename string const DefaultDBOpenTimeout = time.Second -var AppArgs struct { +type Args struct { DBOpenTimeout time.Duration ReadOnly bool NoValue bool } -func init() { - AppArgs.DBOpenTimeout = DefaultDBOpenTimeout - AppArgs.ReadOnly = false +func DefaultArgs() Args { + return Args{ + DBOpenTimeout: DefaultDBOpenTimeout, + } } -func parseArgs() { +func Main(args Args, files []string) error { + // Set the global args. This is done to convert main package into a library with minimal changes. + AppArgs, databaseFiles = args, files + var err error - if len(os.Args) == 1 { - printUsage(nil) - } - parms := os.Args[1:] - for i := range parms { - // All 'option' arguments start with "-" - if !strings.HasPrefix(parms[i], "-") { - databaseFiles = append(databaseFiles, parms[i]) - continue - } - if strings.Contains(parms[i], "=") { - // Key/Value pair Arguments - pts := strings.Split(parms[i], "=") - key, val := pts[0], pts[1] - switch key { - case "-timeout": - AppArgs.DBOpenTimeout, err = time.ParseDuration(val) - if err != nil { - // See if we can successfully parse by adding a 's' - AppArgs.DBOpenTimeout, err = time.ParseDuration(val + "s") - } - // If err is still not nil, print usage - if err != nil { - printUsage(err) - } - case "-readonly", "-ro": - if val == "true" { - AppArgs.ReadOnly = true - } - case "-no-value": - if val == "true" { - AppArgs.NoValue = true - } - case "-help": - printUsage(nil) - default: - printUsage(errors.New("Invalid option")) - } - } else { - // Single-word arguments - switch parms[i] { - case "-readonly", "-ro": - AppArgs.ReadOnly = true - case "-no-value": - AppArgs.NoValue = true - case "-help": - printUsage(nil) - default: - printUsage(errors.New("Invalid option")) - } - } - } -} - -func printUsage(err error) { - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - } - fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS] \nOptions:\n", ProgramName) - fmt.Fprintf(os.Stderr, " -timeout=duration\n DB file open timeout (default 1s)\n") - fmt.Fprintf(os.Stderr, " -ro, -readonly \n Open the DB in read-only mode\n") - fmt.Fprintf(os.Stderr, " -no-value \n Do not display a value in left pane\n") -} - -func main() { - var err error - - parseArgs() - err = termbox.Init() if err != nil { - panic(err) + return err } defer termbox.Close() style := defaultStyle() @@ -141,4 +75,5 @@ func main() { mainLoop(memBolt, style) defer db.Close() } + return nil } diff --git a/main.go b/main.go new file mode 100644 index 0000000..a9ba9e1 --- /dev/null +++ b/main.go @@ -0,0 +1,88 @@ +package main + +import ( + "errors" + "fmt" + "os" + "strings" + "time" + + "github.com/br0xen/boltbrowser/pkg/boltbrowser" +) + +func main() { + args := boltbrowser.DefaultArgs() + files := parseArgs(&args) + err := boltbrowser.Main(args, files) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } +} + +func parseArgs(args *boltbrowser.Args) (databaseFiles []string) { + var err error + if len(os.Args) == 1 { + printUsage(nil) + } + parms := os.Args[1:] + for i := range parms { + // All 'option' arguments start with "-" + if !strings.HasPrefix(parms[i], "-") { + databaseFiles = append(databaseFiles, parms[i]) + continue + } + if strings.Contains(parms[i], "=") { + // Key/Value pair Arguments + pts := strings.Split(parms[i], "=") + key, val := pts[0], pts[1] + switch key { + case "-timeout": + args.DBOpenTimeout, err = time.ParseDuration(val) + if err != nil { + // See if we can successfully parse by adding a 's' + args.DBOpenTimeout, err = time.ParseDuration(val + "s") + } + // If err is still not nil, print usage + if err != nil { + printUsage(err) + } + case "-readonly", "-ro": + if val == "true" { + args.ReadOnly = true + } + case "-no-value": + if val == "true" { + args.NoValue = true + } + case "-help": + printUsage(nil) + default: + printUsage(errors.New("Invalid option")) + } + } else { + // Single-word arguments + switch parms[i] { + case "-readonly", "-ro": + args.ReadOnly = true + case "-no-value": + args.NoValue = true + case "-help": + printUsage(nil) + default: + printUsage(errors.New("Invalid option")) + } + } + } + return +} + +func printUsage(err error) { + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + } + fmt.Fprintf(os.Stderr, "Usage: boltbrowser [OPTIONS] \nOptions:\n") + fmt.Fprintf(os.Stderr, " -timeout=duration\n DB file open timeout (default 1s)\n") + fmt.Fprintf(os.Stderr, " -ro, -readonly \n Open the DB in read-only mode\n") + fmt.Fprintf(os.Stderr, " -no-value \n Do not display a value in left pane\n") +} diff --git a/pkg/boltbrowser/boltbrowser.go b/pkg/boltbrowser/boltbrowser.go new file mode 100644 index 0000000..aafa4d8 --- /dev/null +++ b/pkg/boltbrowser/boltbrowser.go @@ -0,0 +1,9 @@ +package boltbrowser + +import internal "github.com/br0xen/boltbrowser/internal/boltbrowser" + +type Args = internal.Args + +var DefaultArgs = internal.DefaultArgs + +var Main = internal.Main