use anyhow::Result; use std::fs::write; use std::path::PathBuf; use structopt::StructOpt; use subplot::{DataFile, Document, Style, SubplotError}; mod cli; #[derive(Debug, StructOpt)] #[structopt(name = "sp-meta", about = "Show Subplot document metadata.")] struct Opt { /// Input subplot document filename #[structopt(parse(from_os_str))] filename: PathBuf, /// Names of embedded files to be extracted. #[structopt()] embedded: Vec, // Set output directory. #[structopt(name = "DIR", long = "--directory", short = "-d", parse(from_os_str))] directory: PathBuf, } fn main() -> Result<()> { let opt = Opt::from_args(); let doc = cli::load_document(&opt.filename, Style::default())?; for filename in opt.embedded { let file = get_embedded(&doc, &filename)?; let output = opt.directory.join(filename); write(output, file.contents())?; } Ok(()) } fn get_embedded<'a>(doc: &'a Document, filename: &str) -> Result<&'a DataFile> { for file in doc.files() { if file.filename() == filename { return Ok(file); } } Err(SubplotError::EmbeddedFileNotFound(filename.to_owned()).into()) }