diff --git a/errorfix/rules/validator.py b/errorfix/rules/validator.py new file mode 100644 index 0000000..6827af9 --- /dev/null +++ b/errorfix/rules/validator.py @@ -0,0 +1,43 @@ +from typing import Dict, Any, List +import re + + +class RuleValidator: + REQUIRED_FIELDS = ['id', 'name', 'pattern', 'fix', 'description'] + OPTIONAL_FIELDS = ['severity', 'language', 'tool', 'tags', 'priority', 'metadata'] + + def validate(self, data: Dict[str, Any]) -> bool: + missing = [field for field in self.REQUIRED_FIELDS if field not in data] + if missing: + raise ValueError(f"Missing required fields: {', '.join(missing)}") + + for field in data: + if field not in self.REQUIRED_FIELDS + self.OPTIONAL_FIELDS: + raise ValueError(f"Unknown field: {field}") + + self._validate_pattern(data['pattern']) + self._validate_severity(data.get('severity', 'error')) + self._validate_priority(data.get('priority', 0)) + + return True + + def _validate_pattern(self, pattern: str) -> None: + if not isinstance(pattern, str): + raise ValueError("Pattern must be a string") + if not pattern.strip(): + raise ValueError("Pattern cannot be empty") + try: + re.compile(pattern) + except re.error as e: + raise ValueError(f"Invalid regex pattern: {e}") + + def _validate_severity(self, severity: str) -> None: + valid_severities = ['error', 'warning', 'info', 'suggestion'] + if severity not in valid_severities: + raise ValueError(f"Invalid severity: {severity}. Must be one of {valid_severities}") + + def _validate_priority(self, priority: int) -> None: + if not isinstance(priority, int): + raise ValueError("Priority must be an integer") + if priority < 0: + raise ValueError("Priority must be non-negative")