astrolabe/local/
errors.rs1use std::{array::TryFromSliceError, fmt::Display, num::ParseIntError, str::Utf8Error};
2
3#[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}