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  }