diff --git a/cmd/dqs/config/config.go b/cmd/dqs/config/config.go new file mode 100644 index 0000000..b682d34 --- /dev/null +++ b/cmd/dqs/config/config.go @@ -0,0 +1,76 @@ +package config + +import ( + "flag" + "fmt" + "os" + "time" + + "code.chimeric.al/dwrz/dqs/internal/dqs/entry" +) + +const ( + defaultDir = "" + dirUsage = "path to the dqs directory (default: $XDG_CONFIG_HOME/dqs)" + + defaultDate = "" + dateUsage = "entry date in YYYYMMDD format (default: today)" +) + +type Config struct { + Date time.Time + Dir string +} + +func Get() (*Config, error) { + var ( + cfg = &Config{} + date string + ) + + flag.StringVar(&cfg.Dir, "dir", defaultDir, dirUsage) + flag.StringVar(&date, "d", defaultDate, dateUsage) + flag.StringVar(&date, "date", defaultDate, dateUsage) + + flag.Parse() + + // If unset, use the default directory. + if cfg.Dir == "" { + dir, err := DefaultDirectory() + if err != nil { + return nil, err + } + + cfg.Dir = dir + } + + // Parse and set the date. + // If unset, use the current date. + switch date { + case defaultDate: + now := time.Now() + cfg.Date = time.Date( + now.Year(), now.Month(), now.Day(), + 0, 0, 0, 0, time.Local, + ) + default: + var err error + cfg.Date, err = time.Parse(entry.DateFormat, date) + if err != nil { + return nil, fmt.Errorf("invalid date: %w", err) + } + } + + return cfg, nil +} + +func DefaultDirectory() (string, error) { + dir, err := os.UserConfigDir() + if err != nil { + return "", fmt.Errorf( + "failed to get user config dir: %w", err, + ) + } + + return fmt.Sprintf("%s/dqs", dir), nil +} diff --git a/cmd/dqs/main.go b/cmd/dqs/main.go new file mode 100644 index 0000000..50b3b49 --- /dev/null +++ b/cmd/dqs/main.go @@ -0,0 +1,34 @@ +package main + +import ( + "flag" + "log/slog" + "os" + + "code.chimeric.al/dwrz/dqs/cmd/dqs/config" + "code.chimeric.al/dwrz/dqs/internal/dqs" +) + +func main() { + var log = slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ + AddSource: true, + Level: slog.LevelDebug, + })) + + cfg, err := config.Get() + if err != nil { + log.Error("bad config", slog.Any("error", err)) + os.Exit(1) + } + + cmd, err := dqs.New(dqs.Config{Dir: cfg.Dir}) + if err != nil { + log.Error("failed to initialize dqs", slog.Any("error", err)) + os.Exit(1) + } + + if err := cmd.Run(flag.Args(), cfg.Date); err != nil { + log.Error("failed", slog.Any("error", err)) + os.Exit(1) + } +}