use frontmatter_gen::{
error::Error,
parser::{parse, to_string},
Format, Frontmatter, Value,
};
pub fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("\n๐งช FrontMatterGen Parser Examples\n");
parse_yaml_example()?;
parse_toml_example()?;
parse_json_example()?;
serialize_to_yaml_example()?;
serialize_to_toml_example()?;
serialize_to_json_example()?;
#[cfg(feature = "ssg")]
ssg_parser_examples()?;
println!("\n๐ All parser examples completed successfully!");
Ok(())
}
fn parse_yaml_example() -> Result<(), Error> {
println!("๐ฆ YAML Parsing Example");
println!("---------------------------------------------");
let yaml_content = "title: My Post\ndate: 2025-09-09\n";
let frontmatter = parse(yaml_content, Format::Yaml)?;
println!(" โ
Parsed frontmatter: {:?}", frontmatter);
assert_eq!(
frontmatter.get("title").unwrap().as_str().unwrap(),
"My Post"
);
Ok(())
}
fn parse_toml_example() -> Result<(), Error> {
println!("\n๐ฆ TOML Parsing Example");
println!("---------------------------------------------");
let toml_content = "title = \"My Post\"\ndate = 2025-09-09\n";
let frontmatter = parse(toml_content, Format::Toml)?;
println!(" โ
Parsed frontmatter: {:?}", frontmatter);
assert_eq!(
frontmatter.get("title").unwrap().as_str().unwrap(),
"My Post"
);
Ok(())
}
fn parse_json_example() -> Result<(), Error> {
println!("\n๐ฆ JSON Parsing Example");
println!("---------------------------------------------");
let json_content = r#"{"title": "My Post", "date": "2025-09-09"}"#;
let frontmatter = parse(json_content, Format::Json)?;
println!(" โ
Parsed frontmatter: {:?}", frontmatter);
assert_eq!(
frontmatter.get("title").unwrap().as_str().unwrap(),
"My Post"
);
Ok(())
}
fn create_sample_frontmatter() -> Frontmatter {
let mut frontmatter = Frontmatter::new();
let _ = frontmatter.insert(
"title".to_string(),
Value::String("My Post".to_string()),
);
let _ = frontmatter.insert(
"date".to_string(),
Value::String("2025-09-09".to_string()),
);
frontmatter
}
fn serialize_to_yaml_example() -> Result<(), Error> {
println!("\n๐ฆ YAML Serialization Example");
println!("---------------------------------------------");
let frontmatter = create_sample_frontmatter();
let yaml = to_string(&frontmatter, Format::Yaml)?;
println!(" โ
Serialized to YAML:\n{}", yaml);
assert!(yaml.contains("title: My Post"));
Ok(())
}
fn serialize_to_toml_example() -> Result<(), Error> {
println!("\n๐ฆ TOML Serialization Example");
println!("---------------------------------------------");
let frontmatter = create_sample_frontmatter();
let toml = to_string(&frontmatter, Format::Toml)?;
println!(" โ
Serialized to TOML:\n{}", toml);
assert!(toml.contains("title = \"My Post\""));
Ok(())
}
fn serialize_to_json_example() -> Result<(), Error> {
println!("\n๐ฆ JSON Serialization Example");
println!("---------------------------------------------");
let frontmatter = create_sample_frontmatter();
let json = to_string(&frontmatter, Format::Json)?;
println!(" โ
Serialized to JSON:\n{}", json);
let deserialized: serde_json::Value =
serde_json::from_str(&json)
.map_err(|e| Error::ConversionError(e.to_string()))?;
assert_eq!(
deserialized.get("title").and_then(|v| v.as_str()),
Some("My Post")
);
Ok(())
}
#[cfg(feature = "ssg")]
fn ssg_parser_examples() -> Result<(), Error> {
println!("\n๐ฆ SSG-Specific Parser Examples");
println!("---------------------------------------------");
let mut frontmatter = Frontmatter::new();
let _ = frontmatter.insert(
"title".to_string(),
Value::String("My Blog Post".to_string()),
);
let _ = frontmatter.insert(
"template".to_string(),
Value::String("post".to_string()),
);
let _ = frontmatter.insert(
"layout".to_string(),
Value::String("blog".to_string()),
);
let _ =
frontmatter.insert("draft".to_string(), Value::Boolean(false));
let _ = frontmatter.insert(
"tags".to_string(),
Value::Array(vec![
Value::String("rust".to_string()),
Value::String("ssg".to_string()),
]),
);
println!("\n Converting SSG frontmatter to all formats:");
for format in [Format::Yaml, Format::Toml, Format::Json] {
let serialized = to_string(&frontmatter, format)?;
println!("\n {} format:", format);
println!("{}", serialized);
let parsed = parse(&serialized, format)?;
assert_eq!(
parsed.get("template").unwrap().as_str().unwrap(),
"post"
);
assert_eq!(
parsed.get("layout").unwrap().as_str().unwrap(),
"blog"
);
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_parsing() -> Result<(), Error> {
let yaml = "title: Test\n";
let frontmatter = parse(yaml, Format::Yaml)?;
assert_eq!(
frontmatter.get("title").unwrap().as_str().unwrap(),
"Test"
);
Ok(())
}
#[test]
fn test_serialization() -> Result<(), Error> {
let frontmatter = create_sample_frontmatter();
let yaml = to_string(&frontmatter, Format::Yaml)?;
assert!(yaml.contains("title: My Post"));
Ok(())
}
#[test]
fn test_roundtrip() -> Result<(), Error> {
let frontmatter = create_sample_frontmatter();
let yaml = to_string(&frontmatter, Format::Yaml)?;
let parsed = parse(&yaml, Format::Yaml)?;
assert_eq!(
parsed.get("title").unwrap().as_str().unwrap(),
"My Post"
);
Ok(())
}
}