github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/cli/internal/plugins/pop/setup/setup.go (about) 1 package setup 2 3 import ( 4 "context" 5 6 "github.com/gobuffalo/buffalo-cli/v2/cli/cmds/setup" 7 "github.com/gobuffalo/plugins" 8 "github.com/gobuffalo/plugins/plugcmd" 9 "github.com/gobuffalo/plugins/plugio" 10 "github.com/gobuffalo/plugins/plugprint" 11 "github.com/gobuffalo/pop/v5" 12 "github.com/spf13/pflag" 13 ) 14 15 var _ plugcmd.Namer = &Setup{} 16 var _ plugins.Needer = &Setup{} 17 var _ plugins.Plugin = &Setup{} 18 var _ plugins.Scoper = &Setup{} 19 var _ setup.Pflagger = &Setup{} 20 var _ setup.Setuper = &Setup{} 21 22 type Setup struct { 23 flags *pflag.FlagSet 24 dropDB bool 25 help bool 26 pluginsFn plugins.Feeder 27 } 28 29 func (Setup) PluginName() string { 30 return "pop/setup" 31 } 32 33 func (Setup) CmdName() string { 34 return "pop" 35 } 36 37 func (s *Setup) WithPlugins(f plugins.Feeder) { 38 s.pluginsFn = f 39 } 40 41 func (s *Setup) ScopedPlugins() []plugins.Plugin { 42 var plugs []plugins.Plugin 43 if s.pluginsFn == nil { 44 return plugs 45 } 46 47 for _, p := range s.pluginsFn() { 48 switch p.(type) { 49 case Migrater: 50 plugs = append(plugs, p) 51 case DBSeeder: 52 plugs = append(plugs, p) 53 } 54 } 55 56 return plugs 57 } 58 59 func (s *Setup) Setup(ctx context.Context, root string, args []string) error { 60 if err := pop.LoadConfigFile(); err != nil { 61 return plugins.Wrap(s, err) 62 } 63 64 flags := s.Flags() 65 if err := flags.Parse(args); err != nil { 66 return plugins.Wrap(s, err) 67 } 68 69 plugs := s.ScopedPlugins() 70 71 if s.help { 72 return plugprint.Print(plugio.Stdout(plugs...), s) 73 } 74 75 for _, conn := range pop.Connections { 76 if s.dropDB { 77 pop.DropDB(conn) 78 } 79 if err := pop.CreateDB(conn); err != nil { 80 return plugins.Wrap(s, err) 81 } 82 } 83 84 for _, p := range plugs { 85 if t, ok := p.(Migrater); ok { 86 if err := t.MigrateDB(ctx, root, args); err != nil { 87 return plugins.Wrap(p, err) 88 } 89 } 90 } 91 92 for _, p := range plugs { 93 if t, ok := p.(DBSeeder); ok { 94 if err := t.SeedDB(ctx, root, args); err != nil { 95 return plugins.Wrap(p, err) 96 } 97 } 98 } 99 100 return nil 101 }