use super::walk::visit_vast_elements;
use super::{ambiguous, required, values};
use crate::parse::VastDocument;
use crate::{DetectedVersion, Issue, ValidationContext, VastVersion};
pub fn check(
doc: &VastDocument,
version: &DetectedVersion,
ctx: &ValidationContext,
issues: &mut Vec<Issue>,
) {
let Some(vast) = doc.vast_root() else { return };
let v = version.best().copied();
visit_vast_elements(vast, "/VAST", &mut |node, loc| {
match node.name.as_str() {
"MediaFile" | "Mezzanine" | "InteractiveCreativeFile" | "Duration"
if loc.inside("NonLinear") && !is_v4(v) => {}
"Icon" if loc.inside("NonLinearAds") && !is_v4(v) => {}
"MediaFile" => {
let path = loc.path();
required::check_mediafile(node, &path, ctx, issues);
values::check_mediafile_values(node, &path, ctx, issues);
}
"Mezzanine" if at_least(v, VastVersion::V4_1) => {
required::check_mezzanine_required_attrs(node, &loc.path(), ctx, issues);
}
"Icon" => {
let path = loc.path();
required::check_icon_required_attrs(node, &path, version, ctx, issues);
ambiguous::check_icon(node, &path, ctx, issues);
ambiguous::check_icon_fallback_images(node, &path, v.as_ref(), ctx, issues);
}
"Tracking" if loc.inside("Verification") => {}
"Tracking" => {
values::check_tracking_value(node, &loc.path(), v.as_ref(), ctx, issues);
}
"Duration" => {
values::check_duration_value(node, &loc.path(), ctx, issues);
}
"AdParameters" => {
values::check_adparameters_value(node, &loc.path(), ctx, issues);
}
"InteractiveCreativeFile" => {
required::check_interactive_creative_file(node, &loc.path(), ctx, issues);
}
_ => {}
}
});
}
fn is_v4(v: Option<VastVersion>) -> bool {
v.map(|x| x.is_v4()).unwrap_or(false)
}
fn at_least(v: Option<VastVersion>, min: VastVersion) -> bool {
v.map(|x| x.at_least(&min)).unwrap_or(false)
}