use crate::collections::HashMap;
use crate::executable::Operation;
#[cfg(doc)]
use crate::executable::OperationMap;
use crate::execution::engine::execute_selection_set;
use crate::execution::engine::ExecutionMode;
use crate::execution::engine::PropagateNull;
#[cfg(doc)]
use crate::request::coerce_variable_values;
use crate::request::RequestError;
use crate::response::ExecutionResponse;
use crate::response::JsonMap;
use crate::schema::Implementers;
use crate::validation::Valid;
use crate::ExecutableDocument;
use crate::Name;
use crate::Schema;
mod max_depth;
mod resolvers;
pub fn check_max_depth(
document: &Valid<ExecutableDocument>,
operation: &Operation,
) -> Result<(), RequestError> {
let initial_depth = 0;
max_depth::check_selection_set(
document,
&mut HashMap::default(),
initial_depth,
&operation.selection_set,
)
.map(drop)
}
pub fn partial_execute(
schema: &Valid<Schema>,
implementers_map: &HashMap<Name, Implementers>,
document: &Valid<ExecutableDocument>,
operation: &Operation,
variable_values: &Valid<JsonMap>,
) -> Result<ExecutionResponse, RequestError> {
let object_type_name = operation.object_type();
let Some(root_operation_object_type_def) = schema.get_object(object_type_name) else {
return Err(RequestError {
message: "Undefined root operation type".to_owned(),
location: object_type_name.location(),
is_suspected_validation_bug: true,
});
};
let initial_value =
&resolvers::IntrospectionRootResolver(resolvers::SchemaWithImplementersMap {
schema,
implementers_map,
});
let mut errors = Vec::new();
let path = None;
let data = execute_selection_set(
schema,
document,
variable_values,
&mut errors,
path,
ExecutionMode::Normal,
root_operation_object_type_def,
initial_value,
&operation.selection_set.selections,
)
.inspect_err(|_: &PropagateNull| {})
.ok();
Ok(ExecutionResponse { data, errors })
}