use std::collections::BTreeMap;
use carta_ast::MetaValue;
use carta_core::{ReaderOptions, Result, presets};
fn scalar_options() -> ReaderOptions {
let mut options = ReaderOptions::default();
options.extensions = presets::MARKDOWN;
options.greedy_paragraphs = true;
options
}
pub fn parse_json(content: &str) -> Result<BTreeMap<String, MetaValue>> {
crate::commonmark::parse_metadata_json(content, &scalar_options())
}
pub fn parse_yaml(content: &str) -> Result<BTreeMap<String, MetaValue>> {
crate::commonmark::parse_metadata_yaml(content, &scalar_options())
}
#[cfg(test)]
mod tests {
use super::{parse_json, parse_yaml};
use carta_ast::{Inline, MetaValue};
fn emph(text: &str) -> MetaValue {
MetaValue::MetaInlines(vec![Inline::Emph(vec![Inline::Str(
text.to_owned().into(),
)])])
}
#[test]
fn yaml_scalar_is_parsed_as_inline_markdown() {
let meta = parse_yaml("title: \"*Hi*\"\n").expect("valid yaml");
assert_eq!(meta.get("title"), Some(&emph("Hi")));
}
#[test]
fn yaml_that_is_not_a_mapping_yields_no_metadata() {
assert!(
parse_yaml("- just\n- a list\n")
.expect("valid yaml")
.is_empty()
);
}
#[test]
fn json_object_keeps_typed_scalars_and_parses_strings_as_markdown() {
let meta = parse_json(r#"{"draft": true, "title": "*Hi*"}"#).expect("valid json");
assert_eq!(meta.get("draft"), Some(&MetaValue::MetaBool(true)));
assert_eq!(meta.get("title"), Some(&emph("Hi")));
}
#[test]
fn a_json_metadata_file_must_be_an_object() {
assert!(parse_json("[1, 2, 3]").is_err());
}
}