diff --git a/src/confdoc/parsers/factory.py b/src/confdoc/parsers/factory.py new file mode 100644 index 0000000..2d8202d --- /dev/null +++ b/src/confdoc/parsers/factory.py @@ -0,0 +1,60 @@ +from typing import Dict, Optional, Type +from confdoc.parsers.json_parser import JsonParser +from confdoc.parsers.yaml_parser import YamlParser +from confdoc.parsers.toml_parser import TomlParser + + +class ConfigParserFactory: + """Factory for creating configuration parsers based on format.""" + + def __init__(self): + self._parsers: Dict[str, object] = { + "json": JsonParser(), + "yaml": YamlParser(), + "toml": TomlParser(), + } + self._format_detection = { + ".json": "json", + ".yaml": "yaml", + ".yml": "yaml", + ".toml": "toml", + } + + def get_parser(self, format: Optional[str] = None): + """Get a parser for the specified format.""" + if format is None: + format = "json" + + parser = self._parsers.get(format.lower()) + if parser is None: + raise ValueError(f"Unsupported format: {format}") + + return parser + + def get_parser_for_file(self, file_path: str): + """Detect format from file path and return appropriate parser.""" + import os + ext = os.path.splitext(file_path)[1].lower() + format = self._format_detection.get(ext, "json") + return self.get_parser(format) + + def detect_format(self, content: str) -> str: + """Detect format from content.""" + content = content.strip() + + if content.startswith("{"): + return "json" + elif content.startswith("["): + return "toml" + elif content.startswith("#"): + return "yaml" + elif ":" in content and "=" not in content.split(":")[0]: + return "yaml" + elif "=" in content and not content.startswith("{"): + return "toml" + + return "json" + + def register_parser(self, format: str, parser: object): + """Register a new parser.""" + self._parsers[format] = parser