use std::path::{Path, PathBuf}; use std::process::Command; use anyhow::Result; use structopt::StructOpt; use subplot::{generate_test_program, resource, template_spec, Style, SubplotError, TemplateSpec}; mod cli; fn main() -> Result<()> { let opt = Opt::from_args(); opt.resources.handle(); let mut doc = cli::load_document(&opt.filename, Style::default())?; doc.lint()?; if !doc.check_named_files_exist()? { eprintln!("Unable to continue"); std::process::exit(1); } let spec = template_spec(&doc)?; generate_test_program(&mut doc, &spec, &opt.output)?; if opt.run && !run(&spec, &opt.output)? { eprintln!("Test program failed."); std::process::exit(1); } Ok(()) } // Define the command line arguments. #[derive(Debug, StructOpt)] #[structopt(name = "codegen", about = "Subplot code generator.")] struct Opt { // Input filename. #[structopt(parse(from_os_str))] filename: PathBuf, // Write generated test program to this file. #[structopt( long, short, parse(from_os_str), help = "Writes generated test program to FILE" )] output: PathBuf, // Run the generated test program after writing it? #[structopt(long, short, help = "Runs generated test program")] run: bool, #[structopt(flatten)] resources: resource::ResourceOpts, } fn run(spec: &TemplateSpec, filename: &Path) -> subplot::Result { let run = match spec.run() { None => return Err(SubplotError::TemplateNoRun), Some(x) => x, }; let status = Command::new(run).arg(filename).status()?; Ok(status.success()) }