import re

class validator(object):
    def validate(self, value):
        return value


class mandatory(validator):
    def validate(self, value):
        if not value:
            raise ValueError('field is mandatory')
        return value


class minsize(validator):
    def __init__(self, minsize):
        self.minsize = minsize

    def validate(self, value):
        if value is None:
            return
        value = value.strip()
        if len(value) < self.minsize:
            raise ValueError('field should contain at least %s characters' % (
                              self.minsize,))
        return value


class id(validator):
    def __init__(self):
        import string
        self.allowedchars = string.ascii_letters
        self.nonstart = '_.' + string.digits

    def validate(self, value):
        if not value:
            return value
        assert isinstance(value, str) or isinstance(value, unicode)
        value = value.strip()
        if value[0] in self.allowedchars:
            for char in value[1:]:
                if char not in self.allowedchars and char not in self.nonstart:
                    break
            else:
                return value
        raise ValueError(
            'should contain only legal characters (uppercase and '
            'lowercase characters, . and _)')


class regvalidator(validator):
    def __init__(self, reg, msg):
        self.reg = reg
        self.msg = msg

    def validate(self, value):
        if not value:
            return value
        value = value.strip()
        if not self.reg.match(value):
            raise ValueError(self.msg)
        return value


class email(regvalidator):
    def __init__(self):
        # we're rather relaxed here, rather not have false positives :|
        self.reg = re.compile(r'^[\w.]+@[\w.]+\.\w{2,}$', re.U)
        self.msg = 'is not an email address'

