nakago_async_graphql/
utils.rs

1use async_graphql::{Error, ErrorExtensions, MaybeUndefined};
2use fake::{Dummy, Fake, Faker};
3use hyper::StatusCode;
4use rand::Rng;
5
6/// A convenience function to create a GraphQL error with predictable extension props
7pub fn graphql_error(message: &'static str, code: StatusCode) -> Error {
8    anyhow!(message).extend_with(|_err, e| {
9        e.set("code", code.as_u16());
10        e.set("message", code.to_string());
11    })
12}
13
14/// A convenience function to create a GraphQL error from an existing error, intended to be
15/// used with `.map_err()`
16pub fn as_graphql_error(
17    message: &'static str,
18    code: StatusCode,
19) -> Box<dyn Fn(anyhow::Error) -> Error> {
20    Box::new(move |err| {
21        anyhow!(message).extend_with(|_err, e| {
22            e.set("code", code.as_u16());
23            e.set("message", code.to_string());
24            e.set("reason", err.to_string());
25        })
26    })
27}
28
29/// Randomly generate the `MaybeUndefined` type from the async-graphql library
30pub fn dummy_maybe_undef<T, R: Rng + ?Sized>(config: &Faker, rng: &mut R) -> MaybeUndefined<T>
31where
32    T: Dummy<Faker>,
33{
34    match (0..2).fake_with_rng(rng) {
35        0 => MaybeUndefined::Undefined,
36        1 => MaybeUndefined::Null,
37        _ => MaybeUndefined::Value(T::dummy_with_rng(config, rng)),
38    }
39}