github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/built/app.go (about)

     1  package built
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  
     8  	"github.com/gobuffalo/buffalo-cli/v2/internal/garlic"
     9  	"github.com/gobuffalo/plugins"
    10  	"github.com/gobuffalo/plugins/plugio"
    11  )
    12  
    13  type App struct {
    14  	Plugger      plugins.Scoper
    15  	BuildTime    string
    16  	BuildVersion string
    17  	Fallthrough  func(ctx context.Context, root string, args []string) error
    18  	OriginalMain func()
    19  }
    20  
    21  func (b *App) ScopedPlugins() []plugins.Plugin {
    22  	var plugs []plugins.Plugin
    23  	if b.Plugger == nil {
    24  		return plugs
    25  	}
    26  	return b.Plugger.ScopedPlugins()
    27  }
    28  
    29  func (b *App) Main(ctx context.Context, root string, args []string) error {
    30  	plugs := b.ScopedPlugins()
    31  
    32  	for _, p := range plugs {
    33  		bl, ok := p.(Initer)
    34  		if !ok {
    35  			continue
    36  		}
    37  		if err := bl.BuiltInit(ctx, root, args); err != nil {
    38  			return err
    39  		}
    40  	}
    41  
    42  	var originalArgs []string
    43  	for i, arg := range args {
    44  		if arg == "--" {
    45  			originalArgs = append([]string{args[0]}, args[i+1:]...)
    46  			args = args[:i]
    47  			break
    48  		}
    49  	}
    50  	if len(args) == 0 {
    51  		if b.OriginalMain == nil {
    52  			if b.Fallthrough != nil {
    53  				return b.Fallthrough(ctx, root, args)
    54  			}
    55  			return nil
    56  		}
    57  		if len(originalArgs) != 0 {
    58  			os.Args = originalArgs
    59  		}
    60  		b.OriginalMain()
    61  		return nil
    62  	}
    63  
    64  	c := args[0]
    65  	switch c {
    66  	case "version":
    67  		fmt.Fprintln(plugio.Stdout(plugs...), b.BuildVersion)
    68  		return nil
    69  	}
    70  	if b.Fallthrough != nil {
    71  		return b.Fallthrough(ctx, root, args)
    72  	}
    73  	return garlic.Run(ctx, root, args)
    74  }