use clap::{Parser, Subcommand};
use cuda_rust_wasm::transpiler::CudaTranspiler;
use std::fs;
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "cuda2rust")]
#[command(about = "CUDA to Rust/WASM transpiler")]
#[command(version = "0.1.0")]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Transpile {
#[arg(short, long)]
input: PathBuf,
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(long)]
optimize: bool,
#[arg(long)]
detect_patterns: bool,
#[arg(short, long)]
verbose: bool,
},
GenerateWgsl {
#[arg(short, long)]
input: PathBuf,
#[arg(short, long)]
output: Option<PathBuf>,
},
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli = Cli::parse();
match cli.command {
Commands::Transpile { input, output, optimize, detect_patterns, verbose } => {
if verbose {
env_logger::init();
}
let cuda_source = fs::read_to_string(&input)?;
let transpiler = CudaTranspiler::new();
let rust_code = transpiler.transpile(&cuda_source, optimize, detect_patterns)?;
if let Some(output_path) = output {
fs::write(&output_path, rust_code)?;
println!("Transpiled CUDA to Rust: {} -> {}", input.display(), output_path.display());
} else {
println!("{rust_code}");
}
}
Commands::GenerateWgsl { input, output } => {
let cuda_source = fs::read_to_string(&input)?;
let transpiler = CudaTranspiler::new();
let wgsl_code = transpiler.generate_wgsl(&cuda_source)?;
if let Some(output_path) = output {
fs::write(&output_path, wgsl_code)?;
println!("Generated WGSL shader: {} -> {}", input.display(), output_path.display());
} else {
println!("{wgsl_code}");
}
}
}
Ok(())
}