cynic_parser_deser/
error.rs1use std::fmt;
2
3use cynic_parser::Span;
4
5use crate::{value::ValueType, DeserValue};
6
7#[derive(Debug)]
10pub enum Error {
11 UnexpectedType {
12 expected: ValueType,
13 found: ValueType,
14 span: Option<Span>,
15 },
16 MissingField {
17 name: String,
18 object_span: Option<Span>,
19 },
20 UnknownField {
21 name: String,
22 field_type: ValueType,
23 field_span: Option<Span>,
24 },
25 DuplicateField {
26 name: String,
27 original_field_span: Option<Span>,
28 duplicate_field_span: Option<Span>,
29 },
30 Custom {
31 text: String,
32 span: Option<Span>,
33 },
34}
35
36impl fmt::Display for Error {
37 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38 match self {
39 Error::UnexpectedType {
40 expected, found, ..
41 } => write!(f, "found a {found} where we expected a {expected}"),
42 Error::MissingField { name, .. } => write!(f, "missing field: {name}"),
43 Error::UnknownField { name, .. } => write!(f, "unknown field: {name}"),
44 Error::DuplicateField { name, .. } => write!(f, "duplicate field: {name}"),
45 Error::Custom { text, .. } => write!(f, "{text}"),
46 }
47 }
48}
49
50impl std::error::Error for Error {}
51
52impl Error {
53 pub fn unexpected_type(expected: ValueType, found: DeserValue<'_>) -> Self {
54 Error::UnexpectedType {
55 expected,
56 found: ValueType::from(found),
57 span: found.span(),
58 }
59 }
60
61 pub fn custom(text: impl Into<String>, span: Option<Span>) -> Self {
62 Error::Custom {
63 text: text.into(),
64 span,
65 }
66 }
67}