use async_graphql::async_trait::async_trait;
use async_graphql::{Context, CustomDirective, Directive, Error, ResolveFut, ServerResult, Value};
use super::MatcherError;
#[Directive(location = "Field", name = "shouldBeNotNull")]
pub fn should_be_not_null() -> impl CustomDirective {
ShouldBeNotNull
}
struct ShouldBeNotNull;
#[async_trait]
impl CustomDirective for ShouldBeNotNull {
async fn resolve_field(
&self,
ctx: &Context<'_>,
resolve: ResolveFut<'_>,
) -> ServerResult<Option<Value>> {
match resolve.await {
Ok(None) => Ok(None),
Ok(Some(Value::Null)) => Err(ctx.set_error_path(
Error {
message: "Expected: not null\nReceived: null".to_string(),
source: Some(std::sync::Arc::new(MatcherError)),
extensions: None,
}
.into_server_error(ctx.item.pos),
)),
Ok(Some(other)) => Ok(Some(other)),
Err(err) => Err(ctx.set_error_path(
Error {
message: format!("Unexpected error occurred:\n\n{}", err.message),
source: Some(std::sync::Arc::new(MatcherError)),
extensions: None,
}
.into_server_error(ctx.item.pos),
)),
}
}
}