125 lines
3.7 KiB
Python
125 lines
3.7 KiB
Python
import typer
|
|
from rich.console import Console
|
|
from rich.syntax import Syntax
|
|
from .parser import parse_curl_command
|
|
from .generators import LANGUAGE_MAP
|
|
|
|
app = typer.Typer(
|
|
name="curl-to-code",
|
|
help="Convert curl commands to code in various programming languages",
|
|
add_completion=False,
|
|
)
|
|
|
|
console = Console()
|
|
|
|
|
|
def generate_code(curl_command: str, language: str) -> str:
|
|
"""Generate code from curl command for specified language."""
|
|
parsed = parse_curl_command(curl_command)
|
|
generator = LANGUAGE_MAP.get(language, LANGUAGE_MAP["python"])
|
|
return generator(parsed)
|
|
|
|
|
|
@app.command("main")
|
|
def main(
|
|
curl_cmd: str = typer.Argument(
|
|
...,
|
|
help="The curl command to convert (wrap in quotes)",
|
|
),
|
|
language: str = typer.Option(
|
|
"python",
|
|
"--lang",
|
|
"-l",
|
|
help="Target programming language",
|
|
case_sensitive=False,
|
|
),
|
|
no_highlight: bool = typer.Option(
|
|
False,
|
|
"--no-highlight",
|
|
"-n",
|
|
help="Disable syntax highlighting",
|
|
),
|
|
) -> None:
|
|
"""Convert a curl command to code in the specified language."""
|
|
if language.lower() not in LANGUAGE_MAP:
|
|
console.print(f"[red]Error: Unknown language '{language}'[/red]")
|
|
console.print(f"Available languages: {', '.join(LANGUAGE_MAP.keys())}")
|
|
raise typer.Exit(1)
|
|
|
|
try:
|
|
code = generate_code(curl_cmd, language.lower())
|
|
|
|
if no_highlight:
|
|
console.print(code)
|
|
else:
|
|
lang_map = {
|
|
"python": "python",
|
|
"py": "python",
|
|
"javascript": "javascript",
|
|
"js": "javascript",
|
|
"go": "go",
|
|
"rust": "rust",
|
|
"php": "php",
|
|
}
|
|
syntax = Syntax(code, lang_map.get(language.lower(), "text"), theme="monokai")
|
|
console.print(syntax)
|
|
except Exception as e:
|
|
console.print(f"[red]Error parsing curl command: {e}[/red]")
|
|
raise typer.Exit(1)
|
|
|
|
|
|
@app.command("interactive")
|
|
def interactive(
|
|
language: str = typer.Option(
|
|
"python",
|
|
"--lang",
|
|
"-l",
|
|
help="Target programming language",
|
|
case_sensitive=False,
|
|
),
|
|
) -> None:
|
|
"""Enter interactive mode for converting curl commands."""
|
|
console.print("[bold cyan]curl-to-code Interactive Mode[/bold cyan]")
|
|
console.print("Paste your curl command below and press Enter.")
|
|
console.print("Type :q or Ctrl+C to exit.")
|
|
console.print("")
|
|
|
|
while True:
|
|
try:
|
|
user_input = typer.prompt("\nEnter curl command (or :q to quit)")
|
|
|
|
if user_input.strip() in (":q", ":quit", "exit"):
|
|
console.print("Goodbye!")
|
|
break
|
|
|
|
if not user_input.strip():
|
|
continue
|
|
|
|
if language.lower() not in LANGUAGE_MAP:
|
|
console.print(f"[red]Error: Unknown language '{language}'[/red]")
|
|
continue
|
|
|
|
code = generate_code(user_input, language.lower())
|
|
console.print("")
|
|
syntax = Syntax(code, language.lower(), theme="monokai")
|
|
console.print(syntax)
|
|
console.print("\n[dim]---[/dim]")
|
|
|
|
except KeyboardInterrupt:
|
|
console.print("\nGoodbye!")
|
|
break
|
|
except Exception as e:
|
|
console.print(f"[red]Error: {e}[/red]")
|
|
|
|
|
|
@app.command("languages")
|
|
def languages() -> None:
|
|
"""List supported programming languages."""
|
|
console.print("[bold]Supported Languages:[/bold]")
|
|
for lang in LANGUAGE_MAP.keys():
|
|
console.print(f" - {lang}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app()
|