import CommandLineUtil

REQUIRED = 1
OPTIONAL = 2
ZERO_OR_MORE = 3
ONE_OR_MORE = 4

class Argument:
    def __init__(self,
                 name,
                 description,
                 validationFunc,
                 ):
        self.name = name
        self.description = description
        self.validationFunc = validationFunc


class RequiredArgument(Argument):
    requirements = REQUIRED

    def gen_command_line(self):
        return self.name

    def validate(self,cmd,args):
        #Just the first
        if not len(args):
            raise CommandLineUtil.ArgumentError(cmd,"Missing argument %s" % self.name)
        return self.validationFunc(args[0]),args[1:]

class OptionalArgument(Argument):
    requirements = OPTIONAL

    def gen_command_line(self):
        return "[%s]" % (self.name)

    def validate(self,cmd,args):
        #Just the first, maybe
        if len(args):
            return self.validationFunc(args[0]),args[1:]
        return None,[]


class ZeroOrMoreArgument(Argument):
    requirements = ZERO_OR_MORE

    def gen_command_line(self):
        return "[%s]..." % (self.name)


    def validate(self,cmd,args):
        #We take the rest
        eaten = map(lambda x,f=self.validationFunc:f(x),args)
        return eaten,[]
            

class OneOrMoreArgument(Argument):
    requirements = ONE_OR_MORE
    def gen_command_line(self):
        return "%s [%s]..." % (self.name, self.name)

    def validate(self,cmd,args):
        #We take the rest
        if not len(args):
            raise CommandLineUtil.ArgumentError(cmd,"Missing argument %s" % self.name)
        eaten = map(lambda x,f=self.validationFunc:f(x),args)
        return eaten,[]


        
##        for cur_arg in cmd_args:
##            if cur_arg[2] == '.':
##                #A required arg
##                if not len(cl_args):
##                resArgs[cur_arg[0]] = self._translate_args(cur_arg[3],cur_arg[0],[cl_args[0]])[0]
##                cl_args = cl_args[1:]
##            elif cur_arg[2] == '?':
##                if len(cl_args):
##                    resArgs[cur_arg[0]] = self._translate_args(cur_arg[3],cur_arg[0],[cl_args[0]])[0]
##                    cl_args = cl_args[1:]
##            elif cur_arg[2] == '+':
##                if not len(cl_args):
##                    raise ArgumentError("Missing argument %s" % cur_arg[0])
##                resArgs[cur_arg[0]] = self._translate_args(cur_arg[3],cur_arg[0],cl_args)
##                cl_args = []
                
##            elif cur_arg[2] == '*':
##                resArgs[cur_arg[0]] = self._translate_args(cur_arg[3],cur_arg[0],cl_args)
##                cl_args = []
##        command[2] = resArgs
##        return 1


##    def _translate_args(self,func,name,args):
##        res = []
##        for arg in args:
##            try:
##                res.append(func(arg))
##            except:
##                #import traceback
##                #traceback.print_exc()
##                raise ArgumentError('failed conversion for %s (%s)' % (arg, name))
##        return res
