astrolabe/local/
errors.rs

1use std::{array::TryFromSliceError, fmt::Display, num::ParseIntError, str::Utf8Error};
2
3/// TZif parsing errors
4#[derive(Debug)]
5pub(crate) enum TimeZoneError {
6    Cursor(&'static str),
7    InvalidTzFile(&'static str),
8    UnsupportedTzFile(&'static str),
9    TryFromSliceError(TryFromSliceError),
10    Utf8Error(Utf8Error),
11    ParseIntError(ParseIntError),
12}
13
14impl Display for TimeZoneError {
15    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16        match self {
17            TimeZoneError::Cursor(error) => {
18                write!(f, "Error when parsing a TZif file: Cursor Error: {}", error)
19            }
20            TimeZoneError::InvalidTzFile(error) => {
21                write!(
22                    f,
23                    "Error when parsing a TZif file: Invalid Tzif file: {}",
24                    error
25                )
26            }
27            TimeZoneError::UnsupportedTzFile(error) => {
28                write!(
29                    f,
30                    "Error when parsing a TZif file: Unsupported Tzif file: {}",
31                    error
32                )
33            }
34            TimeZoneError::TryFromSliceError(error) => {
35                write!(f, "Error when parsing a TZif file: {}", error)
36            }
37            TimeZoneError::Utf8Error(error) => {
38                write!(f, "Error when parsing a TZif file: {}", error)
39            }
40            TimeZoneError::ParseIntError(error) => {
41                write!(f, "Error when parsing a TZif file: {}", error)
42            }
43        }
44    }
45}
46
47impl From<TryFromSliceError> for TimeZoneError {
48    fn from(e: TryFromSliceError) -> Self {
49        TimeZoneError::TryFromSliceError(e)
50    }
51}
52
53impl From<Utf8Error> for TimeZoneError {
54    fn from(e: Utf8Error) -> Self {
55        TimeZoneError::Utf8Error(e)
56    }
57}
58
59impl From<ParseIntError> for TimeZoneError {
60    fn from(e: ParseIntError) -> Self {
61        TimeZoneError::ParseIntError(e)
62    }
63}
64
65#[cfg(test)]
66mod tests {
67    use crate::local::errors::TimeZoneError;
68
69    #[test]
70    fn display() {
71        let string = " 0";
72        println!(
73            "{}",
74            string
75                .parse::<i32>()
76                .map_err(TimeZoneError::from)
77                .unwrap_err()
78        );
79
80        let invalid_utf8 = b"\xFF";
81        #[allow(invalid_from_utf8)]
82        let parsed = std::str::from_utf8(invalid_utf8)
83            .map_err(TimeZoneError::from)
84            .unwrap_err();
85        println!("{}", parsed);
86        println!("{:?}", parsed);
87
88        let bytes: &[u8] = b"12";
89        #[allow(invalid_from_utf8)]
90        let slice_result: Result<[u8; 4], _> = bytes.try_into().map_err(TimeZoneError::from);
91        assert!(slice_result.is_err());
92        println!("{}", slice_result.unwrap_err());
93    }
94}