wrap_manifest_schemas/
validate.rs

1use crate::{get_schemas::get_schemas, versions::AnyManifest};
2use jsonschema::{JSONSchema, ValidationError};
3
4pub fn validate_wrap_manifest(
5    manifest: &AnyManifest,
6    ext_schema: Option<JSONSchema>,
7) -> Result<(), super::error::Error> {
8    let schemas = get_schemas()?;
9
10    let panic_if_errors = |result: Result<
11        (),
12        Box<dyn Iterator<Item = ValidationError> + Send + Sync>,
13    >| match result {
14        Ok(_) => (),
15        Err(e) => panic!(
16            "Validation errors encountered while sanitizing WrapManifest format {}{}",
17            manifest.version(),
18            e.into_iter()
19                .map(|e| e.to_string())
20                .collect::<Vec<String>>()
21                .join("\n")
22        ),
23    };
24
25    let manifest_schema = JSONSchema::options()
26        .with_draft(jsonschema::Draft::Draft7)
27        .compile(&schemas[manifest.version().as_str()])?;
28    let manifest_json = manifest.to_json_value()?;
29    panic_if_errors(manifest_schema.validate(&manifest_json));
30
31    if let Some(ext_schema) = ext_schema {
32        panic_if_errors(ext_schema.validate(&manifest.to_json_value()?));
33    }
34
35    Ok(())
36}