toon-format-rs 0.1.0

Token-Oriented Object Notation (TOON) parser and serializer for Rust
Documentation
use toon_format_rs::{parse, to_string};

fn main() {
    // Parse a TOON document
    let input = r#"context:
  task: Our favorite hikes together
  location: Boulder
  season: spring_2025
friends[3]: ana,luis,sam
hikes[3]{id,name,distanceKm,elevationGain,companion,wasSunny}:
  1,Blue Lake Trail,7.5,320,ana,true
  2,Ridge Overlook,9.2,540,luis,false
  3,Wildflower Loop,5.1,180,sam,true"#;

    let value = parse(input).expect("Failed to parse TOON");
    // Debug: print tokens
    /*
    let lexer = toon_format_rs::Lexer::new(input);
    let tokens = lexer.lex().unwrap();
    println!("Tokens: {:?}", tokens);
    */

    println!("Parsed TOON value:");
    println!("{:#?}\n", value);

    // Access values
    if let Some(context) = value.get("context") {
        println!("Task: {}", context.get("task").unwrap().as_str().unwrap());
    }

    if let Some(friends) = value.get("friends") {
        println!("Number of friends: {}", friends.len());
    }

    if let Some(hikes) = value.get("hikes") {
        println!("\nHikes:");
        for hike in hikes.as_array().unwrap() {
            let h = hike.as_object().unwrap();
            println!(
                "  - {}: {}km, {}m gain",
                h.get("name").unwrap().as_str().unwrap(),
                h.get("distanceKm").unwrap().as_f64().unwrap(),
                h.get("elevationGain").unwrap().as_i64().unwrap()
            );
        }
    }

    // Serialize back to TOON
    let output = to_string(&value).expect("Failed to serialize");
    println!("\nSerialized back to TOON:\n{}", output);
}