1package cmd23import (4 "fmt"56 "git.lin.moe/go/mlisting/config"7 "git.lin.moe/go/mlisting/storage"8 "git.lin.moe/go/mlisting/storage/sqlite"9 "github.com/spf13/cobra"10)1112var Cmd *cobra.Command13var VERSION string = "unknown"1415func init() {16 Cmd = &cobra.Command{17 Use: "mlisting",18 Short: "a tiny mailing list service",19 PersistentPreRunE: prepareConfig,20 PersistentPostRunE: func(cmd *cobra.Command, args []string) error {21 st, ok := storage.FromContext(cmd.Context())22 if ok {23 return st.Shutdown(cmd.Context())24 }2526 return nil27 },28 CompletionOptions: cobra.CompletionOptions{29 HiddenDefaultCmd: true,30 },31 }3233 pf := Cmd.PersistentFlags()34 pf.StringP("config", "c", "/etc/mlisting/config.toml", "configuration file")3536 Cmd.AddCommand(&cobra.Command{37 Use: "version",38 Short: "Show version",39 Run: func(cmd *cobra.Command, args []string) {40 cmd.Printf("version: %s", VERSION)41 },42 })43}4445func prepareConfig(cmd *cobra.Command, args []string) error {46 if cmd.Name() == "help" {47 return nil48 }4950 ctx := cmd.Context()51 fpath, err := cmd.Flags().GetString("config")52 if err != nil {53 return err54 }55 cfg, err := config.ParseToml(fpath)56 if err != nil {57 cfg = config.DefaultConfig58 }59 ctx = config.Context(ctx, cfg)6061 st, err := openStorage(cfg.Storage.Driver, cfg.Storage.DSN)62 if err != nil {63 return err64 }65 ctx = storage.Context(ctx, st)6667 cmd.SetContext(ctx)68 return nil69}7071func openStorage(driver, dsn string) (st storage.Storage, err error) {72 switch driver {73 case "sqlite3":74 st, err = sqlite.NewStorage(dsn)75 if err != nil {76 return77 }78 default:79 err = fmt.Errorf("unknown storage driver %s", driver)80 }8182 return83}