bluejay_validator/definition/
error.rs

1use 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}