use noyalib::cst::parse_document;
fn main() {
let mut doc = parse_document("service: api\nport: 8080 # bumped for the load test\n").unwrap();
doc.set("port", "9090").unwrap();
assert_eq!(
doc.source(),
"service: api\nport: 9090 # bumped for the load test\n"
);
println!("set → {:?}", doc.source());
let (vs, ve) = doc.span_at("port").unwrap();
assert_eq!(&doc.source()[vs..ve], "9090");
let (ks, ke) = doc.key_span("port").unwrap();
assert_eq!(&doc.source()[ks..ke], "port");
println!("span_at/key_span → value {:?}, key {:?}", "9090", "port");
doc.rename_key("port", "listen_port").unwrap();
assert_eq!(
doc.source(),
"service: api\nlisten_port: 9090 # bumped for the load test\n"
);
println!("rename_key → {:?}", doc.source());
let mut doc = parse_document("features:\n - auth\n - api\n").unwrap();
doc.push_back("features", "metrics").unwrap();
assert_eq!(doc.source(), "features:\n - auth\n - api\n - metrics\n");
doc.insert_after("features[0]", "tracing").unwrap();
assert_eq!(
doc.source(),
"features:\n - auth\n - tracing\n - api\n - metrics\n"
);
doc.insert_entry("", "enabled", "true").unwrap();
assert!(doc.source().contains("enabled: true"));
println!("push/insert → {:?}", doc.source());
let mut doc = parse_document("features:\n - auth\n").unwrap();
doc.push_back_value("features", "- not an item").unwrap();
assert_eq!(
doc.source(),
"features:\n - auth\n - \"- not an item\"\n",
"the dash is data, not a nested sequence",
);
doc.insert_entry_value("", "version", "8080").unwrap();
assert!(
doc.source().contains("version: \"8080\""),
"quoted, or it would load as the number 8080",
);
assert_eq!(doc.as_value()["version"], noyalib::Value::from("8080"));
println!("*_value → {:?}", doc.source());
let mut doc = parse_document("order:\n - first\n - second\n - third\n").unwrap();
doc.swap_items("order", 0, 2).unwrap();
assert_eq!(doc.source(), "order:\n - third\n - second\n - first\n");
doc.move_item("order", 2, 0).unwrap();
assert_eq!(doc.source(), "order:\n - first\n - third\n - second\n");
println!("swap/move → {:?}", doc.source());
let mut doc =
parse_document("keep: 1\nserver:\n host: 0.0.0.0\n port: 8080\ntrailer: 2\n").unwrap();
doc.remove("server").unwrap();
assert_eq!(doc.source(), "keep: 1\ntrailer: 2\n");
println!("remove(nested) → {:?}", doc.source());
let mut doc = parse_document("port: 8080\n").unwrap();
doc.set_inline_comment("port", "the listen port").unwrap();
assert_eq!(doc.source(), "port: 8080 # the listen port\n");
doc.set_leading_comment("port", "network\nconfiguration")
.unwrap();
assert_eq!(
doc.source(),
"# network\n# configuration\nport: 8080 # the listen port\n"
);
let bundle = doc.comments_at("port");
assert_eq!(bundle.before.len(), 2);
assert_eq!(bundle.inline.as_ref().unwrap().text, " the listen port");
doc.remove_inline_comment("port").unwrap();
doc.remove_leading_comment("port").unwrap();
assert_eq!(doc.source(), "port: 8080\n");
println!("comments → set, read, removed cleanly");
let mut doc =
parse_document("defaults: &cfg\n port: 8080\nservice:\n <<: *cfg\nbackup: *cfg\n")
.unwrap();
let renamed = doc.rename_anchor("cfg", "shared").unwrap();
assert_eq!(renamed, 3); assert_eq!(
doc.source(),
"defaults: &shared\n port: 8080\nservice:\n <<: *shared\nbackup: *shared\n"
);
let mut clash = parse_document("x: &a 1\ny: &b 2\nz: *a\n").unwrap();
assert!(clash.rename_anchor("a", "b").is_err());
println!("rename_anchor → {:?}", doc.source());
let mut doc = parse_document("a: 1\nb: 2\n").unwrap();
assert!(doc.rename_key("a", "b").is_err());
assert_eq!(doc.source(), "a: 1\nb: 2\n"); println!("guard → refused a duplicate-key rename, doc intact");
println!("\nAll surgical edits preserved every untouched byte.");
}