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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use crate::static_graphql::query::{self};
use crate::static_graphql::schema::{self, Field, InterfaceType, ObjectType, UnionType};
use super::get_named_type;
pub trait AstNodeWithFields {
fn find_field(&self, name: String) -> Option<&Field>;
}
impl AstNodeWithFields for ObjectType {
fn find_field(&self, name: String) -> Option<&Field> {
self.fields.iter().find(|f| f.name == name)
}
}
impl AstNodeWithFields for InterfaceType {
fn find_field(&self, name: String) -> Option<&Field> {
self.fields.iter().find(|f| f.name == name)
}
}
impl AstNodeWithFields for UnionType {
fn find_field(&self, _name: String) -> Option<&Field> {
None
}
}
pub trait AstTypeRef {
fn named_type(&self) -> String;
}
impl AstTypeRef for query::Type {
fn named_type(&self) -> String {
get_named_type(self)
}
}
#[derive(Debug, Clone)]
pub enum CompositeType {
Object(schema::ObjectType),
Interface(schema::InterfaceType),
Union(schema::UnionType),
}
impl CompositeType {
pub fn find_field(&self, name: String) -> Option<&Field> {
match self {
CompositeType::Object(o) => o.find_field(name),
CompositeType::Interface(i) => i.find_field(name),
CompositeType::Union(u) => u.find_field(name),
}
}
pub fn from_type_definition(t: &schema::TypeDefinition) -> Option<Self> {
match t {
schema::TypeDefinition::Object(o) => Some(CompositeType::Object(o.clone())),
schema::TypeDefinition::Interface(i) => Some(CompositeType::Interface(i.clone())),
schema::TypeDefinition::Union(u) => Some(CompositeType::Union(u.clone())),
_ => None,
}
}
}
pub trait TypeDefinitionExtension {
fn is_leaf_type(&self) -> bool;
fn is_composite_type(&self) -> bool;
fn is_input_type(&self) -> bool;
fn name(&self) -> String;
}
impl TypeDefinitionExtension for schema::TypeDefinition {
fn name(&self) -> String {
match self {
schema::TypeDefinition::Object(o) => o.name.clone(),
schema::TypeDefinition::Interface(i) => i.name.clone(),
schema::TypeDefinition::Union(u) => u.name.clone(),
schema::TypeDefinition::Scalar(s) => s.name.clone(),
schema::TypeDefinition::Enum(e) => e.name.clone(),
schema::TypeDefinition::InputObject(i) => i.name.clone(),
}
}
fn is_leaf_type(&self) -> bool {
match self {
schema::TypeDefinition::Object(_o) => false,
schema::TypeDefinition::Interface(_i) => false,
schema::TypeDefinition::Union(_u) => false,
schema::TypeDefinition::Scalar(_u) => true,
schema::TypeDefinition::Enum(_u) => true,
schema::TypeDefinition::InputObject(_u) => false,
}
}
fn is_input_type(&self) -> bool {
match self {
schema::TypeDefinition::Object(_o) => false,
schema::TypeDefinition::Interface(_i) => false,
schema::TypeDefinition::Union(_u) => false,
schema::TypeDefinition::Scalar(_u) => false,
schema::TypeDefinition::Enum(_u) => false,
schema::TypeDefinition::InputObject(_u) => true,
}
}
fn is_composite_type(&self) -> bool {
match self {
schema::TypeDefinition::Object(_o) => true,
schema::TypeDefinition::Interface(_i) => true,
schema::TypeDefinition::Union(_u) => true,
schema::TypeDefinition::Scalar(_u) => false,
schema::TypeDefinition::Enum(_u) => false,
schema::TypeDefinition::InputObject(_u) => false,
}
}
}