github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/cmd/new/new.go (about)

     1  package new
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"os/exec"
     7  
     8  	"github.com/JarrahG/buffalocli/internal/genny/assets/standard"
     9  	"github.com/JarrahG/buffalocli/internal/genny/assets/webpack"
    10  	"github.com/JarrahG/buffalocli/internal/genny/newapp/api"
    11  	"github.com/JarrahG/buffalocli/internal/genny/newapp/web"
    12  	"github.com/JarrahG/buffalocli/internal/genny/vcs"
    13  	"github.com/gobuffalo/genny/v2"
    14  	"github.com/gobuffalo/genny/v2/gogen"
    15  	"github.com/gobuffalo/logger"
    16  	"github.com/spf13/cobra"
    17  	"github.com/spf13/pflag"
    18  	"github.com/spf13/viper"
    19  )
    20  
    21  func RunE(cmd *cobra.Command, args []string) error {
    22  	// Restore default values after usage (useful for testing)
    23  	defer func() {
    24  		cmd.Flags().Visit(func(f *pflag.Flag) {
    25  			f.Value.Set(f.DefValue)
    26  		})
    27  		viper.BindPFlags(cmd.Flags())
    28  	}()
    29  
    30  	nopts, err := parseNewOptions(args)
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	opts := nopts.Options
    36  	app := opts.App
    37  
    38  	ctx := context.Background()
    39  
    40  	run := genny.WetRunner(ctx)
    41  	lg := logger.New(logger.DebugLevel)
    42  	run.Logger = lg
    43  
    44  	if nopts.DryRun {
    45  		run = genny.DryRunner(ctx)
    46  	}
    47  
    48  	run.Root = app.Root
    49  	if nopts.Force && !nopts.DryRun {
    50  		os.RemoveAll(app.Root)
    51  	}
    52  
    53  	var gg *genny.Group
    54  	if app.AsAPI {
    55  		if gg, err = api.New(&api.Options{
    56  			Options: opts,
    57  		}); err != nil {
    58  			return err
    59  		}
    60  	} else {
    61  		wo := &web.Options{
    62  			Options: opts,
    63  		}
    64  		if app.WithWebpack {
    65  			wo.Webpack = &webpack.Options{}
    66  		} else {
    67  			wo.Standard = &standard.Options{}
    68  		}
    69  		if gg, err = web.New(wo); err != nil {
    70  			return err
    71  		}
    72  	}
    73  
    74  	g := genny.New()
    75  	g.Command(exec.Command("go", "mod", "tidy"))
    76  	g.Command(exec.Command("go", "mod", "download"))
    77  	gg.Add(g)
    78  
    79  	run.WithGroup(gg)
    80  
    81  	if err := run.WithNew(gogen.Fmt(app.Root)); err != nil {
    82  		return err
    83  	}
    84  
    85  	// setup VCS last
    86  	if opts.VCS != nil {
    87  		// add the VCS generator
    88  		if err := run.WithNew(vcs.New(opts.VCS)); err != nil {
    89  			return err
    90  		}
    91  	}
    92  
    93  	if err := run.Run(); err != nil {
    94  		return err
    95  	}
    96  
    97  	run.Logger.Infof("Congratulations! Your application, %s, has been successfully generated!", app.Name)
    98  	run.Logger.Infof("You can find your new application at: %v", app.Root)
    99  	run.Logger.Info("Please read the README.md file in your new application for next steps on running your application.")
   100  
   101  	return nil
   102  }