1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use crate::dynamic::{Field, InputValue, Interface, InterfaceField, Object, TypeRef};

pub(crate) trait BaseField {
    fn ty(&self) -> &TypeRef;

    fn argument(&self, name: &str) -> Option<&InputValue>;
}

pub(crate) trait BaseContainer {
    type FieldType: BaseField;

    fn name(&self) -> &str;

    fn graphql_type(&self) -> &str;

    fn field(&self, name: &str) -> Option<&Self::FieldType>;
}

impl BaseField for Field {
    #[inline]
    fn ty(&self) -> &TypeRef {
        &self.ty
    }

    #[inline]
    fn argument(&self, name: &str) -> Option<&InputValue> {
        self.arguments.get(name)
    }
}

impl BaseContainer for Object {
    type FieldType = Field;

    #[inline]
    fn name(&self) -> &str {
        &self.name
    }

    fn graphql_type(&self) -> &str {
        "Object"
    }

    #[inline]
    fn field(&self, name: &str) -> Option<&Self::FieldType> {
        self.fields.get(name)
    }
}

impl BaseField for InterfaceField {
    #[inline]
    fn ty(&self) -> &TypeRef {
        &self.ty
    }

    #[inline]
    fn argument(&self, name: &str) -> Option<&InputValue> {
        self.arguments.get(name)
    }
}

impl BaseContainer for Interface {
    type FieldType = InterfaceField;

    #[inline]
    fn name(&self) -> &str {
        &self.name
    }

    fn graphql_type(&self) -> &str {
        "Interface"
    }

    #[inline]
    fn field(&self, name: &str) -> Option<&Self::FieldType> {
        self.fields.get(name)
    }
}