diff --git a/container/container.go b/container/container.go index 79c3a55..5b15dce 100644 --- a/container/container.go +++ b/container/container.go @@ -4,6 +4,8 @@ import ( "context" "log" + "github.com/rogeecn/atom/utils/opt" + "github.com/spf13/viper" "go.uber.org/dig" ) @@ -19,3 +21,20 @@ func init() { log.Fatal(err) } } + +type ProviderContainer struct { + Provider func(...opt.Option) error + Options []opt.Option +} + +type Providers []ProviderContainer + +func (p Providers) Provide(config *viper.Viper) error { + for _, provider := range p { + provider.Options = append(provider.Options, opt.Config(config)) + if err := provider.Provider(provider.Options...); err != nil { + return err + } + } + return nil +} diff --git a/cmd/migrate.go b/migrate.go similarity index 99% rename from cmd/migrate.go rename to migrate.go index b57647a..ce4e1bd 100644 --- a/cmd/migrate.go +++ b/migrate.go @@ -1,4 +1,4 @@ -package cmd +package atom import ( "log" diff --git a/cmd/model.go b/model.go similarity index 97% rename from cmd/model.go rename to model.go index 6c7d86a..8bdeeae 100644 --- a/cmd/model.go +++ b/model.go @@ -1,7 +1,4 @@ -/* -Copyright © 2023 NAME HERE -*/ -package cmd +package atom import ( "errors" diff --git a/providers/config/config.go b/providers/config/config.go index 3bdf21a..ca2246c 100644 --- a/providers/config/config.go +++ b/providers/config/config.go @@ -5,14 +5,6 @@ import ( "github.com/spf13/viper" ) -func AutoLoad() *viper.Viper { - v, err := Load("config.toml") - if err != nil { - return nil - } - return v -} - func Load(file string) (*viper.Viper, error) { v := viper.NewWithOptions(viper.KeyDelimiter("_")) v.AutomaticEnv() diff --git a/root.go b/root.go new file mode 100644 index 0000000..9fd3aca --- /dev/null +++ b/root.go @@ -0,0 +1,96 @@ +package atom + +import ( + "github.com/pkg/errors" + "github.com/rogeecn/atom/container" + "github.com/rogeecn/atom/providers/config" + "github.com/spf13/cobra" +) + +var cfgFile string + +func Serve(providers container.Providers, opts ...Option) error { + var rootCmd = &cobra.Command{} + rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "config.toml", "config file path") + + for _, opt := range opts { + opt(rootCmd) + } + + WithMigration(rootCmd) + WithModel(rootCmd) + WithSeeder(rootCmd) + + // parse config files + configure, err := config.Load(cfgFile) + if err != nil { + return errors.Wrapf(err, "load config file: %s", cfgFile) + } + + if err := providers.Provide(configure); err != nil { + return err + } + + return rootCmd.Execute() +} + +type Option func(*cobra.Command) + +func Name(name string) Option { + return func(cmd *cobra.Command) { + cmd.Use = name + } +} + +func Short(short string) Option { + return func(cmd *cobra.Command) { + cmd.Short = short + } +} + +func Long(long string) Option { + return func(cmd *cobra.Command) { + cmd.Long = long + } +} +func Run(run func(cmd *cobra.Command, args []string)) Option { + return func(cmd *cobra.Command) { + cmd.Run = run + } +} + +func RunE(run func(cmd *cobra.Command, args []string) error) Option { + return func(cmd *cobra.Command) { + cmd.RunE = run + } +} + +func PostRun(run func(cmd *cobra.Command, args []string)) Option { + return func(cmd *cobra.Command) { + cmd.PostRun = run + } +} + +func PostRunE(run func(cmd *cobra.Command, args []string) error) Option { + return func(cmd *cobra.Command) { + cmd.PostRunE = run + } +} + +func PreRun(run func(cmd *cobra.Command, args []string)) Option { + return func(cmd *cobra.Command) { + cmd.PreRun = run + } +} + +func PreRunE(run func(cmd *cobra.Command, args []string) error) Option { + return func(cmd *cobra.Command) { + cmd.PreRunE = run + } +} + +func Config(file string) Option { + return func(cmd *cobra.Command) { + _ = cmd.PersistentFlags().Set("config", file) + } +} diff --git a/cmd/seed.go b/seed.go similarity index 98% rename from cmd/seed.go rename to seed.go index 90dee87..31de3a6 100644 --- a/cmd/seed.go +++ b/seed.go @@ -1,4 +1,4 @@ -package cmd +package atom import ( "log"