1use crate::collections::eq_unique_by_name;
55use crate::collections::hash_unordered;
56use crate::collections::IndexSet;
57use crate::parser::SourceMap;
58use crate::Name;
59use crate::Node;
60use std::hash::Hash;
61use std::hash::Hasher;
62
63pub(crate) mod from_cst;
64pub(crate) mod impls;
65pub(crate) mod serialize;
66
67pub use self::serialize::Serialize;
68
69#[derive(Clone)]
75pub struct Document {
76 pub sources: SourceMap,
82
83 pub definitions: Vec<Definition>,
84}
85
86const _: () = {
87 const fn assert_send<T: Send>() {}
88 const fn assert_sync<T: Sync>() {}
89 assert_send::<Document>();
90 assert_sync::<Document>();
91};
92
93pub type NamedType = Name;
96
97#[derive(Clone, Eq, PartialEq, Hash)]
100pub enum Definition {
101 OperationDefinition(Node<OperationDefinition>),
102 FragmentDefinition(Node<FragmentDefinition>),
103 DirectiveDefinition(Node<DirectiveDefinition>),
104 SchemaDefinition(Node<SchemaDefinition>),
105 ScalarTypeDefinition(Node<ScalarTypeDefinition>),
106 ObjectTypeDefinition(Node<ObjectTypeDefinition>),
107 InterfaceTypeDefinition(Node<InterfaceTypeDefinition>),
108 UnionTypeDefinition(Node<UnionTypeDefinition>),
109 EnumTypeDefinition(Node<EnumTypeDefinition>),
110 InputObjectTypeDefinition(Node<InputObjectTypeDefinition>),
111 SchemaExtension(Node<SchemaExtension>),
112 ScalarTypeExtension(Node<ScalarTypeExtension>),
113 ObjectTypeExtension(Node<ObjectTypeExtension>),
114 InterfaceTypeExtension(Node<InterfaceTypeExtension>),
115 UnionTypeExtension(Node<UnionTypeExtension>),
116 EnumTypeExtension(Node<EnumTypeExtension>),
117 InputObjectTypeExtension(Node<InputObjectTypeExtension>),
118}
119
120#[derive(Clone, Debug, Eq, PartialEq, Hash)]
123pub struct OperationDefinition {
124 pub description: Option<Node<str>>,
125 pub operation_type: OperationType,
126 pub name: Option<Name>,
127 pub variables: Vec<Node<VariableDefinition>>,
128 pub directives: DirectiveList,
129 pub selection_set: Vec<Selection>,
130}
131
132#[derive(Clone, Debug, Eq, PartialEq, Hash)]
135pub struct FragmentDefinition {
136 pub description: Option<Node<str>>,
137 pub name: Name,
138 pub type_condition: NamedType,
139 pub directives: DirectiveList,
140 pub selection_set: Vec<Selection>,
141}
142
143#[derive(Clone, Debug, Eq)]
146pub struct DirectiveDefinition {
147 pub description: Option<Node<str>>,
148 pub name: Name,
149 pub arguments: Vec<Node<InputValueDefinition>>,
150 pub repeatable: bool,
151 pub locations: IndexSet<DirectiveLocation>,
152}
153
154impl PartialEq for DirectiveDefinition {
155 fn eq(&self, other: &Self) -> bool {
156 self.description == other.description
157 && self.name == other.name
158 && eq_unique_by_name(&self.arguments, &other.arguments, |a| &a.name)
159 && self.repeatable == other.repeatable
160 && self.locations == other.locations
161 }
162}
163
164impl Hash for DirectiveDefinition {
165 fn hash<H: Hasher>(&self, state: &mut H) {
166 self.description.hash(state);
167 self.name.hash(state);
168 hash_unordered(self.arguments.iter(), state, self.arguments.len());
169 self.repeatable.hash(state);
170 hash_unordered(self.locations.iter(), state, self.locations.len());
171 }
172}
173
174#[derive(Clone, Debug, Eq, PartialEq, Hash)]
177pub struct SchemaDefinition {
178 pub description: Option<Node<str>>,
179 pub directives: DirectiveList,
180 pub root_operations: Vec<Node<(OperationType, NamedType)>>,
181}
182
183#[derive(Clone, Debug, Eq, PartialEq, Hash)]
186pub struct ScalarTypeDefinition {
187 pub description: Option<Node<str>>,
188 pub name: Name,
189 pub directives: DirectiveList,
190}
191
192#[derive(Clone, Debug, Eq, PartialEq, Hash)]
195pub struct ObjectTypeDefinition {
196 pub description: Option<Node<str>>,
197 pub name: Name,
198 pub implements_interfaces: Vec<Name>,
199 pub directives: DirectiveList,
200 pub fields: Vec<Node<FieldDefinition>>,
201}
202
203#[derive(Clone, Debug, Eq, PartialEq, Hash)]
206pub struct InterfaceTypeDefinition {
207 pub description: Option<Node<str>>,
208 pub name: Name,
209 pub implements_interfaces: Vec<Name>,
210 pub directives: DirectiveList,
211 pub fields: Vec<Node<FieldDefinition>>,
212}
213
214#[derive(Clone, Debug, Eq, PartialEq, Hash)]
217pub struct UnionTypeDefinition {
218 pub description: Option<Node<str>>,
219 pub name: Name,
220 pub directives: DirectiveList,
221 pub members: Vec<NamedType>,
222}
223
224#[derive(Clone, Debug, Eq, PartialEq, Hash)]
227pub struct EnumTypeDefinition {
228 pub description: Option<Node<str>>,
229 pub name: Name,
230 pub directives: DirectiveList,
231 pub values: Vec<Node<EnumValueDefinition>>,
232}
233
234#[derive(Clone, Debug, Eq, PartialEq, Hash)]
237pub struct InputObjectTypeDefinition {
238 pub description: Option<Node<str>>,
239 pub name: Name,
240 pub directives: DirectiveList,
241 pub fields: Vec<Node<InputValueDefinition>>,
242}
243
244#[derive(Clone, Debug, Eq, PartialEq, Hash)]
247pub struct SchemaExtension {
248 pub directives: DirectiveList,
249 pub root_operations: Vec<Node<(OperationType, NamedType)>>,
250}
251
252#[derive(Clone, Debug, Eq, PartialEq, Hash)]
255pub struct ScalarTypeExtension {
256 pub name: Name,
257 pub directives: DirectiveList,
258}
259
260#[derive(Clone, Debug, Eq, PartialEq, Hash)]
263pub struct ObjectTypeExtension {
264 pub name: Name,
265 pub implements_interfaces: Vec<Name>,
266 pub directives: DirectiveList,
267 pub fields: Vec<Node<FieldDefinition>>,
268}
269
270#[derive(Clone, Debug, Eq, PartialEq, Hash)]
273pub struct InterfaceTypeExtension {
274 pub name: Name,
275 pub implements_interfaces: Vec<Name>,
276 pub directives: DirectiveList,
277 pub fields: Vec<Node<FieldDefinition>>,
278}
279
280#[derive(Clone, Debug, Eq, PartialEq, Hash)]
283pub struct UnionTypeExtension {
284 pub name: Name,
285 pub directives: DirectiveList,
286 pub members: Vec<NamedType>,
287}
288
289#[derive(Clone, Debug, Eq, PartialEq, Hash)]
292pub struct EnumTypeExtension {
293 pub name: Name,
294 pub directives: DirectiveList,
295 pub values: Vec<Node<EnumValueDefinition>>,
296}
297
298#[derive(Clone, Debug, Eq, PartialEq, Hash)]
301pub struct InputObjectTypeExtension {
302 pub name: Name,
303 pub directives: DirectiveList,
304 pub fields: Vec<Node<InputValueDefinition>>,
305}
306
307#[derive(Clone, Debug, Eq, PartialEq, Hash)]
310pub struct Argument {
311 pub name: Name,
312 pub value: Node<Value>,
313}
314
315#[derive(Clone, Eq, PartialEq, Hash, Default)]
323pub struct DirectiveList(pub Vec<Node<Directive>>);
324
325#[derive(Clone, Debug, Eq)]
327pub struct Directive {
328 pub name: Name,
329 pub arguments: Vec<Node<Argument>>,
330}
331
332impl PartialEq for Directive {
333 fn eq(&self, other: &Self) -> bool {
334 self.name == other.name && eq_unique_by_name(&self.arguments, &other.arguments, |a| &a.name)
335 }
336}
337
338impl Hash for Directive {
339 fn hash<H: Hasher>(&self, state: &mut H) {
340 self.name.hash(state);
341 hash_unordered(self.arguments.iter(), state, self.arguments.len());
342 }
343}
344
345#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
348pub enum OperationType {
349 Query,
350 Mutation,
351 Subscription,
352}
353
354#[derive(Copy, Clone, Hash, PartialEq, Eq)]
357pub enum DirectiveLocation {
358 Query,
359 Mutation,
360 Subscription,
361 Field,
362 FragmentDefinition,
363 FragmentSpread,
364 InlineFragment,
365 VariableDefinition,
366 Schema,
367 Scalar,
368 Object,
369 FieldDefinition,
370 ArgumentDefinition,
371 Interface,
372 Union,
373 Enum,
374 EnumValue,
375 InputObject,
376 InputFieldDefinition,
377}
378
379#[derive(Clone, Debug, Eq, PartialEq, Hash)]
382pub struct VariableDefinition {
383 pub description: Option<Node<str>>,
384 pub name: Name,
385 pub ty: Node<Type>,
386 pub default_value: Option<Node<Value>>,
387 pub directives: DirectiveList,
388}
389
390#[derive(Clone, Debug, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)]
392pub enum Type {
393 Named(NamedType),
395
396 NonNullNamed(NamedType),
398
399 List(Box<Type>),
402
403 NonNullList(Box<Type>),
406}
407
408#[derive(Clone, Debug, Eq)]
411pub struct FieldDefinition {
412 pub description: Option<Node<str>>,
413 pub name: Name,
414 pub arguments: Vec<Node<InputValueDefinition>>,
415 pub ty: Type,
416 pub directives: DirectiveList,
417}
418
419impl PartialEq for FieldDefinition {
420 fn eq(&self, other: &Self) -> bool {
421 self.description == other.description
422 && self.name == other.name
423 && eq_unique_by_name(&self.arguments, &other.arguments, |a| &a.name)
424 && self.ty == other.ty
425 && self.directives == other.directives
426 }
427}
428
429impl Hash for FieldDefinition {
430 fn hash<H: Hasher>(&self, state: &mut H) {
431 self.description.hash(state);
432 self.name.hash(state);
433 hash_unordered(self.arguments.iter(), state, self.arguments.len());
434 self.ty.hash(state);
435 self.directives.hash(state);
436 }
437}
438
439#[derive(Clone, Debug, Eq, PartialEq, Hash)]
443pub struct InputValueDefinition {
444 pub description: Option<Node<str>>,
445 pub name: Name,
446 pub ty: Node<Type>,
447 pub default_value: Option<Node<Value>>,
448 pub directives: DirectiveList,
449}
450
451#[derive(Clone, Debug, Eq, PartialEq, Hash)]
455pub struct EnumValueDefinition {
456 pub description: Option<Node<str>>,
457 pub value: Name,
458 pub directives: DirectiveList,
459}
460
461#[derive(Clone, Debug, Eq, PartialEq, Hash)]
464pub enum Selection {
465 Field(Node<Field>),
466 FragmentSpread(Node<FragmentSpread>),
467 InlineFragment(Node<InlineFragment>),
468}
469
470#[derive(Clone, Debug, Eq)]
473pub struct Field {
474 pub alias: Option<Name>,
475 pub name: Name,
476 pub arguments: Vec<Node<Argument>>,
477 pub directives: DirectiveList,
478 pub selection_set: Vec<Selection>,
479}
480
481impl PartialEq for Field {
482 fn eq(&self, other: &Self) -> bool {
483 self.alias == other.alias
484 && self.name == other.name
485 && eq_unique_by_name(&self.arguments, &other.arguments, |a| &a.name)
486 && self.directives == other.directives
487 && self.selection_set == other.selection_set
488 }
489}
490
491impl Hash for Field {
492 fn hash<H: Hasher>(&self, state: &mut H) {
493 self.alias.hash(state);
494 self.name.hash(state);
495 hash_unordered(self.arguments.iter(), state, self.arguments.len());
496 self.directives.hash(state);
497 self.selection_set.hash(state);
498 }
499}
500
501#[derive(Clone, Debug, Eq, PartialEq, Hash)]
505pub struct FragmentSpread {
506 pub fragment_name: Name,
507 pub directives: DirectiveList,
508}
509
510#[derive(Clone, Debug, Eq, PartialEq, Hash)]
514pub struct InlineFragment {
515 pub type_condition: Option<NamedType>,
516 pub directives: DirectiveList,
517 pub selection_set: Vec<Selection>,
518}
519
520#[derive(Clone, Debug, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)]
522pub enum Value {
523 Null,
525
526 Enum(Name),
528
529 Variable(Name),
531
532 String(
534 String,
537 ),
538
539 Float(FloatValue),
541
542 Int(IntValue),
544
545 Boolean(bool),
547
548 List(Vec<Node<Value>>),
550
551 Object(Vec<(Name, Node<Value>)>),
553}
554
555#[derive(Clone, Eq, PartialEq, Hash)]
558pub struct IntValue(String);
559
560#[derive(Clone, Eq, PartialEq, Hash)]
563pub struct FloatValue(String);
564
565#[derive(Clone, Eq, PartialEq)]
568#[non_exhaustive]
569pub struct FloatOverflowError {}
570
571#[derive(Debug, Clone, PartialEq, Eq)]
574pub enum ArgumentByNameError {
575 UndefinedDirective,
577 NoSuchArgument,
579 RequiredArgumentNotSpecified,
582}