async_graphql/resolver_utils/
enum.rs1use crate::{InputType, InputValueError, InputValueResult, Name, Value};
2
3pub struct EnumItem<T> {
5 pub name: &'static str,
7 pub value: T,
9}
10
11pub trait EnumType: Sized + Eq + Send + Copy + Sized + 'static {
13 fn items() -> &'static [EnumItem<Self>];
15}
16
17pub fn parse_enum<T: EnumType + InputType>(value: Value) -> InputValueResult<T> {
21 let value = match &value {
22 Value::Enum(s) => s,
23 Value::String(s) => s.as_str(),
24 _ => return Err(InputValueError::expected_type(value)),
25 };
26
27 T::items()
28 .iter()
29 .find(|item| item.name == value)
30 .map(|item| item.value)
31 .ok_or_else(|| {
32 InputValueError::custom(format_args!(
33 r#"Enumeration type does not contain value "{}"."#,
34 value,
35 ))
36 })
37}
38
39pub fn enum_value<T: EnumType>(value: T) -> Value {
44 let item = T::items().iter().find(|item| item.value == value).unwrap();
45 Value::Enum(Name::new(item.name))
46}