use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
GenerateServer {
#[arg(short, long)]
name: String,
#[arg(short, long, default_value = ".")]
output: String,
},
GenerateClient {
#[arg(short, long)]
name: String,
#[arg(short, long, default_value = ".")]
output: String,
},
GenerateProject {
#[arg(short, long)]
name: String,
#[arg(short, long, default_value = ".")]
output: String,
#[arg(short, long, default_value = "stdio")]
transport: String,
},
RunServer {
#[arg(short, long)]
path: String,
},
Connect {
#[arg(short, long)]
uri: String,
},
Validate {
#[arg(short, long)]
path: String,
},
}
fn main() {
let cli = Cli::parse();
match &cli.command {
Commands::GenerateServer { name, output } => {
println!("Generating server stub '{}' in '{}'", name, output);
let output_path = PathBuf::from(output);
match mcpr::generator::generate_server(name, &output_path) {
Ok(_) => {
println!("Server stub generated successfully!");
}
Err(e) => {
eprintln!("Error generating server stub: {}", e);
std::process::exit(1);
}
}
}
Commands::GenerateClient { name, output } => {
println!("Generating client stub '{}' in '{}'", name, output);
let output_path = PathBuf::from(output);
match mcpr::generator::generate_client(name, &output_path) {
Ok(_) => {
println!("Client stub generated successfully!");
}
Err(e) => {
eprintln!("Error generating client stub: {}", e);
std::process::exit(1);
}
}
}
Commands::GenerateProject {
name,
output,
transport,
} => {
println!(
"Generating complete 'hello mcp' project '{}' in '{}'",
name, output
);
if transport != "stdio" && transport != "sse" {
eprintln!(
"Error: Unsupported transport type: {}. Supported types are 'stdio' and 'sse'.",
transport
);
eprintln!("Note: WebSocket transport is planned but not yet implemented.");
std::process::exit(1);
}
println!("Using transport type: {}", transport);
let output_path = PathBuf::from(output);
match mcpr::generator::generate_project(
name,
output_path.to_str().unwrap_or(output),
transport,
) {
Ok(_) => {
println!("Complete 'hello mcp' project generated successfully!");
}
Err(e) => {
eprintln!("Error generating complete 'hello mcp' project: {}", e);
std::process::exit(1);
}
}
}
Commands::RunServer { path } => {
println!("Running server from '{}'", path);
println!("Server runner not yet implemented");
}
Commands::Connect { uri } => {
println!("Connecting to server at '{}'", uri);
println!("Client connection not yet implemented");
}
Commands::Validate { path } => {
println!("Validating message from '{}'", path);
println!("Message validation not yet implemented");
}
}
}