referencing/specification/
draft6.rsuse serde_json::Value;
use crate::{resource::InnerResourcePtr, Error, Resolver, Segments};
use super::subresources::{self, SubresourceIteratorInner};
pub(crate) fn object_iter<'a>(
(key, value): (&'a String, &'a Value),
) -> SubresourceIteratorInner<'a> {
match key.as_str() {
"additionalItems" | "additionalProperties" | "contains" | "not" | "propertyNames" => {
SubresourceIteratorInner::Once(value)
}
"allOf" | "anyOf" | "oneOf" => {
if let Some(arr) = value.as_array() {
SubresourceIteratorInner::Array(arr.iter())
} else {
SubresourceIteratorInner::Empty
}
}
"definitions" | "patternProperties" | "properties" => {
if let Some(obj) = value.as_object() {
SubresourceIteratorInner::Object(obj.values())
} else {
SubresourceIteratorInner::Empty
}
}
"items" => match value {
Value::Array(arr) => SubresourceIteratorInner::Array(arr.iter()),
_ => SubresourceIteratorInner::Once(value),
},
"dependencies" => {
if let Some(obj) = value.as_object() {
SubresourceIteratorInner::FilteredObject(obj.values())
} else {
SubresourceIteratorInner::Empty
}
}
_ => SubresourceIteratorInner::Empty,
}
}
pub(crate) fn maybe_in_subresource<'r>(
segments: &Segments,
resolver: &Resolver<'r>,
subresource: &InnerResourcePtr,
) -> Result<Resolver<'r>, Error> {
const IN_VALUE: &[&str] = &[
"additionalItems",
"additionalProperties",
"contains",
"not",
"propertyNames",
];
const IN_CHILD: &[&str] = &[
"allOf",
"anyOf",
"oneOf",
"definitions",
"patternProperties",
"properties",
];
subresources::maybe_in_subresource_with_items_and_dependencies(
segments,
resolver,
subresource,
IN_VALUE,
IN_CHILD,
)
}