diff options
Diffstat (limited to 'src/bin/sp-meta.rs')
-rw-r--r-- | src/bin/sp-meta.rs | 115 |
1 files changed, 5 insertions, 110 deletions
diff --git a/src/bin/sp-meta.rs b/src/bin/sp-meta.rs index c633c59..b907999 100644 --- a/src/bin/sp-meta.rs +++ b/src/bin/sp-meta.rs @@ -1,30 +1,14 @@ use anyhow::Result; use std::convert::TryFrom; -use std::path::{Path, PathBuf}; -use std::str::FromStr; +use std::path::PathBuf; -use serde::Serialize; use structopt::StructOpt; -use subplot::{Document, Style}; +use subplot::Style; -#[derive(Debug)] -enum OutputFormat { - Plain, - Json, -} +mod cli; -impl FromStr for OutputFormat { - type Err = String; - - fn from_str(s: &str) -> std::result::Result<Self, Self::Err> { - match s.to_ascii_lowercase().as_ref() { - "plain" => Ok(OutputFormat::Plain), - "json" => Ok(OutputFormat::Json), - _ => Err(format!("Unknown output format: `{}`", s)), - } - } -} +use cli::{Metadata, OutputFormat}; #[derive(Debug, StructOpt)] #[structopt(name = "sp-meta", about = "Show Subplot document metadata.")] @@ -37,87 +21,9 @@ struct Opt { filename: PathBuf, } -#[derive(Serialize)] -struct Metadata { - sources: Vec<String>, - title: String, - binding_files: Vec<String>, - function_files: Vec<String>, - bibliographies: Vec<String>, - scenarios: Vec<String>, - files: Vec<String>, -} - -impl TryFrom<&mut Document> for Metadata { - type Error = subplot::SubplotError; - fn try_from(doc: &mut Document) -> std::result::Result<Self, Self::Error> { - let sources: Vec<_> = doc - .sources() - .into_iter() - .map(|p| filename(Some(&p))) - .collect(); - let title = doc.meta().title().to_owned(); - let binding_files = doc - .meta() - .bindings_filenames() - .into_iter() - .map(|p| filename(Some(&p))) - .collect(); - let function_files = doc - .meta() - .functions_filenames() - .into_iter() - .map(|p| filename(Some(&p))) - .collect(); - let bibliographies = doc - .meta() - .bibliographies() - .into_iter() - .map(|p| filename(Some(&p))) - .collect(); - let scenarios = doc - .scenarios()? - .into_iter() - .map(|s| s.title().to_owned()) - .collect(); - let files = doc - .files() - .iter() - .map(|f| f.filename().to_owned()) - .collect(); - Ok(Self { - sources, - title, - binding_files, - function_files, - bibliographies, - scenarios, - files, - }) - } -} - -impl Metadata { - fn write_list(v: &[String], prefix: &str) { - v.iter().for_each(|entry| println!("{}: {}", prefix, entry)) - } - - fn write_out(&self) { - Self::write_list(&self.sources, "source"); - println!("title: {}", self.title); - Self::write_list(&self.binding_files, "bindings"); - Self::write_list(&self.function_files, "functions"); - Self::write_list(&self.bibliographies, "bibliography"); - Self::write_list(&self.files, "file"); - Self::write_list(&self.scenarios, "scenario"); - } -} - fn main() -> Result<()> { let opt = Opt::from_args(); - let basedir = subplot::get_basedir_from(&opt.filename)?; - let style = Style::default(); - let mut doc = Document::from_file(&basedir, &opt.filename, style)?; + let mut doc = cli::load_document(&opt.filename, Style::default())?; let meta = Metadata::try_from(&mut doc)?; match opt.output_format { @@ -127,14 +33,3 @@ fn main() -> Result<()> { Ok(()) } - -fn filename(name: Option<&Path>) -> String { - let path = match name { - None => return "".to_string(), - Some(x) => x, - }; - match path.to_str() { - None => "non-UTF8 filename".to_string(), - Some(x) => x.to_string(), - } -} |