Skip to main content

oi4_dnp_encoding/
error.rs

1#![allow(clippy::derive_partial_eq_without_eq)]
2use core::fmt;
3
4#[derive(Debug, Clone, PartialEq)]
5pub struct Error {
6    kind: ErrorKind,
7    pos: Option<usize>,
8}
9
10impl Error {
11    pub const fn new(kind: ErrorKind, pos: Option<usize>) -> Self {
12        Self { kind, pos }
13    }
14    pub const fn kind(&self) -> &ErrorKind {
15        &self.kind
16    }
17    pub const fn position(&self) -> Option<usize> {
18        self.pos
19    }
20}
21
22#[derive(Debug, Clone, PartialEq)]
23pub enum ErrorKind {
24    InvalidHexDigit(char),
25    LoneComma,
26    LowercaseHexInStrict,
27    UnescapedReservedAscii(char),
28}
29
30impl fmt::Display for ErrorKind {
31    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32        match self {
33            Self::InvalidHexDigit(c) => write!(f, "invalid hex digit '{c}'"),
34            Self::LoneComma => write!(f, "lone comma without two hex digits"),
35            Self::LowercaseHexInStrict => write!(f, "lowercase hex not allowed in strict mode"),
36            Self::UnescapedReservedAscii(c) => write!(f, "unescaped reserved ASCII '{c}'"),
37        }
38    }
39}
40
41impl fmt::Display for Error {
42    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43        if let Some(p) = self.pos {
44            write!(f, "{} at position {p}", self.kind)
45        } else {
46            write!(f, "{}", self.kind)
47        }
48    }
49}
50
51#[cfg(feature = "std")]
52impl std::error::Error for Error {}