// Copyright 2013-2023 The Cobra Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package cobra

import (
	
	
)

type PositionalArgs func(cmd *Command, args []string) error

// legacyArgs validation has the following behaviour:
// - root commands with no subcommands can take arbitrary arguments
// - root commands with subcommands will do subcommand validity checking
// - subcommands will always accept arbitrary arguments
func legacyArgs( *Command,  []string) error {
	// no subcommand, always take args
	if !.HasSubCommands() {
		return nil
	}

	// root command with subcommands, do subcommand checking.
	if !.HasParent() && len() > 0 {
		return fmt.Errorf("unknown command %q for %q%s", [0], .CommandPath(), .findSuggestions([0]))
	}
	return nil
}

// NoArgs returns an error if any args are included.
func ( *Command,  []string) error {
	if len() > 0 {
		return fmt.Errorf("unknown command %q for %q", [0], .CommandPath())
	}
	return nil
}

// OnlyValidArgs returns an error if there are any positional args that are not in
// the `ValidArgs` field of `Command`
func ( *Command,  []string) error {
	if len(.ValidArgs) > 0 {
		// Remove any description that may be included in ValidArgs.
		// A description is following a tab character.
		 := make([]string, 0, len(.ValidArgs))
		for ,  := range .ValidArgs {
			 = append(, strings.SplitN(, "\t", 2)[0])
		}
		for ,  := range  {
			if !stringInSlice(, ) {
				return fmt.Errorf("invalid argument %q for %q%s", , .CommandPath(), .findSuggestions([0]))
			}
		}
	}
	return nil
}

// ArbitraryArgs never returns an error.
func ( *Command,  []string) error {
	return nil
}

// MinimumNArgs returns an error if there is not at least N args.
func ( int) PositionalArgs {
	return func( *Command,  []string) error {
		if len() <  {
			return fmt.Errorf("requires at least %d arg(s), only received %d", , len())
		}
		return nil
	}
}

// MaximumNArgs returns an error if there are more than N args.
func ( int) PositionalArgs {
	return func( *Command,  []string) error {
		if len() >  {
			return fmt.Errorf("accepts at most %d arg(s), received %d", , len())
		}
		return nil
	}
}

// ExactArgs returns an error if there are not exactly n args.
func ( int) PositionalArgs {
	return func( *Command,  []string) error {
		if len() !=  {
			return fmt.Errorf("accepts %d arg(s), received %d", , len())
		}
		return nil
	}
}

// RangeArgs returns an error if the number of args is not within the expected range.
func ( int,  int) PositionalArgs {
	return func( *Command,  []string) error {
		if len() <  || len() >  {
			return fmt.Errorf("accepts between %d and %d arg(s), received %d", , , len())
		}
		return nil
	}
}

// MatchAll allows combining several PositionalArgs to work in concert.
func ( ...PositionalArgs) PositionalArgs {
	return func( *Command,  []string) error {
		for ,  := range  {
			if  := (, );  != nil {
				return 
			}
		}
		return nil
	}
}

// ExactValidArgs returns an error if there are not exactly N positional args OR
// there are any positional args that are not in the `ValidArgs` field of `Command`
//
// Deprecated: use MatchAll(ExactArgs(n), OnlyValidArgs) instead
func ( int) PositionalArgs {
	return MatchAll(ExactArgs(), OnlyValidArgs)
}