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