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 }