github.com/elopio/cli@v6.21.2-0.20160902224010-ea909d1fdb2f+incompatible/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "reflect" 7 8 "code.cloudfoundry.org/cli/cf/cmd" 9 "code.cloudfoundry.org/cli/commands" 10 "code.cloudfoundry.org/cli/commands/ui" 11 "code.cloudfoundry.org/cli/commands/v2" 12 "code.cloudfoundry.org/cli/utils/config" 13 "code.cloudfoundry.org/cli/utils/panichandler" 14 "github.com/jessevdk/go-flags" 15 ) 16 17 func main() { 18 defer panichandler.HandlePanic() 19 parse(os.Args[1:]) 20 } 21 22 func parse(args []string) { 23 parser := flags.NewParser(&v2.Commands, flags.HelpFlag) 24 parser.CommandHandler = myCommandHandler 25 extraArgs, err := parser.ParseArgs(args) 26 if err == nil { 27 return 28 } 29 30 if flagErr, ok := err.(*flags.Error); ok { 31 switch flagErr.Type { 32 case flags.ErrHelp, flags.ErrUnknownFlag, flags.ErrExpectedArgument: 33 _, found := reflect.TypeOf(v2.Commands).FieldByNameFunc( 34 func(fieldName string) bool { 35 field, _ := reflect.TypeOf(v2.Commands).FieldByName(fieldName) 36 return parser.Active != nil && parser.Active.Name == field.Tag.Get("command") 37 }, 38 ) 39 40 if found && flagErr.Type == flags.ErrUnknownFlag && parser.Active.Name == "set-env" { 41 newArgs := []string{} 42 for _, arg := range args { 43 if arg[0] == '-' { 44 newArgs = append(newArgs, fmt.Sprintf("%s%s", v2.WorkAroundPrefix, arg)) 45 } else { 46 newArgs = append(newArgs, arg) 47 } 48 } 49 parse(newArgs) 50 return 51 } 52 53 if flagErr.Type == flags.ErrUnknownFlag || flagErr.Type == flags.ErrExpectedArgument { 54 fmt.Fprintf(os.Stderr, "Incorrect Usage: %s\n\n", flagErr.Error()) 55 } 56 57 if found { 58 parse([]string{"help", parser.Active.Name}) 59 } else { 60 switch len(extraArgs) { 61 case 0: 62 parse([]string{"help"}) 63 case 1: 64 parse([]string{"help", extraArgs[0]}) 65 default: 66 parse(extraArgs[1:]) 67 } 68 } 69 70 if flagErr.Type == flags.ErrUnknownFlag || flagErr.Type == flags.ErrExpectedArgument { 71 os.Exit(1) 72 } 73 case flags.ErrRequired: 74 fmt.Fprintf(os.Stderr, "Incorrect Usage: %s\n\n", flagErr.Error()) 75 parse(append([]string{"help"}, args...)) 76 os.Exit(1) 77 case flags.ErrUnknownCommand: 78 cmd.Main(os.Getenv("CF_TRACE"), os.Args) 79 case flags.ErrCommandRequired: 80 if v2.Commands.VerboseOrVersion { 81 parse([]string{"version"}) 82 } else { 83 parse([]string{"help"}) 84 } 85 default: 86 fmt.Fprintf(os.Stderr, "unexpected flag error\ntype: %s\nmessage: %s\n", flagErr.Type, flagErr.Error()) 87 } 88 } else { 89 fmt.Fprintf(os.Stderr, "unexpected error: %s\n", err.Error()) 90 } 91 } 92 93 func myCommandHandler(cmd flags.Commander, args []string) error { 94 config, _ := config.LoadConfig() 95 //defer write config 96 var err error 97 commandUI, err := ui.NewUI(config) 98 if err != nil { 99 return err 100 } 101 102 if extendedCmd, ok := cmd.(commands.ExtendedCommander); ok { 103 err := extendedCmd.Setup(config, commandUI) 104 if err != nil { 105 return err 106 } 107 return extendedCmd.Execute(args) 108 } 109 110 return fmt.Errorf("unable to setup command") 111 }