oi4_dnp_encoding/
error.rs1#![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 {}