use crate::error::YamlError;
use crate::nodes::node::Node;
pub fn validate_yaml_tree(node: &Node) -> Result<(), YamlError> {
match node {
Node::Documents(docs) => {
for doc in docs {
validate_yaml_tree(doc)?;
}
}
Node::Document(nodes) => {
for n in nodes {
validate_yaml_tree(n)?;
}
}
Node::Mapping(pairs) => {
for (k, v) in pairs {
validate_yaml_tree(k)?;
validate_yaml_tree(v)?;
}
}
Node::Array(items) | Node::Set(items) => {
for item in items {
validate_yaml_tree(item)?;
}
}
Node::Anchored(inner, _) | Node::Tagged(inner, _) => {
validate_yaml_tree(inner)?;
}
Node::Alias(_)
| Node::Str(_, _, _)
| Node::Number(_)
| Node::Boolean(_)
| Node::Comment(_)
| Node::None => {}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::nodes;
use crate::nodes::node::{BlockStyle, Node, QuoteType};
#[test]
fn test_validate_simple_scalar() {
let node = Node::Str("hello".into(), QuoteType::Unquoted, BlockStyle::None);
assert!(validate_yaml_tree(&node).is_ok());
}
#[test]
fn test_validate_simple_array() {
let node = Node::Array(vec![
Node::Str("a".into(), QuoteType::Unquoted, BlockStyle::None),
Node::Str("b".into(), QuoteType::Unquoted, BlockStyle::None),
]);
assert!(validate_yaml_tree(&node).is_ok());
}
#[test]
fn test_validate_nested_mapping() {
let node = Node::Mapping(vec![(
Node::Str("key".into(), QuoteType::Unquoted, BlockStyle::None),
Node::Mapping(vec![(
Node::Str("inner".into(), QuoteType::Unquoted, BlockStyle::None),
Node::Number(nodes::node::Numeric::Float(42.0)),
)]),
)]);
assert!(validate_yaml_tree(&node).is_ok());
}
#[test]
fn test_validate_document_with_array() {
let node = Node::Document(vec![Node::Array(vec![
Node::Str("x".into(), QuoteType::Unquoted, BlockStyle::None),
Node::Str("y".into(), QuoteType::Unquoted, BlockStyle::None),
])]);
assert!(validate_yaml_tree(&node).is_ok());
}
#[test]
fn test_validate_documents() {
let node = Node::Documents(vec![
Node::Document(vec![Node::Str(
"a".into(),
QuoteType::Unquoted,
BlockStyle::None,
)]),
Node::Document(vec![Node::Number(nodes::node::Numeric::Float(1.0))]),
]);
assert!(validate_yaml_tree(&node).is_ok());
}
#[test]
fn test_validate_anchored_and_tagged() {
let node = Node::Anchored(
Box::new(Node::Tagged(
Box::new(Node::Str(
"val".into(),
QuoteType::Unquoted,
BlockStyle::None,
)),
"!tag".into(),
)),
"anchor".into(),
);
assert!(validate_yaml_tree(&node).is_ok());
}
#[test]
fn test_validate_alias() {
let node = Node::Alias("my_anchor".into());
assert!(validate_yaml_tree(&node).is_ok());
}
#[test]
fn test_validate_none() {
let node = Node::None;
assert!(validate_yaml_tree(&node).is_ok());
}
#[test]
fn test_validate_invalid_structure() {
let node = Node::Mapping(vec![(
Node::None,
Node::Str("val".into(), QuoteType::Unquoted, BlockStyle::None),
)]);
let result = validate_yaml_tree(&node);
if result.is_ok() {
println!("Warning: None as mapping key accepted, stricter validation may be needed");
}
}
}