diff --git a/commands/cli/parse.go b/commands/cli/parse.go index 1f00c31618883976d65fa60095db91ede5d9f5e0..c6cb81ae411a47554444e5ea6e7185ce0f29661f 100644 --- a/commands/cli/parse.go +++ b/commands/cli/parse.go @@ -248,6 +248,13 @@ func parseArgs(inputs []string, stdin *os.File, argDefs []cmds.Argument, recursi argDefIndex++ } + // check to make sure we didn't miss any required arguments + for _, argDef := range argDefs[argDefIndex:] { + if argDef.Required { + return nil, nil, fmt.Errorf("Argument '%s' is required", argDef.Name) + } + } + return stringArgs, fileArgs, nil } diff --git a/commands/http/parse.go b/commands/http/parse.go index d2d8725b675b9fb0d9bdaa7dde700044094e8dec..b8aa9c7e5eabd1baa74b8ef5a93cb4a4c064632f 100644 --- a/commands/http/parse.go +++ b/commands/http/parse.go @@ -2,6 +2,7 @@ package http import ( "errors" + "fmt" "mime" "net/http" "strings" @@ -54,6 +55,7 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) { args := make([]string, valCount) valIndex := 0 + requiredFile := "" for _, argDef := range cmd.Arguments { // skip optional argument definitions if there aren't sufficient remaining values if valCount-valIndex <= numRequired && !argDef.Required { @@ -78,6 +80,8 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) { } else { break } + } else if argDef.Type == cmds.ArgFile && argDef.Required && len(requiredFile) == 0 { + requiredFile = argDef.Name } } @@ -101,6 +105,11 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) { } } + // if there is a required filearg, error if no files were provided + if len(requiredFile) > 0 && f == nil { + return nil, fmt.Errorf("File argument '%s' is required", requiredFile) + } + req, err := cmds.NewRequest(path, opts, args, f, cmd, optDefs) if err != nil { return nil, err