pub const SINGLE_SCHEMA_CHILD_KEYWORDS: [&str; 11] = [
"additionalProperties",
"contains",
"contentSchema",
"else",
"if",
"items",
"not",
"propertyNames",
"then",
"unevaluatedItems",
"unevaluatedProperties",
];
pub const SCHEMA_MAP_CHILD_KEYWORDS: [&str; 5] = [
"$defs",
"definitions",
"dependentSchemas",
"patternProperties",
"properties",
];
pub const SCHEMA_ARRAY_CHILD_KEYWORDS: [&str; 4] = ["allOf", "anyOf", "oneOf", "prefixItems"];
#[must_use]
pub fn is_single_schema_child_keyword(keyword: &str) -> bool {
SINGLE_SCHEMA_CHILD_KEYWORDS.contains(&keyword)
}
#[must_use]
pub fn is_schema_map_child_keyword(keyword: &str) -> bool {
SCHEMA_MAP_CHILD_KEYWORDS.contains(&keyword)
}
#[must_use]
pub fn is_schema_array_child_keyword(keyword: &str) -> bool {
SCHEMA_ARRAY_CHILD_KEYWORDS.contains(&keyword)
}
#[cfg(test)]
mod tests {
use super::{
SCHEMA_ARRAY_CHILD_KEYWORDS, SCHEMA_MAP_CHILD_KEYWORDS, SINGLE_SCHEMA_CHILD_KEYWORDS,
is_schema_array_child_keyword, is_schema_map_child_keyword, is_single_schema_child_keyword,
};
use std::collections::BTreeSet;
#[test]
fn schema_child_keyword_families_are_disjoint_and_queryable() {
let mut seen = BTreeSet::new();
for keyword in SINGLE_SCHEMA_CHILD_KEYWORDS {
assert!(
seen.insert(keyword),
"duplicate keyword family member: {keyword}"
);
assert!(is_single_schema_child_keyword(keyword));
assert!(!is_schema_map_child_keyword(keyword));
assert!(!is_schema_array_child_keyword(keyword));
}
for keyword in SCHEMA_MAP_CHILD_KEYWORDS {
assert!(
seen.insert(keyword),
"duplicate keyword family member: {keyword}"
);
assert!(is_schema_map_child_keyword(keyword));
assert!(!is_single_schema_child_keyword(keyword));
assert!(!is_schema_array_child_keyword(keyword));
}
for keyword in SCHEMA_ARRAY_CHILD_KEYWORDS {
assert!(
seen.insert(keyword),
"duplicate keyword family member: {keyword}"
);
assert!(is_schema_array_child_keyword(keyword));
assert!(!is_single_schema_child_keyword(keyword));
assert!(!is_schema_map_child_keyword(keyword));
}
}
}