cynic_parser_deser/
error.rs

1use std::fmt;
2
3use cynic_parser::Span;
4
5use crate::{value::ValueType, DeserValue};
6
7// TODO: Should these errors have paths in them as well?
8
9#[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}