diff --git a/src/frontmatter.rs b/src/frontmatter.rs index 8eee497..22c73a4 100644 --- a/src/frontmatter.rs +++ b/src/frontmatter.rs @@ -43,6 +43,12 @@ impl<'a> Frontmatter { pub fn get(&self, key: String) -> Option<&yaml::Value> { self.map.get(&key) } + pub fn extend(&mut self, iter: T) + where + T: IntoIterator, + { + self.map.extend(iter) + } pub fn insert_ast(&self, ast: &'a AstNode<'a>) { if let NodeValue::FrontMatter(ref mut f) = &mut ast.data.borrow_mut().value { *f = self.to_string(); @@ -52,6 +58,9 @@ impl<'a> Frontmatter { } } } + pub fn to_value(&self) -> Result { + yaml::to_value(&self.map) + } } impl<'a> TryFrom<&'a AstNode<'a>> for Frontmatter { diff --git a/src/main.rs b/src/main.rs index b49defc..70330f6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use std::cell::RefCell; +use std::collections::HashMap; use std::io::Write; use std::path::PathBuf; @@ -50,6 +51,14 @@ enum FrontmatterCommands { #[arg(short = 'j', long, action = ArgAction::SetTrue)] to_json: bool, }, + Insert { + #[clap()] + value: String, + }, + Extract { + #[arg(short = 'j', long, action = ArgAction::SetTrue)] + to_json: bool, + }, } #[derive(Debug, Subcommand)] @@ -186,6 +195,62 @@ fn main() { Err(err) => cli::ResultType::Err(err), } } + FrontmatterCommands::Insert { value } => { + match serde_yaml::from_str::>(value) { + Ok(value) => { + frontmatter.extend(value); + frontmatter.insert_ast(ast); + cli::ResultType::Markdown(ast) + } + Err(err) => cli::ResultType::Err(cli::Error { + code: cli::ErrorCode::EPRSG, + description: format!( + "Error parsing input value to yaml file:\n{:#?}", + err + ), + fix: None, + url: None, + }), + } + } + FrontmatterCommands::Extract { to_json } => match frontmatter.to_value() { + Ok(value) => { + let result = if *to_json { + serde_json::to_string(&value).map_err(|err| cli::Error { + code: cli::ErrorCode::EPRSG, + description: format!( + "Failed to parse frontmatter value to yaml string\n{:#?}", + err + ), + fix: None, + url: None, + }) + } else { + serde_yaml::to_string(&value).map_err(|err| cli::Error { + code: cli::ErrorCode::EPRSG, + description: format!( + "Failed to parse frontmatter value to yaml string\n{:#?}", + err + ), + fix: None, + url: None, + }) + }; + match result { + Ok(s) => cli::ResultType::String(s), + Err(err) => cli::ResultType::Err(err), + } + } + Err(err) => cli::ResultType::Err(cli::Error { + code: cli::ErrorCode::EPRSG, + description: format!( + "Error parsing Markdown to yaml file:\n{:#?}", + err + ), + fix: None, + url: None, + }), + }, }, Err(err) => cli::ResultType::Err(cli::Error { code: cli::ErrorCode::EPRSG,