use anyhow::{Context, Result};
use env_logger::{Builder, Env};
use frontmatter_gen::extract;
use log::{error, info};
fn example_404() -> Result<()> {
info!("Running 404 page example");
let env = Env::default().default_filter_or("warn");
if let Err(e) = Builder::from_env(env).try_init() {
error!("Logger already initialized: {}", e);
}
let content = r#"---
title: Not Found
---
<div style="text-align:center;">
<img src="https://http.cat/images/404.jpg" alt="404 Not Found">
</div>
"#;
let (frontmatter, remaining) = extract(content)
.context("Failed to extract front matter from 404 page")?;
println!("\n๐ 404 Page Example:");
println!("Front Matter:");
println!("{:#?}", frontmatter);
println!("\nContent:");
println!("{}", remaining);
Ok(())
}
fn example_yaml() -> Result<()> {
info!("Testing YAML front matter");
let content = r#"---
title: Example Page
date: 2024-11-24
tags:
- rust
- frontmatter
description: >
A multi-line description
spanning multiple lines.
---
# Main Content
This is the main content of the page."#;
let (frontmatter, remaining) = extract(content)
.context("Failed to extract YAML front matter")?;
println!("\n๐ YAML Front Matter Example:");
println!("Front Matter:");
println!("{:#?}", frontmatter);
println!("\nContent:");
println!("{}", remaining);
Ok(())
}
fn example_toml() -> Result<()> {
info!("Testing TOML front matter");
let content = r#"+++
title = "Example Page"
date = 2024-11-24
tags = ["rust", "frontmatter"]
[author]
name = "John Doe"
email = "john@example.com"
+++
# Main Content
This is the main content with TOML front matter."#;
let (frontmatter, remaining) = extract(content)
.context("Failed to extract TOML front matter")?;
println!("\n๐ TOML Front Matter Example:");
println!("Front Matter:");
println!("{:#?}", frontmatter);
println!("\nContent:");
println!("{}", remaining);
Ok(())
}
fn example_json() -> Result<()> {
info!("Testing JSON front matter");
let content = r#"{
"title": "Example Page",
"date": "2024-11-24",
"tags": ["rust", "frontmatter"],
"metadata": {
"author": "John Doe",
"version": 1.0
}
}
# Main Content
This is the main content with JSON front matter."#;
let (frontmatter, remaining) = extract(content)
.context("Failed to extract JSON front matter")?;
println!("\n๐ JSON Front Matter Example:");
println!("Front Matter:");
println!("{:#?}", frontmatter);
println!("\nContent:");
println!("{}", remaining);
Ok(())
}
pub fn main() -> Result<()> {
println!("๐งช Front Matter Examples\n");
example_404()?;
example_yaml()?;
example_toml()?;
example_json()?;
info!("All examples completed successfully");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_404_example() -> Result<()> {
example_404()
}
#[test]
fn test_yaml_extraction() -> Result<()> {
example_yaml()
}
#[test]
fn test_toml_extraction() -> Result<()> {
example_toml()
}
#[test]
fn test_json_extraction() -> Result<()> {
example_json()
}
#[test]
fn test_invalid_formats() {
let invalid_yaml = r#"---
invalid: : value
---"#;
assert!(extract(invalid_yaml).is_err());
let invalid_toml = r#"+++
invalid = = value
+++"#;
assert!(extract(invalid_toml).is_err());
let invalid_json = r#"{
"invalid": : value
}"#;
assert!(extract(invalid_json).is_err());
}
#[test]
fn test_complex_structures() -> Result<()> {
let yaml = r#"---
nested:
key: value
array:
- item1
- item2
---"#;
let (frontmatter, _) = extract(yaml)?;
assert!(frontmatter.contains_key("nested"));
let toml = r#"+++
[table]
key = "value"
array = ["item1", "item2"]
+++"#;
let (frontmatter, _) = extract(toml)?;
assert!(frontmatter.contains_key("table"));
let json = r#"{
"nested": {
"key": "value",
"array": ["item1", "item2"]
}
}"#;
let (frontmatter, _) = extract(json)?;
assert!(frontmatter.contains_key("nested"));
Ok(())
}
}