summaryrefslogtreecommitdiff
path: root/src/bin/sp-extract.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/sp-extract.rs')
-rw-r--r--src/bin/sp-extract.rs46
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())
+}