// value accessor methods, gets the value as a certain type func (ov OptionValue) Bool() (value bool, found bool, err error) { if !ov.found { return false, false, nil } val, ok := ov.value.(bool) if !ok { err = util.ErrCast() } return val, ov.found, err }
func (ov OptionValue) String() (value string, found bool, err error) { if !ov.found { return "", false, nil } val, ok := ov.value.(string) if !ok { err = util.ErrCast() } return val, ov.found, err }
func (ov OptionValue) Float() (value float64, found bool, err error) { if !ov.found { return 0, false, nil } val, ok := ov.value.(float64) if !ok { err = util.ErrCast() } return val, ov.found, err }
func (ov OptionValue) Uint() (value uint, found bool, err error) { if !ov.found { return 0, false, nil } val, ok := ov.value.(uint) if !ok { err = util.ErrCast() } return val, ov.found, err }
func (r *request) ConvertOptions() error { for k, v := range r.options { opt, ok := r.optionDefs[k] if !ok { continue } kind := reflect.TypeOf(v).Kind() if kind != opt.Type() { if kind == String { convert := converters[opt.Type()] str, ok := v.(string) if !ok { return util.ErrCast() } val, err := convert(str) if err != nil { value := fmt.Sprintf("value '%v'", v) if len(str) == 0 { value = "empty value" } return fmt.Errorf("Could not convert %s to type '%s' (for option '-%s')", value, opt.Type().String(), k) } r.options[k] = val } else { return fmt.Errorf("Option '%s' should be type '%s', but got type '%s'", k, opt.Type().String(), kind.String()) } } else { r.options[k] = v } for _, name := range opt.Names() { if _, ok := r.options[name]; name != k && ok { return fmt.Errorf("Duplicate command options were provided ('%s' and '%s')", k, name) } } } return nil }
// Parse parses the input commandline string (cmd, flags, and args). // returns the corresponding command Request object. func Parse(input []string, stdin *os.File, root *cmds.Command) (cmds.Request, *cmds.Command, []string, error) { path, opts, stringVals, cmd, err := parseOpts(input, root) if err != nil { return nil, nil, path, err } optDefs, err := root.GetOptions(path) if err != nil { return nil, cmd, path, err } req, err := cmds.NewRequest(path, opts, nil, nil, cmd, optDefs) if err != nil { return nil, cmd, path, err } // if -r is provided, and it is associated with the package builtin // recursive path option, allow recursive file paths recursiveOpt := req.Option(cmds.RecShort) recursive := false if recursiveOpt != nil && recursiveOpt.Definition() == cmds.OptionRecursivePath { recursive, _, err = recursiveOpt.Bool() if err != nil { return req, nil, nil, util.ErrCast() } } stringArgs, fileArgs, err := parseArgs(stringVals, stdin, cmd.Arguments, recursive, root) if err != nil { return req, cmd, path, err } req.SetArguments(stringArgs) file := files.NewSliceFile("", "", fileArgs) req.SetFiles(file) err = cmd.CheckArguments(req) if err != nil { return req, cmd, path, err } return req, cmd, path, nil }