bluejay_validator/definition/
error.rs1use bluejay_core::definition::{InputObjectTypeDefinition, SchemaDefinition};
2
3#[cfg(feature = "parser-integration")]
4use bluejay_parser::{
5 ast::definition::SchemaDefinition as ParserSchemaDefinition,
6 error::{Annotation, Error as ParserError},
7 HasSpan,
8};
9
10pub enum Error<'a, S: SchemaDefinition> {
11 NonUniqueInputValueDefinitionNames {
12 name: &'a str,
13 input_value_definitions: Vec<&'a S::InputValueDefinition>,
14 },
15 NonUniqueEnumValueDefinitionNames {
16 name: &'a str,
17 enum_value_definitions: Vec<&'a S::EnumValueDefinition>,
18 },
19 InputObjectTypeDefinitionCircularReferences {
20 input_object_type_definition: &'a S::InputObjectTypeDefinition,
21 circular_references: Vec<&'a S::InputType>,
22 },
23}
24
25#[cfg(feature = "parser-integration")]
26impl<'a> From<Error<'a, ParserSchemaDefinition<'a>>> for ParserError {
27 fn from(value: Error<'a, ParserSchemaDefinition<'a>>) -> Self {
28 match value {
29 Error::NonUniqueInputValueDefinitionNames {
30 name,
31 input_value_definitions,
32 } => Self::new(
33 format!("Multiple input value definitions named `{name}`"),
34 None,
35 input_value_definitions
36 .into_iter()
37 .map(|ivd| {
38 Annotation::new(
39 format!("Input value definition with name `{name}`"),
40 ivd.name_token().span().clone(),
41 )
42 })
43 .collect(),
44 ),
45 Error::NonUniqueEnumValueDefinitionNames {
46 name,
47 enum_value_definitions,
48 } => Self::new(
49 format!("Multiple enum value definitions named `{name}`"),
50 None,
51 enum_value_definitions
52 .into_iter()
53 .map(|evd| {
54 Annotation::new(
55 format!("Enum value definition with name `{name}`"),
56 evd.name_token().span().clone(),
57 )
58 })
59 .collect(),
60 ),
61 Error::InputObjectTypeDefinitionCircularReferences {
62 input_object_type_definition,
63 circular_references,
64 } => {
65 Self::new(
66 format!(
67 "Input object type definition `{}` contains disallowed circular reference(s)",
68 input_object_type_definition.name()
69 ),
70 Some(Annotation::new(
71 "Input object type definition contains circular reference(s) through an unbroken chain of non-null singular fields, which is disallowed",
72 input_object_type_definition.name_token().span().clone(),
73 )),
74 circular_references
75 .into_iter()
76 .map(|circular_reference| {
77 Annotation::new(
78 "Occurence of circular reference",
79 circular_reference.span().clone(),
80 )
81 })
82 .collect(),
83 )
84 }
85 }
86 }
87}