65 lines
1.8 KiB
Python
65 lines
1.8 KiB
Python
"""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
|