async-graphql/src/resolver_utils/list.rs

59 lines
2.1 KiB
Rust
Raw Normal View History

2020-10-12 06:49:32 +00:00
use crate::extensions::{ErrorLogger, ExtensionContext, ResolveInfo};
2020-09-25 04:58:45 +00:00
use crate::parser::types::Field;
use crate::{ContextSelectionSet, OutputType, PathSegment, Positioned, ServerResult, Type, Value};
2020-09-25 04:58:45 +00:00
/// Resolve an list by executing each of the items concurrently.
pub async fn resolve_list<'a, T: OutputType + Send + Sync + 'a>(
2020-09-25 04:58:45 +00:00
ctx: &ContextSelectionSet<'a>,
field: &Positioned<Field>,
iter: impl IntoIterator<Item = T>,
2020-10-12 06:49:32 +00:00
len: Option<usize>,
2020-10-10 02:32:43 +00:00
) -> ServerResult<Value> {
2020-10-14 03:11:52 +00:00
let mut futures = len.map(Vec::with_capacity).unwrap_or_default();
2020-09-25 04:58:45 +00:00
for (idx, item) in iter.into_iter().enumerate() {
let ctx_idx = ctx.with_index(idx);
futures.push(async move {
2020-09-29 12:47:37 +00:00
let ctx_extension = ExtensionContext {
schema_data: &ctx.schema_env.data,
query_data: &ctx.query_env.ctx_data,
2020-09-25 04:58:45 +00:00
};
2020-10-12 06:49:32 +00:00
if ctx_idx.query_env.extensions.is_empty() {
OutputType::resolve(&item, &ctx_idx, field)
2020-10-12 06:49:32 +00:00
.await
.map_err(|e| e.path(PathSegment::Index(idx)))
.log_error(&ctx_extension, &ctx_idx.query_env.extensions)
} else {
let resolve_info = ResolveInfo {
resolve_id: ctx_idx.resolve_id,
path_node: ctx_idx.path_node.as_ref().unwrap(),
parent_type: &Vec::<T>::type_name(),
return_type: &T::qualified_type_name(),
};
ctx_idx
.query_env
.extensions
.resolve_start(&ctx_extension, &resolve_info);
2020-09-25 04:58:45 +00:00
let res = OutputType::resolve(&item, &ctx_idx, field)
2020-10-12 06:49:32 +00:00
.await
.map_err(|e| e.path(PathSegment::Index(idx)))
.log_error(&ctx_extension, &ctx_idx.query_env.extensions)?;
2020-09-25 04:58:45 +00:00
2020-10-12 06:49:32 +00:00
ctx_idx
.query_env
.extensions
.resolve_end(&ctx_extension, &resolve_info);
2020-09-25 04:58:45 +00:00
2020-10-12 06:49:32 +00:00
Ok(res)
}
2020-09-25 04:58:45 +00:00
});
}
2020-10-16 10:37:59 +00:00
Ok(Value::List(
futures_util::future::try_join_all(futures).await?,
))
2020-09-25 04:58:45 +00:00
}