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