pub mod cli;
pub mod commands;
pub mod scaffold;
pub mod templates;
use anyhow::Result;
use crate::cli::{Cli, Command, DeployTarget};
pub fn run(cli: Cli) -> Result<()> {
match cli.command {
Command::New { name } => {
let cwd = std::env::current_dir()?;
scaffold::new_project(&cwd, &name)?;
println!("✓ project created at {}/{}", cwd.display(), name);
Ok(())
}
Command::Generate { kind, name } => {
let cwd = std::env::current_dir()?;
scaffold::generate(&cwd, kind, &name)?;
println!("✓ {kind:?} '{name}' generated");
Ok(())
}
Command::Dev => {
require_cargo_subcommand("watch", "cargo install cargo-watch")?;
if !std::path::Path::new("target").exists() {
eprintln!(
"🦀 primeira compilação puxa muitas deps e pode levar 2-3min;\n builds subsequentes são incrementais e bem mais rápidos.\n"
);
}
spawn_status(commands::dev_cargo_command(), "dev")
}
Command::Build { release } => spawn_status(commands::build_cargo_command(release), "build"),
Command::Deploy { target } => match target {
DeployTarget::Lambda { arch } => {
require_cargo_subcommand(
"lambda",
"cargo install cargo-lambda # ou https://www.cargo-lambda.info/guide/installation.html",
)?;
spawn_status(commands::deploy_lambda_cargo_command(arch), "deploy lambda")
}
},
Command::Info => {
println!("{}", commands::info_text());
Ok(())
}
Command::Openapi { out } => spawn_status(commands::openapi_export_command(&out), "openapi"),
}
}
fn require_cargo_subcommand(subcommand: &str, install_hint: &str) -> Result<()> {
let binary = format!("cargo-{subcommand}");
let installed = std::process::Command::new(&binary)
.arg("--version")
.output()
.map(|o| o.status.success())
.unwrap_or(false);
if installed {
return Ok(());
}
anyhow::bail!(
"`cargo {subcommand}` não está disponível (necessário para este comando).\n\
Instale com:\n {install_hint}"
);
}
fn spawn_status(mut cmd: std::process::Command, label: &str) -> Result<()> {
let status = cmd
.status()
.map_err(|e| anyhow::anyhow!("failed to spawn {label}: {e}"))?;
if !status.success() {
anyhow::bail!("{label} failed with status {status}");
}
Ok(())
}