apollo_encoder/
input_object_def.rs1use std::fmt;
2
3use crate::{Directive, InputField, StringValue};
4
5#[derive(Debug, Clone)]
48pub struct InputObjectDefinition {
49 name: String,
51 description: Option<StringValue>,
53 fields: Vec<InputField>,
55 directives: Vec<Directive>,
57 extend: bool,
58}
59
60impl InputObjectDefinition {
61 pub fn new(name: String) -> Self {
63 Self {
64 name,
65 description: None,
66 fields: Vec::new(),
67 directives: Vec::new(),
68 extend: false,
69 }
70 }
71
72 pub fn extend(&mut self) {
74 self.extend = true;
75 }
76
77 pub fn description(&mut self, description: String) {
79 self.description = Some(StringValue::Top {
80 source: description,
81 });
82 }
83
84 pub fn field(&mut self, field: InputField) {
86 self.fields.push(field)
87 }
88
89 pub fn directive(&mut self, directive: Directive) {
91 self.directives.push(directive)
92 }
93}
94
95impl fmt::Display for InputObjectDefinition {
96 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
97 if self.extend {
98 write!(f, "extend ")?;
99 } else if let Some(description) = &self.description {
101 writeln!(f, "{description}")?;
102 }
103
104 write!(f, "input {}", &self.name)?;
105
106 for directive in &self.directives {
107 write!(f, " {directive}")?;
108 }
109 write!(f, " {{")?;
110
111 for field in &self.fields {
112 write!(f, "\n{field}")?;
113 }
114 writeln!(f, "\n}}")
115 }
116}
117
118#[cfg(test)]
119mod tests {
120 use super::*;
121 use crate::{Argument, InputField, Type_, Value};
122 use indoc::indoc;
123 use pretty_assertions::assert_eq;
124
125 #[test]
126 fn it_encodes_input_object() {
127 let ty_1 = Type_::NamedType {
128 name: "DanglerPoleToys".to_string(),
129 };
130
131 let ty_2 = Type_::List { ty: Box::new(ty_1) };
132 let mut field = InputField::new("toys".to_string(), ty_2);
133 field.default_value("\"Cat Dangler Pole Bird\"".to_string());
134 let ty_3 = Type_::NamedType {
135 name: "FavouriteSpots".to_string(),
136 };
137 let mut field_2 = InputField::new("playSpot".to_string(), ty_3);
138 field_2.description("Best playime spots, e.g. tree, bed.".to_string());
139 let mut directive = Directive::new(String::from("testDirective"));
140 directive.arg(Argument::new(
141 String::from("first"),
142 Value::String("one".to_string()),
143 ));
144
145 let mut input_def = InputObjectDefinition::new("PlayTime".to_string());
146 input_def.field(field);
147 input_def.field(field_2);
148 input_def.directive(directive);
149
150 assert_eq!(
151 input_def.to_string(),
152 indoc! { r#"
153 input PlayTime @testDirective(first: "one") {
154 toys: [DanglerPoleToys] = "Cat Dangler Pole Bird"
155 "Best playime spots, e.g. tree, bed."
156 playSpot: FavouriteSpots
157 }
158 "#}
159 );
160 }
161
162 #[test]
163 fn it_encodes_input_object_with_description() {
164 let ty_1 = Type_::NamedType {
165 name: "DanglerPoleToys".to_string(),
166 };
167
168 let ty_2 = Type_::List { ty: Box::new(ty_1) };
169 let mut field = InputField::new("toys".to_string(), ty_2);
170 field.default_value("\"Cat Dangler Pole Bird\"".to_string());
171 let ty_3 = Type_::NamedType {
172 name: "FavouriteSpots".to_string(),
173 };
174 let mut field_2 = InputField::new("playSpot".to_string(), ty_3);
175 field_2.description("Best playime spots, e.g. tree, bed.".to_string());
176
177 let mut input_def = InputObjectDefinition::new("PlayTime".to_string());
178 input_def.field(field);
179 input_def.field(field_2);
180 input_def.description("Cat playtime input".to_string());
181
182 assert_eq!(
183 input_def.to_string(),
184 indoc! { r#"
185 "Cat playtime input"
186 input PlayTime {
187 toys: [DanglerPoleToys] = "Cat Dangler Pole Bird"
188 "Best playime spots, e.g. tree, bed."
189 playSpot: FavouriteSpots
190 }
191 "#}
192 );
193 }
194
195 #[test]
196 fn it_encodes_input_object_extension() {
197 let ty_1 = Type_::NamedType {
198 name: "DanglerPoleToys".to_string(),
199 };
200
201 let ty_2 = Type_::List { ty: Box::new(ty_1) };
202 let mut field = InputField::new("toys".to_string(), ty_2);
203 field.default_value("\"Cat Dangler Pole Bird\"".to_string());
204 let ty_3 = Type_::NamedType {
205 name: "FavouriteSpots".to_string(),
206 };
207 let mut field_2 = InputField::new("playSpot".to_string(), ty_3);
208 field_2.description("Best playime spots, e.g. tree, bed.".to_string());
209
210 let mut input_def = InputObjectDefinition::new("PlayTime".to_string());
211 input_def.field(field);
212 input_def.field(field_2);
213 input_def.description("Cat playtime input".to_string());
214 input_def.extend();
215
216 assert_eq!(
217 input_def.to_string(),
218 indoc! { r#"
219 extend input PlayTime {
220 toys: [DanglerPoleToys] = "Cat Dangler Pole Bird"
221 "Best playime spots, e.g. tree, bed."
222 playSpot: FavouriteSpots
223 }
224 "#}
225 );
226 }
227}