use clap::Parser;
use std::path::PathBuf;
use trillium_grpc_codegen::{Options, generate_from_proto};
#[derive(Parser, Debug)]
pub struct GrpcCli {
proto: PathBuf,
#[arg(default_value = "./src")]
out: PathBuf,
#[arg(short = 'I', long = "include")]
includes: Vec<PathBuf>,
}
impl GrpcCli {
pub fn run(self) {
let mut includes = self.includes;
if let Some(parent) = self.proto.parent()
&& !parent.as_os_str().is_empty()
&& !includes.iter().any(|p| p == parent)
{
includes.push(parent.to_path_buf());
}
let opts = Options {
include_paths: includes,
..Options::default()
};
let generated = match generate_from_proto(&[&self.proto], &opts) {
Ok(g) => g,
Err(e) => {
eprintln!("codegen failed: {e}");
std::process::exit(1);
}
};
if let Err(e) = std::fs::create_dir_all(&self.out) {
eprintln!(
"could not create output directory {}: {e}",
self.out.display()
);
std::process::exit(1);
}
for (rel_path, content) in &generated.files {
let path = self.out.join(rel_path);
if let Err(e) = std::fs::write(&path, content) {
eprintln!("could not write {}: {e}", path.display());
std::process::exit(1);
}
println!("wrote {}", path.display());
}
}
}