diff --git a/commands/cli/parse.go b/commands/cli/parse.go index 1f00c3161..c6cb81ae4 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 d2d8725b6..b8aa9c7e5 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