anyxml/
error.rs

1use anyxml_uri::ParseRIError;
2
3use crate::encoding::{DecodeError, EncodeError};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6pub enum XMLErrorLevel {
7    FatalError,
8    Error,
9    Warning,
10}
11
12impl std::fmt::Display for XMLErrorLevel {
13    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14        match *self {
15            Self::FatalError => write!(f, "fatal error"),
16            Self::Error => write!(f, "error"),
17            Self::Warning => write!(f, "warning"),
18        }
19    }
20}
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
23pub enum XMLErrorDomain {
24    Parser,
25    Namespace,
26    DTDValid,
27}
28
29impl std::fmt::Display for XMLErrorDomain {
30    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
31        match *self {
32            Self::Parser => write!(f, "parser"),
33            Self::Namespace => write!(f, "namespace"),
34            Self::DTDValid => write!(f, "dtd-valid"),
35        }
36    }
37}
38
39#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
40pub enum XMLError {
41    // general errors
42    InternalError,
43    // parser errors
44    ParserUnknownError,
45    ParserUnsupportedEncoding,
46    ParserUnsupportedXMLVersion,
47    ParserTooLongXMLVersionNumber,
48    PraserTooLongEncodingName,
49    ParserEmptyNmtoken,
50    ParserEmptyName,
51    ParserEmptyNCName,
52    ParserEmptyQName,
53    ParserEmptyQNamePrefix,
54    ParserEmptyQNameLocalPart,
55    ParserEmptyNmtokens,
56    ParserEmptyNames,
57    ParserInvalidNameStartChar,
58    ParserInvalidNameChar,
59    ParserInvalidNCNameStartChar,
60    ParserInvalidNCNameChar,
61    ParserInvalidQNameSeparator,
62    ParserIncorrectLiteralQuotation,
63    ParserInvalidSystemLiteral,
64    ParserSystemLiteralWithFragment,
65    ParserInvalidPubidLiteral,
66    ParserInvalidAttValue,
67    ParserInvalidExternalID,
68    ParserInvalidCharacter,
69    ParserInvalidXMLDecl,
70    ParserInvalidTextDecl,
71    ParserInvalidXMLVersion,
72    ParserInvalidEncodingDecl,
73    ParserInvalidEncodingName,
74    ParserInvalidSDDecl,
75    ParserInvalidComment,
76    ParserInvalidCDSect,
77    ParserInvalidStandaloneDocument,
78    ParserInvalidProcessingInstruction,
79    ParserUnacceptablePITarget,
80    ParserUnacceptablePatternInCharData,
81    ParserInvalidDoctypeDecl,
82    ParserInvalidElementDecl,
83    ParserDuplicateElementDecl,
84    ParserAmbiguousElementContentModel,
85    ParserDuplicateMixedContent,
86    ParserInvalidAttlistDecl,
87    ParserDuplicateAttlistDecl,
88    ParserDuplicateTokensInAttlistDecl,
89    ParserMultipleIDAttributePerElement,
90    ParserInvalidIDAttributeValue,
91    ParserInvalidIDREFAttributeValue,
92    ParserNotationAttlistDeclOnEmptyElement,
93    ParserSyntaxticallyIncorrectAttributeDefault,
94    ParserInvalidEntityDecl,
95    ParserDuplicateEntityDecl,
96    ParserInvalidNotationDecl,
97    ParserDuplicateNotationDecl,
98    ParserUndeclaredNotation,
99    ParserInvalidConditionalSect,
100    ParserInvalidStartOrEmptyTag,
101    ParserInvalidEndTag,
102    ParserUnclosedStartTag,
103    ParserMismatchElementType,
104    ParserMismatchElementContentModel,
105    ParserUndeclaredElement,
106    ParserInvalidAttribute,
107    ParserUndeclaredAttribute,
108    ParserDuplicateAttributes,
109    ParserDuplicateIDAttribute,
110    ParserUnresolvableIDReference,
111    ParserMultipleNotationAttributePerElement,
112    ParserUnacceptableNotationAttribute,
113    ParserUnacceptableEnumerationAttribute,
114    ParserMismatchFixedDefaultAttributeValue,
115    ParserRequiredAttributeNotFound,
116    ParserUnacceptableXMLSpaceAttribute,
117    ParserInvalidCharacterReference,
118    ParserInvalidEntityReference,
119    ParserEntityNotFound,
120    ParserEntityRecursion,
121    ParserEntityIncorrectNesting,
122    ParserUndeclaredEntityReference,
123    ParserNamespaceNameNotURI,
124    ParserNamespaceNameNotAbsoluteURI,
125    ParserUnacceptableNamespaceName,
126    ParserUndefinedNamespace,
127    ParserUnexpectedDocumentContent,
128    ParserUnexpectedEOF,
129    // I/O errors
130    IOUnknownError,
131    IONotFound,
132    IOPermissionDenied,
133    IOConnectionRefused,
134    IOConnectionReset,
135    IOHostUnreachable,
136    IONetworkUnreachable,
137    IOConnectionAborted,
138    IONotConnected,
139    IOAddrInUse,
140    IOAddrNotAvailable,
141    IONetworkDown,
142    IOBrokenPipe,
143    IOAlreadyExists,
144    IOWouldBlock,
145    IONotADirectory,
146    IOIsADirectory,
147    IODirectoryNotEmpty,
148    IOReadOnlyFilesystem,
149    IOFilesystemLoop,
150    IOStaleNetworkFileHandle,
151    IOInvalidInput,
152    IOInvalidData,
153    IOTimedOut,
154    IOWriteZero,
155    IOStorageFull,
156    IONotSeekable,
157    IOQuotaExceeded,
158    IOFileTooLarge,
159    IOResourceBusy,
160    IOExecutableFileBusy,
161    IODeadlock,
162    IOCrossesDevices,
163    IOTooManyLinks,
164    IOInvalidFilename,
165    IOArgumentListTooLong,
166    IOInterrupted,
167    IOUnsupported,
168    IOUnexpectedEof,
169    IOOutOfMemory,
170    IOInProgress,
171    // encoding errors
172    EncoderInputIsEmpty,
173    EncoderOutputTooShort,
174    EncoderUnmappable {
175        read: usize,
176        write: usize,
177        c: char,
178    },
179    EncoderUnknownError,
180    DecoderInputIsEmpty,
181    DecoderOutputTooShort,
182    DecoderMalformed {
183        read: usize,
184        write: usize,
185        length: usize,
186        offset: usize,
187    },
188    DecoderUnknownError,
189    // URI errors
190    URIParseFailure,
191    URIBaseURINotAbsolute,
192    URIBaseURINotFound,
193}
194
195impl std::fmt::Display for XMLError {
196    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
197        write!(f, "{self:?}")
198    }
199}
200
201impl std::error::Error for XMLError {}
202
203impl From<std::io::Error> for XMLError {
204    fn from(value: std::io::Error) -> Self {
205        use std::io::ErrorKind::*;
206        match value.kind() {
207            NotFound => XMLError::IONotFound,
208            PermissionDenied => XMLError::IOPermissionDenied,
209            ConnectionRefused => XMLError::IOConnectionRefused,
210            ConnectionReset => XMLError::IOConnectionReset,
211            HostUnreachable => XMLError::IOHostUnreachable,
212            NetworkUnreachable => XMLError::IONetworkUnreachable,
213            ConnectionAborted => XMLError::IOConnectionAborted,
214            NotConnected => XMLError::IONotConnected,
215            AddrInUse => XMLError::IOAddrInUse,
216            AddrNotAvailable => XMLError::IOAddrNotAvailable,
217            NetworkDown => XMLError::IONetworkDown,
218            BrokenPipe => XMLError::IOBrokenPipe,
219            AlreadyExists => XMLError::IOAlreadyExists,
220            WouldBlock => XMLError::IOWouldBlock,
221            NotADirectory => XMLError::IONotADirectory,
222            IsADirectory => XMLError::IOIsADirectory,
223            DirectoryNotEmpty => XMLError::IODirectoryNotEmpty,
224            ReadOnlyFilesystem => XMLError::IOReadOnlyFilesystem,
225            StaleNetworkFileHandle => XMLError::IOStaleNetworkFileHandle,
226            InvalidInput => XMLError::IOInvalidInput,
227            InvalidData => XMLError::IOInvalidData,
228            TimedOut => XMLError::IOTimedOut,
229            WriteZero => XMLError::IOWriteZero,
230            StorageFull => XMLError::IOStorageFull,
231            NotSeekable => XMLError::IONotSeekable,
232            QuotaExceeded => XMLError::IOQuotaExceeded,
233            FileTooLarge => XMLError::IOFileTooLarge,
234            ResourceBusy => XMLError::IOResourceBusy,
235            ExecutableFileBusy => XMLError::IOExecutableFileBusy,
236            Deadlock => XMLError::IODeadlock,
237            CrossesDevices => XMLError::IOCrossesDevices,
238            TooManyLinks => XMLError::IOTooManyLinks,
239            InvalidFilename => XMLError::IOInvalidFilename,
240            ArgumentListTooLong => XMLError::IOArgumentListTooLong,
241            Interrupted => XMLError::IOInterrupted,
242            Unsupported => XMLError::IOUnsupported,
243            UnexpectedEof => XMLError::IOUnexpectedEof,
244            OutOfMemory => XMLError::IOOutOfMemory,
245            Other => XMLError::IOUnknownError,
246            _ => unimplemented!(),
247        }
248    }
249}
250
251impl From<EncodeError> for XMLError {
252    fn from(value: EncodeError) -> Self {
253        use EncodeError::*;
254        match value {
255            InputIsEmpty => XMLError::EncoderInputIsEmpty,
256            OutputTooShort => XMLError::EncoderOutputTooShort,
257            Unmappable { read, write, c } => XMLError::EncoderUnmappable { read, write, c },
258            Other { msg: _ } => XMLError::EncoderUnknownError,
259        }
260    }
261}
262
263impl From<DecodeError> for XMLError {
264    fn from(value: DecodeError) -> Self {
265        use DecodeError::*;
266        match value {
267            InputIsEmpty => XMLError::DecoderInputIsEmpty,
268            OutputTooShort => XMLError::DecoderOutputTooShort,
269            Malformed {
270                read,
271                write,
272                length,
273                offset,
274            } => XMLError::DecoderMalformed {
275                read,
276                write,
277                length,
278                offset,
279            },
280            Other { msg: _ } => XMLError::DecoderUnknownError,
281        }
282    }
283}
284
285impl From<ParseRIError> for XMLError {
286    fn from(_: ParseRIError) -> Self {
287        Self::URIParseFailure
288    }
289}