diff --git a/src/http_convert/generators.py b/src/http_convert/generators.py new file mode 100644 index 0000000..ec375a9 --- /dev/null +++ b/src/http_convert/generators.py @@ -0,0 +1,134 @@ +import json +from typing import Dict, Optional +from .models import HTTPRequest, OutputFormat + + +class CurlGenerator: + @staticmethod + def generate(request: HTTPRequest, compact: bool = False) -> str: + parts = ["curl"] + + if request.method.value != "GET": + parts.append(f"-X {request.method.value}") + + for key, value in request.headers.items(): + parts.append(f"-H '{key}: {value}'") + + final_url = request.get_final_url() + parts.append(f"'{final_url}'") + + if request.body: + parts.append(f"-d '{request.body}'") + elif request.body_json: + json_body = json.dumps(request.body_json) + parts.append(f"-d '{json_body}'") + + if compact: + return " ".join(parts) + else: + return " \\\n ".join(parts) + + @staticmethod + def generate_multiline(request: HTTPRequest) -> str: + return CurlGenerator.generate(request, compact=False) + + +class HTTPieGenerator: + @staticmethod + def generate(request: HTTPRequest, compact: bool = False) -> str: + parts = [] + + parts.append(f"{request.method.value} {request.url}") + + for key, value in request.headers.items(): + parts.append(f"'{key}:{value}'") + + for key, value in request.params.items(): + parts.append(f"{key}=={value}") + + if request.body: + parts.append(f"'{request.body}'") + elif request.body_json: + json_body = json.dumps(request.body_json) + parts.append(f"'{json_body}'") + + if compact: + return " ".join(parts) + else: + return " \\\n ".join(parts) + + +class FetchGenerator: + @staticmethod + def generate(request: HTTPRequest, compact: bool = False) -> str: + headers = "" + for key, value in request.headers.items(): + headers += f" {key}: '{value}',\n" + headers = headers.rstrip(",\n") + + body = "" + if request.body: + body = f"\n body: JSON.stringify({json.dumps(request.body)})," + elif request.body_json: + body = f"\n body: JSON.stringify({json.dumps(request.body_json)})," + + options = f"""{{ + method: '{request.method.value}',{body} + headers: {{ + {headers} + }} +}}""" + + result = f"fetch('{request.get_final_url()}',\n {options}\n)" + + if compact: + result = result.replace("\n", " ").replace(" ", " ") + + return result + + +class AxiosGenerator: + @staticmethod + def generate(request: HTTPRequest, compact: bool = False) -> str: + headers = "" + for key, value in request.headers.items(): + headers += f" {key}: '{value}',\n" + headers = headers.rstrip(",\n") + + data = "" + if request.body_json: + data = f"\n data: {json.dumps(request.body_json)}," + elif request.body: + data = f"\n data: {json.dumps(request.body)}," + + options = f"""{{ + method: '{request.method.value}', + url: '{request.url}',{data} + headers: {{ + {headers} + }} +}}""" + + result = f"axios({options})" + + if compact: + result = result.replace("\n", " ").replace(" ", " ") + + return result + + +class Generator: + @staticmethod + def generate(request: HTTPRequest, format: OutputFormat, compact: bool = False) -> str: + format_str = format.value if hasattr(format, 'value') else format + + if format_str == "curl": + return CurlGenerator.generate(request, compact) + elif format_str == "httpie": + return HTTPieGenerator.generate(request, compact) + elif format_str == "fetch": + return FetchGenerator.generate(request, compact) + elif format_str == "axios": + return AxiosGenerator.generate(request, compact) + else: + raise ValueError(f"Unsupported format: {format}")