diff options
Diffstat (limited to 'src/bin/sp-extract.rs')
-rw-r--r-- | src/bin/sp-extract.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/bin/sp-extract.rs b/src/bin/sp-extract.rs new file mode 100644 index 0000000..d63fa0a --- /dev/null +++ b/src/bin/sp-extract.rs @@ -0,0 +1,46 @@ +use anyhow::Result; +use std::fs::write; +use std::path::PathBuf; + +use structopt::StructOpt; + +use subplot::{DataFile, Document, SubplotError}; + +#[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<String>, + + // Set output directory. + #[structopt(name = "DIR", long = "--directory", short = "-o", parse(from_os_str))] + directory: PathBuf, +} + +fn main() -> Result<()> { + let opt = Opt::from_args(); + let basedir = subplot::get_basedir_from(&opt.filename)?; + let doc = Document::from_file(&basedir, &opt.filename)?; + + 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()) +} |