use super::{expand_element, ActiveProperty, Expanded, JsonExpand, Options};
use crate::{
context::{Loader, TermDefinition},
object::*,
syntax::ContainerType,
ContextMut, Error, Id, Loc, Warning,
};
use cc_traits::Iter;
use iref::Iri;
pub async fn expand_array<
J: JsonExpand,
T: Id + Send + Sync,
C: ContextMut<T> + Send + Sync,
L: Loader + Send + Sync,
>(
active_context: &C,
active_property: ActiveProperty<'_, J>,
active_property_definition: Option<&TermDefinition<T, C>>,
element: &J::Array,
base_url: Option<Iri<'_>>,
loader: &mut L,
options: Options,
from_map: bool,
warnings: &mut Vec<Loc<Warning, J::MetaData>>,
) -> Result<Expanded<J, T>, Loc<Error, J::MetaData>>
where
C::LocalContext: From<L::Output> + From<J>,
L::Output: Into<J>,
{
let mut is_list = false;
let mut result = Vec::new();
if let Some(definition) = active_property_definition {
is_list = definition.container.contains(ContainerType::List);
}
for item in element.iter() {
result.extend(
expand_element(
active_context,
active_property,
&*item,
base_url,
loader,
options,
from_map,
warnings,
)
.await?,
);
}
if is_list {
return Ok(Expanded::Object(Object::List(result).into()));
}
Ok(Expanded::Array(result))
}