diff options
| author | JP Appel <jeanpierre.appel01@gmail.com> | 2025-07-22 15:41:03 -0400 |
|---|---|---|
| committer | JP Appel <jeanpierre.appel01@gmail.com> | 2025-07-22 15:41:03 -0400 |
| commit | 344c6526a8d6f490fc7628ddc7d2dd06ed1a07c1 (patch) | |
| tree | 342878ff5d77b557533d6e5473e1d8f6e79ac6e9 /cmd/atlas.go | |
| parent | faf35ef54885bc48b897508ce3cb40b868ff505b (diff) | |
Separate program entry point from commands
Diffstat (limited to 'cmd/atlas.go')
| -rw-r--r-- | cmd/atlas.go | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/cmd/atlas.go b/cmd/atlas.go deleted file mode 100644 index 422218b..0000000 --- a/cmd/atlas.go +++ /dev/null @@ -1,181 +0,0 @@ -package main - -import ( - "errors" - "flag" - "fmt" - "io" - "io/fs" - "log/slog" - "os" - "runtime" - "strings" - "time" - - "github.com/adrg/xdg" - "github.com/jpappel/atlas/pkg/data" - "github.com/jpappel/atlas/pkg/query" - "github.com/jpappel/atlas/pkg/shell" -) - -const VERSION = "0.0.1" -const ExitCommand = 2 // exit because of a command parsing error - -type GlobalFlags struct { - IndexRoot string - DBPath string - LogLevel string - LogJson bool - NumWorkers uint - DateFormat string -} - -func addGlobalFlagUsage(fs *flag.FlagSet) func() { - return func() { - f := fs.Output() - fmt.Fprintln(f, "Usage of", fs.Name()) - fs.PrintDefaults() - fmt.Fprintln(f, "\nGlobal Flags:") - flag.PrintDefaults() - } -} - -func printHelp() { - fmt.Println("atlas is a note indexing and querying tool") - fmt.Printf("\nUsage:\n %s [global-flags] <command>\n\n", os.Args[0]) - fmt.Println("Commands:") - fmt.Println(" index - build, update, or modify an index") - fmt.Println(" query - search against an index") - fmt.Println(" shell - start a debug shell") - fmt.Println(" server - start an http query server (EXPERIMENTAL)") - fmt.Println(" help - print this help then exit") -} - -func main() { - home, _ := os.UserHomeDir() - dataHome := xdg.DataHome - if dataHome == "" { - dataHome = strings.Join([]string{home, ".local", "share"}, string(os.PathSeparator)) - } - dataHome += string(os.PathSeparator) + "atlas" - if err := os.Mkdir(dataHome, 0755); errors.Is(err, fs.ErrExist) { - } else if err != nil { - panic(err) - } - - globalFlags := GlobalFlags{} - flag.StringVar(&globalFlags.IndexRoot, "root", xdg.UserDirs.Documents, "root `directory` for indexing") - flag.StringVar(&globalFlags.DBPath, "db", dataHome+string(os.PathSeparator)+"default.db", "`path` to document database") - flag.StringVar(&globalFlags.LogLevel, "logLevel", "error", "set log `level` (debug, info, warn, error)") - flag.BoolVar(&globalFlags.LogJson, "logJson", false, "log to json") - flag.UintVar(&globalFlags.NumWorkers, "numWorkers", uint(runtime.NumCPU()), "number of worker threads to use (defaults to core count)") - flag.StringVar(&globalFlags.DateFormat, "dateFormat", time.RFC3339, "format for dates (see https://pkg.go.dev/time#Layout for more details)") - - indexFs := flag.NewFlagSet("index", flag.ExitOnError) - queryFs := flag.NewFlagSet("query", flag.ExitOnError) - shellFs := flag.NewFlagSet("debug", flag.ExitOnError) - serverFs := flag.NewFlagSet("server", flag.ExitOnError) - - indexFs.Usage = addGlobalFlagUsage(indexFs) - queryFs.Usage = addGlobalFlagUsage(queryFs) - shellFs.Usage = addGlobalFlagUsage(shellFs) - serverFs.Usage = addGlobalFlagUsage(serverFs) - - flag.Parse() - args := flag.Args() - - queryFlags := QueryFlags{Outputer: query.DefaultOutput{}} - indexFlags := IndexFlags{} - serverFlags := ServerFlags{Port: 8080} - - if len(args) < 1 { - fmt.Fprintln(os.Stderr, "No Command provided") - printHelp() - fmt.Fprintln(flag.CommandLine.Output(), "\nGlobal Flags:") - flag.PrintDefaults() - os.Exit(ExitCommand) - } - command := args[0] - - switch command { - case "query", "q": - setupQueryFlags(args[1:], queryFs, &queryFlags, globalFlags.DateFormat) - case "index": - setupIndexFlags(args[1:], indexFs, &indexFlags) - case "server": - setupServerFlags(args[1:], serverFs, &serverFlags) - case "help": - printHelp() - flag.PrintDefaults() - return - case "shell": - shellFs.Parse(args[1:]) - default: - fmt.Fprintln(os.Stderr, "Unrecognized command: ", command) - printHelp() - os.Exit(ExitCommand) - } - - slogLevel := &slog.LevelVar{} - loggerOpts := &slog.HandlerOptions{Level: slogLevel} - switch globalFlags.LogLevel { - case "debug": - slogLevel.Set(slog.LevelDebug) - loggerOpts.AddSource = true - case "info": - slogLevel.Set(slog.LevelInfo) - case "warn": - slogLevel.Set(slog.LevelWarn) - case "error": - slogLevel.Set(slog.LevelError) - default: - fmt.Fprintln(os.Stderr, "Unrecognized log level:", globalFlags.LogLevel) - os.Exit(ExitCommand) - } - var logHandler slog.Handler - if globalFlags.LogJson { - logHandler = slog.NewJSONHandler(os.Stderr, loggerOpts) - } else { - // strip time - loggerOpts.ReplaceAttr = func(groups []string, a slog.Attr) slog.Attr { - if a.Key == slog.TimeKey && len(groups) == 0 { - return slog.Attr{} - } - return a - } - logHandler = slog.NewTextHandler(os.Stderr, loggerOpts) - } - logger := slog.New(logHandler) - slog.SetDefault(logger) - - querier := data.NewQuery(globalFlags.DBPath) - - // command specific - var exitCode int - switch command { - case "query", "q": - searchQuery := strings.Join(queryFs.Args(), " ") - exitCode = int(runQuery(globalFlags, queryFlags, querier, searchQuery)) - case "index": - exitCode = int(runIndex(globalFlags, indexFlags, querier)) - case "server": - exitCode = int(runServer(serverFlags, querier)) - case "shell": - state := make(shell.State) - env := make(map[string]string) - - env["workers"] = fmt.Sprint(globalFlags.NumWorkers) - env["db_path"] = globalFlags.DBPath - env["index_root"] = globalFlags.IndexRoot - env["version"] = VERSION - - interpreter := shell.NewInterpreter(state, env, globalFlags.NumWorkers, querier) - if err := interpreter.Run(); err != nil && err != io.EOF { - slog.Error("Fatal error occured", slog.String("err", err.Error())) - exitCode = 1 - } - } - - querier.Close() - os.Exit(exitCode) -} |
