summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2020-05-21 17:26:25 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2020-05-24 08:58:10 +0100
commitbbdb40ac56d67ffb0d5a1cf582fe15740f1283ce (patch)
tree3c95a5e664732d86841790c7c2ba4786138f3bb6
parent6959f556ccfa0ccfd409d36bfa4d40e004de0040 (diff)
downloadsubplot-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.rs31
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(())
}