use babbel_yaml::{
DebugAssert, NodeDebugger, NodeInfo, NodeType, find_by_type, node_depth, node_size,
node_summary, node_type, parse_string, print_tree,
};
const YAML: &str = r#"# Application configuration
app:
name: my-service
version: "1.4.2"
debug: false
max_connections: 100
tags:
- web
- api
- rust
database:
host: localhost
port: 5432
name: mydb
credentials: &creds
user: admin
password: secret
replica:
host: replica.internal
credentials: *creds
"#;
fn main() {
println!("=== YAML Developer Tools Example ===\n");
let doc = parse_string(YAML).expect("parse failed");
println!("--- 1. Tree structure (print_tree) ---");
let tree = print_tree(&doc);
println!("{}", tree);
println!("--- 2. Root-level stats ---");
println!(" node_type : {}", node_type(&doc).as_str());
println!(" node_summary: {}", node_summary(&doc));
println!(" node_depth : {}", node_depth(&doc));
println!(" node_size : {}\n", node_size(&doc));
println!("--- 3. NodeInfo ---");
let info = NodeInfo::new(&doc);
println!("{}\n", info.format());
println!("--- 4a. All string nodes ---");
let strings = find_by_type(&doc, NodeType::String);
println!(" Found {} string nodes:", strings.len());
for s in &strings {
println!(" {}", node_summary(s));
}
println!("\n--- 4b. All integer nodes ---");
let integers = find_by_type(&doc, NodeType::Integer);
println!(" Found {} integer nodes:", integers.len());
for n in &integers {
println!(" {}", node_summary(n));
}
println!("\n--- 4c. All boolean nodes ---");
let bools = find_by_type(&doc, NodeType::Boolean);
println!(" Found {} boolean nodes:", bools.len());
for b in &bools {
println!(" {}", node_summary(b));
}
println!("\n--- 4d. Anchored nodes ---");
let anchored = find_by_type(&doc, NodeType::Anchored);
println!(" Found {} anchored node(s)", anchored.len());
for a in &anchored {
println!(" {}", node_summary(a));
}
println!("\n--- 4e. Alias nodes ---");
let aliases = find_by_type(&doc, NodeType::Alias);
println!(" Found {} alias node(s)", aliases.len());
for a in &aliases {
println!(" {}", node_summary(a));
}
println!();
println!("--- 5. NodeDebugger ---");
let mut dbg = NodeDebugger::new();
dbg.debug_access("doc", &doc);
dbg.debug_create(&doc);
use babbel_yaml::parse_string as ps;
let old_val = ps("42").expect("parse old");
let new_val = ps("43").expect("parse new");
dbg.debug_modify("app.max_connections", &old_val, &new_val);
println!(" Debug log:\n{}", dbg.logs());
println!("--- 6. DebugAssert ---");
match DebugAssert::assert_type(&doc, NodeType::Documents) {
Ok(()) => println!(" ✓ Root is a Documents node"),
Err(e) => println!(" ✗ {}", e),
}
match DebugAssert::assert_max_depth(&doc, 10) {
Ok(()) => println!(" ✓ Depth ≤ 10"),
Err(e) => println!(" ✗ {}", e),
}
match DebugAssert::assert_size(&doc, 99) {
Ok(()) => println!(" ✓ Size == 99 (unexpected)"),
Err(e) => println!(" ✗ (expected failure) {}", e),
}
if let Some(first_str) = strings.first() {
match DebugAssert::assert_type(first_str, NodeType::String) {
Ok(()) => println!(" ✓ First string node is indeed a String"),
Err(e) => println!(" ✗ {}", e),
}
}
println!();
}