time/error/
mod.rs

1//! Various error types returned by methods in the time crate.
2
3mod component_range;
4mod conversion_range;
5mod different_variant;
6#[cfg(feature = "formatting")]
7mod format;
8#[cfg(feature = "local-offset")]
9mod indeterminate_offset;
10#[cfg(all(any(feature = "formatting", feature = "parsing"), feature = "alloc"))]
11mod invalid_format_description;
12mod invalid_variant;
13#[cfg(feature = "parsing")]
14mod parse;
15#[cfg(feature = "parsing")]
16mod parse_from_description;
17#[cfg(feature = "parsing")]
18mod try_from_parsed;
19
20#[cfg(feature = "parsing")]
21use core::convert::Infallible;
22use core::fmt;
23
24pub use component_range::ComponentRange;
25pub use conversion_range::ConversionRange;
26pub use different_variant::DifferentVariant;
27#[cfg(feature = "formatting")]
28pub use format::Format;
29#[cfg(feature = "local-offset")]
30pub use indeterminate_offset::IndeterminateOffset;
31#[cfg(all(any(feature = "formatting", feature = "parsing"), feature = "alloc"))]
32pub use invalid_format_description::InvalidFormatDescription;
33pub use invalid_variant::InvalidVariant;
34#[cfg(feature = "parsing")]
35pub use parse::Parse;
36#[cfg(feature = "parsing")]
37pub use parse_from_description::ParseFromDescription;
38#[cfg(feature = "parsing")]
39pub use try_from_parsed::TryFromParsed;
40
41/// A unified error type for anything returned by a method in the time crate.
42///
43/// This can be used when you either don't know or don't care about the exact error returned.
44/// `Result<_, time::Error>` (or its alias `time::Result<_>`) will work in these situations.
45#[non_exhaustive]
46#[derive(Debug)]
47pub enum Error {
48    #[allow(missing_docs)]
49    ConversionRange(ConversionRange),
50    #[allow(missing_docs)]
51    ComponentRange(ComponentRange),
52    #[cfg(feature = "local-offset")]
53    #[allow(missing_docs)]
54    IndeterminateOffset(IndeterminateOffset),
55    #[cfg(feature = "formatting")]
56    #[allow(missing_docs)]
57    Format(Format),
58    #[cfg(feature = "parsing")]
59    #[allow(missing_docs)]
60    ParseFromDescription(ParseFromDescription),
61    #[cfg(feature = "parsing")]
62    #[allow(missing_docs)]
63    #[non_exhaustive]
64    #[deprecated(
65        since = "0.3.28",
66        note = "no longer output. moved to the `ParseFromDescription` variant"
67    )]
68    UnexpectedTrailingCharacters {
69        #[doc(hidden)]
70        never: Infallible,
71    },
72    #[cfg(feature = "parsing")]
73    #[allow(missing_docs)]
74    TryFromParsed(TryFromParsed),
75    #[cfg(all(any(feature = "formatting", feature = "parsing"), feature = "alloc"))]
76    #[allow(missing_docs)]
77    InvalidFormatDescription(InvalidFormatDescription),
78    #[allow(missing_docs)]
79    DifferentVariant(DifferentVariant),
80    #[allow(missing_docs)]
81    InvalidVariant(InvalidVariant),
82}
83
84impl fmt::Display for Error {
85    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
86        match self {
87            Self::ConversionRange(e) => e.fmt(f),
88            Self::ComponentRange(e) => e.fmt(f),
89            #[cfg(feature = "local-offset")]
90            Self::IndeterminateOffset(e) => e.fmt(f),
91            #[cfg(feature = "formatting")]
92            Self::Format(e) => e.fmt(f),
93            #[cfg(feature = "parsing")]
94            Self::ParseFromDescription(e) => e.fmt(f),
95            #[cfg(feature = "parsing")]
96            #[allow(deprecated)]
97            Self::UnexpectedTrailingCharacters { never } => match *never {},
98            #[cfg(feature = "parsing")]
99            Self::TryFromParsed(e) => e.fmt(f),
100            #[cfg(all(any(feature = "formatting", feature = "parsing"), feature = "alloc"))]
101            Self::InvalidFormatDescription(e) => e.fmt(f),
102            Self::DifferentVariant(e) => e.fmt(f),
103            Self::InvalidVariant(e) => e.fmt(f),
104        }
105    }
106}
107
108#[cfg(feature = "std")]
109impl std::error::Error for Error {
110    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
111        match self {
112            Self::ConversionRange(err) => Some(err),
113            Self::ComponentRange(err) => Some(err),
114            #[cfg(feature = "local-offset")]
115            Self::IndeterminateOffset(err) => Some(err),
116            #[cfg(feature = "formatting")]
117            Self::Format(err) => Some(err),
118            #[cfg(feature = "parsing")]
119            Self::ParseFromDescription(err) => Some(err),
120            #[cfg(feature = "parsing")]
121            #[allow(deprecated)]
122            Self::UnexpectedTrailingCharacters { never } => match *never {},
123            #[cfg(feature = "parsing")]
124            Self::TryFromParsed(err) => Some(err),
125            #[cfg(all(any(feature = "formatting", feature = "parsing"), feature = "alloc"))]
126            Self::InvalidFormatDescription(err) => Some(err),
127            Self::DifferentVariant(err) => Some(err),
128            Self::InvalidVariant(err) => Some(err),
129        }
130    }
131}