extern crate mazzaroth_xdr;
extern crate pest;
extern crate structopt;
extern crate xdr_rs_serialize;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate handlebars;
#[macro_use]
extern crate pest_derive;
use std::path::PathBuf;
use structopt::StructOpt;
use xdr_rs_serialize::ser::*;
use std::fs::File;
use std::io::{self, Read};
mod ast;
mod generator;
mod schema;
#[derive(Debug, StructOpt)]
#[structopt(name = "xdr-codegen", about = "CLI tool for generating xdr code.")]
struct Opt {
#[structopt(parse(from_os_str))]
input: Vec<PathBuf>,
#[structopt(short = "o", long = "output")]
output: Option<PathBuf>,
#[structopt(short = "l", long = "language")]
language: Option<String>,
}
fn main() -> io::Result<()> {
let mut buffer = String::new();
let stdin = io::stdin();
let opt = Opt::from_args();
match opt.input.len() {
0 => {
let mut handle = stdin.lock();
handle.read_to_string(&mut buffer)?;
}
_ => {
for file in opt.input.iter() {
let mut f = File::open(file)?;
f.read_to_string(&mut buffer)?;
}
}
}
let namespaces = ast::build_namespaces(buffer).unwrap();
if opt.language == Some("schema".to_string()) {
let schem = schema::generate_schema(namespaces).unwrap();
match opt.output {
None => {
println!("{:?}", schem);
}
Some(path) => {
let mut schema_bytes = Vec::new();
schem.write_xdr(&mut schema_bytes).unwrap();
let mut file = File::create(path.to_str().unwrap())?;
file.write_all(&schema_bytes)?;
}
}
return Ok(());
}
let generator: &generator::CodeGenerator = match opt.language {
Some(language) => match language.as_ref() {
"go" => &generator::go::GoGenerator {},
"js" => &generator::js::JsGenerator {},
"rust" => &generator::rust::RustGenerator {},
_ => &generator::go::GoGenerator {},
},
_ => &generator::go::GoGenerator {},
};
let code = generator.code(namespaces).unwrap();
match opt.output {
None => {
println!("{}", code);
}
Some(path) => {
let mut file = File::create(path.to_str().unwrap())?;
file.write_all(code.as_bytes())?;
}
}
Ok(())
}