use babbel_yaml::{make_node, make_set, stringify, BufferDestination, Node};
fn print_node(node: &Node) {
let mut dest = BufferDestination::new();
match stringify(node, &mut dest) {
Ok(_) => println!("{}", dest.to_string().trim()),
Err(e) => eprintln!("Stringify error: {}", e),
}
}
fn main() {
println!("=== YAML Node Manipulation Example ===\n");
demo_basic_nodes();
demo_arrays();
demo_mappings();
demo_sets();
demo_manipulation();
}
fn demo_basic_nodes() {
println!("--- Example 1: Basic Node Creation ---");
let name = make_node("Alice");
let age = make_node(25);
let score = make_node(95.5);
let active = make_node(true);
println!("Simple scalar nodes:");
print_node(&name);
print_node(&age);
print_node(&score);
print_node(&active);
println!();
}
fn demo_arrays() {
println!("--- Example 2: Creating Arrays ---");
let colors = Node::Array(vec![
make_node("red"),
make_node("green"),
make_node("blue"),
]);
println!("Array of strings:");
print_node(&colors);
let numbers = Node::Array(vec![
make_node(1),
make_node(2),
make_node(3),
make_node(4),
make_node(5),
]);
println!("\nArray of numbers:");
print_node(&numbers);
println!();
}
fn demo_mappings() {
println!("--- Example 3: Creating Mappings ---");
let person = Node::Mapping(vec![
(make_node("name"), make_node("Bob Smith")),
(make_node("age"), make_node(35)),
(make_node("email"), make_node("bob@example.com")),
]);
println!("Person mapping:");
print_node(&person);
let config = Node::Mapping(vec![
(
make_node("database"),
Node::Mapping(vec![
(make_node("host"), make_node("localhost")),
(make_node("port"), make_node(5432)),
]),
),
(
make_node("servers"),
Node::Array(vec![
make_node("web1"),
make_node("web2"),
make_node("web3"),
]),
),
(make_node("debug"), make_node(true)),
]);
println!("\nNested configuration:");
print_node(&config);
println!();
}
fn demo_sets() {
println!("--- Example 4: Creating Sets ---");
let tags = make_set(vec![
make_node("rust"),
make_node("yaml"),
make_node("parsing"),
make_node("rust"), make_node("yaml"), make_node("serialization"),
]);
println!("Set with automatic duplicate removal:");
print_node(&tags);
let numbers = make_set(vec![
make_node(1),
make_node(2),
make_node(3),
make_node(2), make_node(4),
make_node(1), make_node(5),
]);
println!("\nNumeric set:");
print_node(&numbers);
println!();
}
fn demo_manipulation() {
println!("--- Example 5: Node Manipulation ---");
let mut features = Node::Array(vec![make_node("basic"), make_node("standard")]);
println!("Original features:");
print_node(&features);
if let Node::Array(ref mut arr) = features {
arr.push(make_node("advanced"));
arr.push(make_node("premium"));
}
println!("\nModified features:");
print_node(&features);
let mut config = Node::Mapping(vec![
(make_node("version"), make_node("1.0.0")),
(make_node("name"), make_node("MyApp")),
]);
println!("\nOriginal config:");
print_node(&config);
if let Node::Mapping(ref mut pairs) = config {
pairs.push((make_node("build_date"), make_node("2024-01-15")));
pairs.push((make_node("author"), make_node("Development Team")));
}
println!("\nUpdated config:");
print_node(&config);
println!();
}