From bbdb40ac56d67ffb0d5a1cf582fe15740f1283ce Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Thu, 21 May 2020 17:26:25 +0100 Subject: feat: sp-meta now supports json output Signed-off-by: Daniel Silverstone --- src/bin/sp-meta.rs | 31 +++++++++++++++++++++++++++++-- 1 file 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 { + 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, 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(()) } -- cgit v1.2.1