use frontmatter_gen::{Format, Frontmatter, Value};
use std::f64::consts::PI;
pub fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("\n๐งช FrontMatterGen Types Examples\n");
format_examples()?;
value_examples()?;
frontmatter_examples()?;
#[cfg(feature = "ssg")]
ssg_type_examples()?;
println!("\n๐ All types examples completed successfully!");
Ok(())
}
fn format_examples() -> Result<(), Box<dyn std::error::Error>> {
println!("๐ฆ Format Enum Example");
println!("---------------------------------------------");
let default_format = Format::default();
println!(" โ
Default format: {:?}", default_format);
let yaml_format = Format::Yaml;
println!(" โ
YAML format: {:?}", yaml_format);
let toml_format = Format::Toml;
println!(" โ
TOML format: {:?}", toml_format);
let json_format = Format::Json;
println!(" โ
JSON format: {:?}", json_format);
assert_eq!(Format::default(), Format::Json);
assert_ne!(Format::Yaml, Format::Toml);
Ok(())
}
fn value_examples() -> Result<(), Box<dyn std::error::Error>> {
println!("\n๐ฆ Value Enum Example");
println!("---------------------------------------------");
let string_value = Value::String("Hello".to_string());
println!(" โ
String value: {:?}", string_value);
assert_eq!(string_value.as_str().unwrap(), "Hello");
let number_value = Value::Number(PI);
println!(" โ
Number value: {:?}", number_value);
assert_eq!(number_value.as_f64().unwrap(), PI);
let bool_value = Value::Boolean(true);
println!(" โ
Boolean value: {:?}", bool_value);
assert!(bool_value.as_bool().unwrap());
let array_value =
Value::Array(vec![Value::Number(1.0), Value::Number(2.0)]);
println!(" โ
Array value: {:?}", array_value);
assert_eq!(array_value.array_len().unwrap(), 2);
let mut fm = Frontmatter::new();
let _ = fm
.insert("key".to_string(), Value::String("value".to_string()));
let object_value = Value::Object(Box::new(fm.clone()));
println!(" โ
Object value: {:?}", object_value);
assert!(object_value.is_object());
Ok(())
}
fn frontmatter_examples() -> Result<(), Box<dyn std::error::Error>> {
println!("\n๐ฆ Frontmatter Struct Example");
println!("---------------------------------------------");
let mut frontmatter = Frontmatter::new();
let _ = frontmatter.insert(
"title".to_string(),
Value::String("My Post".to_string()),
);
let _ =
frontmatter.insert("views".to_string(), Value::Number(100.0));
println!(" โ
Frontmatter with two entries: {:?}", frontmatter);
let title = frontmatter.get("title").unwrap().as_str().unwrap();
let views = frontmatter.get("views").unwrap().as_f64().unwrap();
println!(" Title: {}", title);
println!(" Views: {}", views);
let _ = frontmatter.remove("views");
println!(
" โ
Frontmatter after removing 'views': {:?}",
frontmatter
);
assert!(frontmatter.get("views").is_none());
assert_eq!(frontmatter.len(), 1);
Ok(())
}
#[cfg(feature = "ssg")]
fn ssg_type_examples() -> Result<(), Box<dyn std::error::Error>> {
println!("\n๐ฆ SSG-Specific Types Example");
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()),
]),
);
let mut metadata = Frontmatter::new();
let _ = metadata.insert(
"author".to_string(),
Value::String("John Doe".to_string()),
);
let _ = metadata.insert(
"category".to_string(),
Value::String("Programming".to_string()),
);
let _ = frontmatter.insert(
"metadata".to_string(),
Value::Object(Box::new(metadata)),
);
println!(" โ
SSG Frontmatter:\n{:#?}", frontmatter);
if let Some(tags) =
frontmatter.get("tags").and_then(Value::as_array)
{
println!("\n Tags:");
for tag in tags {
if let Some(tag_str) = tag.as_str() {
println!(" - {}", tag_str);
}
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_value_types() {
let string_val = Value::String("test".to_string());
assert!(string_val.is_string());
assert_eq!(string_val.as_str().unwrap(), "test");
let num_val = Value::Number(42.0);
assert!(num_val.is_number());
assert_eq!(num_val.as_f64().unwrap(), 42.0);
}
#[test]
fn test_frontmatter_operations() {
let mut fm = Frontmatter::new();
fm.insert(
"test".to_string(),
Value::String("value".to_string()),
);
assert!(fm.contains_key("test"));
assert_eq!(fm.get("test").unwrap().as_str().unwrap(), "value");
fm.remove("test");
assert!(!fm.contains_key("test"));
}
#[cfg(feature = "ssg")]
#[test]
fn test_ssg_metadata() {
let mut fm = Frontmatter::new();
fm.insert(
"template".to_string(),
Value::String("post".to_string()),
);
fm.insert("draft".to_string(), Value::Boolean(false));
fm.insert(
"tags".to_string(),
Value::Array(vec![Value::String("rust".to_string())]),
);
assert_eq!(
fm.get("template").unwrap().as_str().unwrap(),
"post"
);
assert!(!fm.get("draft").unwrap().as_bool().unwrap());
assert_eq!(fm.get("tags").unwrap().array_len().unwrap(), 1);
}
}