diff --git a/curlconverter/generators/__init__.py b/curlconverter/generators/__init__.py new file mode 100644 index 0000000..98dc048 --- /dev/null +++ b/curlconverter/generators/__init__.py @@ -0,0 +1,64 @@ +"""Code generators for different programming languages.""" + +from abc import ABC, abstractmethod +from typing import Dict, Callable +from curlconverter.parser import ParsedCurl + + +class Generator(ABC): + """Base class for code generators.""" + + @property + @abstractmethod + def language(self) -> str: + """Return the language name.""" + pass + + @abstractmethod + def generate(self, parsed: ParsedCurl) -> str: + """Generate code from parsed curl data.""" + pass + + +_generators: Dict[str, Callable[[ParsedCurl], str]] = {} + + +def register_generator(name: str): + """Decorator to register a generator function.""" + def decorator(func: Callable[[ParsedCurl], str]): + _generators[name.lower()] = func + return func + return decorator + + +def generate_code(parsed: ParsedCurl, language: str) -> str: + """Generate code for the given language.""" + lang = language.lower() + if lang not in _generators: + supported = ", ".join(sorted(_generators.keys())) + raise ValueError(f"Unsupported language: {language}. Supported: {supported}") + return _generators[lang](parsed) + + +def get_supported_languages() -> list: + """Return list of supported language names.""" + return sorted(_generators.keys()) + + +def get_language_display_name(lang: str) -> str: + """Return display name for a language.""" + names = { + "python": "Python (requests)", + "javascript": "JavaScript (fetch)", + "go": "Go (net/http)", + "ruby": "Ruby (Net::HTTP)", + "php": "PHP (cURL)" + } + return names.get(lang.lower(), lang.capitalize()) + + +from curlconverter.generators import python +from curlconverter.generators import javascript +from curlconverter.generators import go +from curlconverter.generators import ruby +from curlconverter.generators import php