use super::walk::{visit_vast_elements, Location};
use super::{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| {
if !subtree_is_valid_here(loc, v) {
return;
}
match node.name.as_str() {
"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);
}
"InteractiveCreativeFile" => {
required::check_interactive_creative_file(node, &loc.path(), ctx, issues);
}
_ => {}
}
});
}
fn subtree_is_valid_here(loc: &Location, v: Option<VastVersion>) -> bool {
if loc.inside("NonLinear") && !v.map(|x| x.is_v4()).unwrap_or(false) {
return false;
}
true
}
fn at_least(v: Option<VastVersion>, min: VastVersion) -> bool {
v.map(|x| x.at_least(&min)).unwrap_or(false)
}