github.com/goravel/framework@v1.13.9/console/application.go (about)

     1  package console
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  
     7  	"github.com/gookit/color"
     8  	"github.com/urfave/cli/v2"
     9  
    10  	"github.com/goravel/framework/contracts/console"
    11  	"github.com/goravel/framework/contracts/console/command"
    12  	"github.com/goravel/framework/support"
    13  )
    14  
    15  type Application struct {
    16  	instance *cli.App
    17  }
    18  
    19  func NewApplication() console.Artisan {
    20  	instance := cli.NewApp()
    21  	instance.Name = "Goravel Framework"
    22  	instance.Usage = support.Version
    23  	instance.UsageText = "artisan [global options] command [options] [arguments...]"
    24  
    25  	return &Application{instance}
    26  }
    27  
    28  func (c *Application) Register(commands []console.Command) {
    29  	for _, item := range commands {
    30  		item := item
    31  		cliCommand := cli.Command{
    32  			Name:  item.Signature(),
    33  			Usage: item.Description(),
    34  			Action: func(ctx *cli.Context) error {
    35  				return item.Handle(&CliContext{ctx})
    36  			},
    37  		}
    38  
    39  		cliCommand.Category = item.Extend().Category
    40  		cliCommand.Flags = flagsToCliFlags(item.Extend().Flags)
    41  		c.instance.Commands = append(c.instance.Commands, &cliCommand)
    42  	}
    43  }
    44  
    45  // Call Run an Artisan console command by name.
    46  func (c *Application) Call(command string) {
    47  	c.Run(append([]string{os.Args[0], "artisan"}, strings.Split(command, " ")...), false)
    48  }
    49  
    50  // CallAndExit Run an Artisan console command by name and exit.
    51  func (c *Application) CallAndExit(command string) {
    52  	c.Run(append([]string{os.Args[0], "artisan"}, strings.Split(command, " ")...), true)
    53  }
    54  
    55  // Run a command. Args come from os.Args.
    56  func (c *Application) Run(args []string, exitIfArtisan bool) {
    57  	artisanIndex := -1
    58  	for i, arg := range args {
    59  		if arg == "artisan" {
    60  			artisanIndex = i
    61  			break
    62  		}
    63  	}
    64  
    65  	if artisanIndex != -1 {
    66  		// Add --help if no command argument is provided.
    67  		if artisanIndex+1 == len(args) {
    68  			args = append(args, "--help")
    69  		}
    70  
    71  		if args[artisanIndex+1] != "-V" && args[artisanIndex+1] != "--version" {
    72  			cliArgs := append([]string{args[0]}, args[artisanIndex+1:]...)
    73  			if err := c.instance.Run(cliArgs); err != nil {
    74  				panic(err.Error())
    75  			}
    76  		}
    77  
    78  		printResult(args[artisanIndex+1])
    79  
    80  		if exitIfArtisan {
    81  			os.Exit(0)
    82  		}
    83  	}
    84  }
    85  
    86  func flagsToCliFlags(flags []command.Flag) []cli.Flag {
    87  	var cliFlags []cli.Flag
    88  	for _, flag := range flags {
    89  		switch flag.Type() {
    90  		case command.FlagTypeBool:
    91  			flag := flag.(*command.BoolFlag)
    92  			cliFlags = append(cliFlags, &cli.BoolFlag{
    93  				Name:     flag.Name,
    94  				Aliases:  flag.Aliases,
    95  				Usage:    flag.Usage,
    96  				Required: flag.Required,
    97  				Value:    flag.Value,
    98  			})
    99  		case command.FlagTypeFloat64:
   100  			flag := flag.(*command.Float64Flag)
   101  			cliFlags = append(cliFlags, &cli.Float64Flag{
   102  				Name:     flag.Name,
   103  				Aliases:  flag.Aliases,
   104  				Usage:    flag.Usage,
   105  				Required: flag.Required,
   106  				Value:    flag.Value,
   107  			})
   108  		case command.FlagTypeFloat64Slice:
   109  			flag := flag.(*command.Float64SliceFlag)
   110  			cliFlags = append(cliFlags, &cli.Float64SliceFlag{
   111  				Name:     flag.Name,
   112  				Aliases:  flag.Aliases,
   113  				Usage:    flag.Usage,
   114  				Required: flag.Required,
   115  				Value:    cli.NewFloat64Slice(flag.Value...),
   116  			})
   117  		case command.FlagTypeInt:
   118  			flag := flag.(*command.IntFlag)
   119  			cliFlags = append(cliFlags, &cli.IntFlag{
   120  				Name:     flag.Name,
   121  				Aliases:  flag.Aliases,
   122  				Usage:    flag.Usage,
   123  				Required: flag.Required,
   124  				Value:    flag.Value,
   125  			})
   126  		case command.FlagTypeIntSlice:
   127  			flag := flag.(*command.IntSliceFlag)
   128  			cliFlags = append(cliFlags, &cli.IntSliceFlag{
   129  				Name:     flag.Name,
   130  				Aliases:  flag.Aliases,
   131  				Usage:    flag.Usage,
   132  				Required: flag.Required,
   133  				Value:    cli.NewIntSlice(flag.Value...),
   134  			})
   135  		case command.FlagTypeInt64:
   136  			flag := flag.(*command.Int64Flag)
   137  			cliFlags = append(cliFlags, &cli.Int64Flag{
   138  				Name:     flag.Name,
   139  				Aliases:  flag.Aliases,
   140  				Usage:    flag.Usage,
   141  				Required: flag.Required,
   142  				Value:    flag.Value,
   143  			})
   144  		case command.FlagTypeInt64Slice:
   145  			flag := flag.(*command.Int64SliceFlag)
   146  			cliFlags = append(cliFlags, &cli.Int64SliceFlag{
   147  				Name:     flag.Name,
   148  				Aliases:  flag.Aliases,
   149  				Usage:    flag.Usage,
   150  				Required: flag.Required,
   151  				Value:    cli.NewInt64Slice(flag.Value...),
   152  			})
   153  		case command.FlagTypeString:
   154  			flag := flag.(*command.StringFlag)
   155  			cliFlags = append(cliFlags, &cli.StringFlag{
   156  				Name:     flag.Name,
   157  				Aliases:  flag.Aliases,
   158  				Usage:    flag.Usage,
   159  				Required: flag.Required,
   160  				Value:    flag.Value,
   161  			})
   162  		case command.FlagTypeStringSlice:
   163  			flag := flag.(*command.StringSliceFlag)
   164  			cliFlags = append(cliFlags, &cli.StringSliceFlag{
   165  				Name:     flag.Name,
   166  				Aliases:  flag.Aliases,
   167  				Usage:    flag.Usage,
   168  				Required: flag.Required,
   169  				Value:    cli.NewStringSlice(flag.Value...),
   170  			})
   171  		}
   172  	}
   173  
   174  	return cliFlags
   175  }
   176  
   177  func printResult(command string) {
   178  	switch command {
   179  	case "make:command":
   180  		color.Greenln("Console command created successfully")
   181  	case "-V", "--version":
   182  		color.Greenln("Goravel Framework " + support.Version)
   183  	}
   184  }