async-graphql 0.5.0

The GraphQL server library implemented by rust
Documentation
use crate::{GQLType, Result};
use graphql_parser::query::Value;

#[doc(hidden)]
pub struct GQLEnumItem<T> {
    pub name: &'static str,
    pub value: T,
}

#[doc(hidden)]
#[async_trait::async_trait]
pub trait GQLEnum: GQLType + Sized + Eq + Send + Copy + Sized + 'static {
    fn items() -> &'static [GQLEnumItem<Self>];

    fn parse_enum(value: Value) -> Option<Self> {
        match value {
            Value::Enum(s) => {
                let items = Self::items();
                for item in items {
                    if item.name == s {
                        return Some(item.value);
                    }
                }
            }
            _ => {}
        }
        None
    }

    fn parse_json_enum(value: serde_json::Value) -> Option<Self> {
        match value {
            serde_json::Value::String(s) => {
                let items = Self::items();
                for item in items {
                    if item.name == s {
                        return Some(item.value);
                    }
                }
            }
            _ => {}
        }
        None
    }

    fn resolve_enum(&self) -> Result<serde_json::Value> {
        let items = Self::items();
        for item in items {
            if item.value == *self {
                return Ok(item.name.clone().into());
            }
        }
        unreachable!()
    }
}