dsmr_parse/telegram/
error.rs

1use core::fmt;
2use core::num::{ParseFloatError, ParseIntError};
3use core::str::Utf8Error;
4use std::io;
5use std::string::FromUtf8Error;
6
7#[derive(Debug)]
8pub enum Error {
9	Io(io::Error),
10	NonUtf8Parse(Utf8Error),
11	NonUtf8Val(FromUtf8Error),
12	InvalidInt(ParseIntError),
13	InvalidFloat(ParseFloatError),
14	CrcMismatch(u16, u16),
15}
16
17impl fmt::Display for Error {
18	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19		match self {
20			Error::Io(e) => write!(f, "IO error: {e}, details: {e:?}"),
21			Error::NonUtf8Parse(e) => write!(f, "Non UTF-8 string: {e}, details: {e:?}"),
22			Error::NonUtf8Val(e) => write!(f, "Non UTF-8 string: {e}, details: {e:?}"),
23			Error::InvalidInt(e) => write!(f, "Invalid integer: {e}, details: {e:?}"),
24			Error::InvalidFloat(e) => write!(f, "Invalid float: {e}, details: {e:?}"),
25			Error::CrcMismatch(actual, expected) => write!(
26				f,
27				"Telegram CRC mismatch, computed: {actual:X}, doesn't match expected: {expected:X}"
28			),
29		}
30	}
31}
32
33impl From<io::Error> for Error {
34	fn from(err: io::Error) -> Self {
35		Error::Io(err)
36	}
37}
38
39impl From<Utf8Error> for Error {
40	fn from(err: Utf8Error) -> Self {
41		Error::NonUtf8Parse(err)
42	}
43}
44
45impl From<FromUtf8Error> for Error {
46	fn from(err: FromUtf8Error) -> Self {
47		Error::NonUtf8Val(err)
48	}
49}
50
51impl From<ParseIntError> for Error {
52	fn from(err: ParseIntError) -> Self {
53		Error::InvalidInt(err)
54	}
55}
56
57impl From<ParseFloatError> for Error {
58	fn from(err: ParseFloatError) -> Self {
59		Error::InvalidFloat(err)
60	}
61}
62
63impl std::error::Error for Error {}