import re from typing import Optional from dataclasses import dataclass, field from .Attribute import Attribute @dataclass class textAttribute(Attribute): """Class for text attributes.""" regex: Optional[str] = None min_length: Optional[int] = None max_length: Optional[int] = 50 allowed_chars: Optional[str] = None def __post_init__(self): """Post-initialization to set the HTML input type.""" self.html_input_type = "text" self.valid_comparisons = {"lt", "st", "eq", "ne"}, # longer than, shorter than, eq, or not eq, to the ref attrib def validate(self) -> Optional[str]: """Validate text-specific attributes.""" error = super().validate() if error: return error if self.min_length is not None and self.max_length is not None: if not isinstance(self.min_length, int) or not isinstance(self.max_length, int): return f"Min and max lengths must be integers for '{self.attrib_name}'." if int(self.min_length) > int(self.max_length): return f"Max length must be greater than min length for '{self.attrib_name}'." if self.default_val is not None: if self.regex is not None: compiled_regex = re.compile(self.regex) if not compiled_regex.match(str(self.default_val)): return f"Default value for '{self.attrib_name}' must match the pattern: {self.regex}" if self.allowed_chars is not None: for char in self.default_val: if char not in self.allowed_chars: return f"Invalid character '{char}' in default value for '{self.attrib_name}'. Allowed characters are: {self.allowed_chars}" if self.min_length is not None: if len(self.default_val) < int(self.min_length): return f"Invalid default value for '{self.attrib_name}'. The minimum length is: {self.min_length}" if self.max_length is not None: if len(self.default_val) > int(self.max_length): return f"Invalid default value for '{self.attrib_name}'. The maximum length is: {self.max_length}" return None