Skip to main content

zjson/multi_document/
error.rs

1use core::fmt;
2
3use crate::{any, array, literal, number, object, string};
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
6/// The error returned when parsing a [`MultiDocument`](super::MultiDocument) fails.
7pub enum ParseMultiDocumentError {
8    /// A character that was not the start of a valid element was found.
9    InvalidElement(char),
10}
11
12impl fmt::Display for ParseMultiDocumentError {
13    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
14        match self {
15            Self::InvalidElement(c) => write!(
16                f,
17                "Invalid character ({c}) in JSON document (expected an element)!"
18            ),
19        }
20    }
21}
22
23#[cfg(feature = "std")]
24impl std::error::Error for ParseMultiDocumentError {}
25
26#[allow(clippy::module_name_repetitions)]
27#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
28/// The error returned when finishing parsing a [`MultiDocument`](super::MultiDocument) fails.
29pub enum ParseAnyMultiDocumentError {
30    /// Parsing the document failed.
31    MultiDocument(ParseMultiDocumentError),
32    /// Parsing a child failed.
33    Any(any::ParseAnyError),
34}
35
36impl fmt::Display for ParseAnyMultiDocumentError {
37    #[inline]
38    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39        match self {
40            Self::MultiDocument(err) => err.fmt(f),
41            Self::Any(err) => err.fmt(f),
42        }
43    }
44}
45
46#[cfg(feature = "std")]
47impl std::error::Error for ParseAnyMultiDocumentError {
48    #[inline]
49    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
50        Some(match self {
51            Self::MultiDocument(err) => err,
52            Self::Any(err) => err,
53        })
54    }
55}
56
57impl From<ParseMultiDocumentError> for ParseAnyMultiDocumentError {
58    #[inline]
59    fn from(value: ParseMultiDocumentError) -> Self {
60        Self::MultiDocument(value)
61    }
62}
63
64impl From<any::ParseAnyError> for ParseAnyMultiDocumentError {
65    #[inline]
66    fn from(value: any::ParseAnyError) -> Self {
67        Self::Any(value)
68    }
69}
70
71impl From<string::ParseStringError> for ParseAnyMultiDocumentError {
72    #[inline]
73    fn from(value: string::ParseStringError) -> Self {
74        Self::Any(value.into())
75    }
76}
77
78impl From<number::ParseNumberError> for ParseAnyMultiDocumentError {
79    #[inline]
80    fn from(value: number::ParseNumberError) -> Self {
81        Self::Any(value.into())
82    }
83}
84
85impl From<object::ParseObjectError> for ParseAnyMultiDocumentError {
86    #[inline]
87    fn from(value: object::ParseObjectError) -> Self {
88        Self::Any(value.into())
89    }
90}
91
92impl From<array::ParseArrayError> for ParseAnyMultiDocumentError {
93    #[inline]
94    fn from(value: array::ParseArrayError) -> Self {
95        Self::Any(value.into())
96    }
97}
98
99impl From<literal::ParseLiteralError> for ParseAnyMultiDocumentError {
100    #[inline]
101    fn from(value: literal::ParseLiteralError) -> Self {
102        Self::Any(value.into())
103    }
104}