use super::emit;
use crate::parse::VastDocument;
use crate::{DetectedVersion, Issue, Severity, ValidationContext};
pub fn check(
doc: &VastDocument,
_version: &DetectedVersion,
ctx: &ValidationContext,
issues: &mut Vec<Issue>,
) {
check_wrapper_depth(doc, ctx, issues);
check_ad_sequence(doc, ctx, issues);
}
fn check_wrapper_depth(_doc: &VastDocument, ctx: &ValidationContext, issues: &mut Vec<Issue>) {
if ctx.wrapper_depth > ctx.max_wrapper_depth {
emit(
ctx,
issues,
"VAST-2.0-wrapper-depth",
Severity::Error,
"Wrapper chain depth exceeds the maximum allowed limit",
Some("/VAST".to_owned()),
"IAB VAST 4.x §2.3",
None,
)
}
}
fn check_ad_sequence(doc: &VastDocument, ctx: &ValidationContext, issues: &mut Vec<Issue>) {
let Some(vast) = doc.vast_root() else { return };
let ads: Vec<_> = vast.children_named("Ad").collect();
if ads.len() < 2 {
return;
}
let with_seq = ads.iter().filter(|a| a.attr("sequence").is_some()).count();
if with_seq > 0 && with_seq < ads.len() {
emit(
ctx, issues,
"VAST-2.0-ad-sequence",
Severity::Warning,
"Multiple <Ad> elements present but sequence attribute is missing on some — ambiguous ordering",
Some("/VAST".to_owned()),
"IAB VAST 2.0 §2.2",
None,
)
}
}