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  }