1use core::error::Error;
4use core::fmt;
5use core::num::ParseIntError;
6use core::str::Utf8Error;
7
8#[non_exhaustive]
10#[derive(Debug)]
11pub enum ParseDataError {
12 UnexpectedEof,
14 InvalidData,
16}
17
18impl fmt::Display for ParseDataError {
19 fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
20 match self {
21 Self::UnexpectedEof => f.write_str("unexpected end of data"),
22 Self::InvalidData => f.write_str("invalid data"),
23 }
24 }
25}
26
27impl Error for ParseDataError {}
28
29#[non_exhaustive]
31#[derive(Debug)]
32pub enum TzStringError {
33 Utf8(Utf8Error),
35 ParseInt(ParseIntError),
37 ParseData(ParseDataError),
39 InvalidOffsetHour,
41 InvalidOffsetMinute,
43 InvalidOffsetSecond,
45 InvalidDayTimeHour,
47 InvalidDayTimeMinute,
49 InvalidDayTimeSecond,
51 MissingDstStartEndRules,
53 RemainingData,
55 Empty,
57}
58
59impl fmt::Display for TzStringError {
60 fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
61 match self {
62 Self::Utf8(error) => error.fmt(f),
63 Self::ParseInt(error) => error.fmt(f),
64 Self::ParseData(error) => error.fmt(f),
65 Self::InvalidOffsetHour => f.write_str("invalid offset hour"),
66 Self::InvalidOffsetMinute => f.write_str("invalid offset minute"),
67 Self::InvalidOffsetSecond => f.write_str("invalid offset second"),
68 Self::InvalidDayTimeHour => f.write_str("invalid day time hour"),
69 Self::InvalidDayTimeMinute => f.write_str("invalid day time minute"),
70 Self::InvalidDayTimeSecond => f.write_str("invalid day time second"),
71 Self::MissingDstStartEndRules => f.write_str("missing DST start and end rules"),
72 Self::RemainingData => f.write_str("remaining data after parsing TZ string"),
73 Self::Empty => f.write_str("empty TZ string"),
74 }
75 }
76}
77
78impl Error for TzStringError {}
79
80impl From<Utf8Error> for TzStringError {
81 fn from(error: Utf8Error) -> Self {
82 Self::Utf8(error)
83 }
84}
85
86impl From<ParseIntError> for TzStringError {
87 fn from(error: ParseIntError) -> Self {
88 Self::ParseInt(error)
89 }
90}
91
92impl From<ParseDataError> for TzStringError {
93 fn from(error: ParseDataError) -> Self {
94 Self::ParseData(error)
95 }
96}
97
98#[non_exhaustive]
100#[derive(Debug)]
101pub enum TzFileError {
102 Utf8(Utf8Error),
104 ParseData(ParseDataError),
106 InvalidMagicNumber,
108 UnsupportedTzFileVersion,
110 InvalidHeader,
112 InvalidFooter,
114 InvalidDstIndicator,
116 InvalidTimeZoneDesignationCharIndex,
118 InvalidStdWallUtLocal,
120 RemainingDataV1,
122}
123
124impl fmt::Display for TzFileError {
125 fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
126 match self {
127 Self::Utf8(error) => error.fmt(f),
128 Self::ParseData(error) => error.fmt(f),
129 Self::InvalidMagicNumber => f.write_str("invalid magic number"),
130 Self::UnsupportedTzFileVersion => write!(f, "unsupported TZ file version"),
131 Self::InvalidHeader => f.write_str("invalid header"),
132 Self::InvalidFooter => f.write_str("invalid footer"),
133 Self::InvalidDstIndicator => f.write_str("invalid DST indicator"),
134 Self::InvalidTimeZoneDesignationCharIndex => f.write_str("invalid time zone designation char index"),
135 Self::InvalidStdWallUtLocal => f.write_str("invalid couple of standard/wall and UT/local indicators"),
136 Self::RemainingDataV1 => f.write_str("remaining data after the end of a TZif v1 data block"),
137 }
138 }
139}
140
141impl Error for TzFileError {}
142
143impl From<Utf8Error> for TzFileError {
144 fn from(error: Utf8Error) -> Self {
145 Self::Utf8(error)
146 }
147}
148
149impl From<ParseDataError> for TzFileError {
150 fn from(error: ParseDataError) -> Self {
151 Self::ParseData(error)
152 }
153}