#[cfg(feature = "cli")]
mod cli;
#[cfg(feature = "cli")]
use anyhow::Result;
#[cfg(feature = "cli")]
use clap::{Parser, Subcommand};
#[cfg(feature = "cli")]
use std::collections::HashMap;
#[cfg(feature = "cli")]
#[derive(Parser)]
#[command(name = "sdforge")]
#[command(about = "Command-line tool for the SDForge framework", long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[cfg(feature = "cli")]
fn validate_protocol(protocol: &str) -> Result<String, String> {
match protocol {
"http" | "mcp" | "both" => Ok(protocol.to_string()),
_ => Err("Protocol must be 'http', 'mcp', or 'both'".to_string()),
}
}
#[cfg(feature = "cli")]
fn validate_template(template: &str) -> Result<String, String> {
match template {
"basic" | "full" => Ok(template.to_string()),
_ => Err("Template must be 'basic' or 'full'".to_string()),
}
}
#[cfg(feature = "cli")]
#[derive(Subcommand)]
enum Commands {
New {
name: String,
#[arg(long, default_value = "http", value_parser = validate_protocol)]
protocol: String,
#[arg(long)]
features: Option<String>,
#[arg(long, default_value = "basic", value_parser = validate_template)]
template: String,
},
Init {
#[arg(long, default_value = "http", value_parser = validate_protocol)]
protocol: String,
#[arg(long)]
features: Option<String>,
},
Generate {
template: String,
#[arg(long)]
output: Option<String>,
},
}
#[cfg(feature = "cli")]
fn main() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Commands::New {
name,
protocol,
features,
template,
} => {
let features_str = features.unwrap_or_default();
cli::generator::generate_project(&name, &protocol, &features_str, &template)?;
}
Commands::Init { protocol, features } => {
let features_str = features.unwrap_or_default();
let current_dir = std::env::current_dir()?;
let project_name = current_dir
.file_name()
.and_then(|n| n.to_str())
.ok_or_else(|| anyhow::anyhow!("Cannot determine current directory name"))?;
cli::generator::generate_project(project_name, &protocol, &features_str, "full")?;
}
Commands::Generate { template, output } => {
let output_path = output.as_deref();
let context = HashMap::new();
cli::generator::generate_from_template(&template, output_path, context)?;
}
}
Ok(())
}
#[cfg(not(feature = "cli"))]
fn main() {
eprintln!("Error: CLI feature is not enabled.");
eprintln!("To use the SDForge CLI, enable the `cli` feature:");
eprintln!(" cargo build --features cli");
eprintln!(" cargo run --features cli -- --help");
std::process::exit(1);
}