diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2020-05-21 17:26:25 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2020-05-24 08:58:10 +0100 |
commit | bbdb40ac56d67ffb0d5a1cf582fe15740f1283ce (patch) | |
tree | 3c95a5e664732d86841790c7c2ba4786138f3bb6 | |
parent | 6959f556ccfa0ccfd409d36bfa4d40e004de0040 (diff) | |
download | subplot-bbdb40ac56d67ffb0d5a1cf582fe15740f1283ce.tar.gz |
feat: sp-meta now supports json output
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
-rw-r--r-- | src/bin/sp-meta.rs | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/bin/sp-meta.rs b/src/bin/sp-meta.rs index cc4a7bd..49f6173 100644 --- a/src/bin/sp-meta.rs +++ b/src/bin/sp-meta.rs @@ -1,19 +1,43 @@ use anyhow::Result; use std::convert::TryFrom; use std::path::{Path, PathBuf}; +use std::str::FromStr; +use serde::Serialize; use structopt::StructOpt; use subplot::Document; +#[derive(Debug)] +enum OutputFormat { + Plain, + Json, +} + +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)), + } + } +} + #[derive(Debug, StructOpt)] #[structopt(name = "sp-meta", about = "Show Subplot document metadata.")] struct Opt { - // Input filename. + /// Form that you want the output to take + #[structopt(short = "o", default_value = "plain", possible_values=&["plain", "json"])] + output_format: OutputFormat, + /// Input subplot document filename #[structopt(parse(from_os_str))] filename: PathBuf, } +#[derive(Serialize)] struct Metadata { sources: Vec<String>, title: String, @@ -87,7 +111,10 @@ fn main() -> Result<()> { let mut doc = Document::from_file(&basedir, &opt.filename)?; let meta = Metadata::try_from(&mut doc)?; - meta.write_out(); + match opt.output_format { + OutputFormat::Plain => meta.write_out(), + OutputFormat::Json => println!("{}", serde_json::to_string_pretty(&meta)?), + } Ok(()) } |