1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use derive_more::Constructor;
use crate::prelude::*;
/// Years since birth of Jesus christ, e.g. 2025
#[derive(
Clone,
Copy,
Debug,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Display,
Serialize,
Deserialize,
From,
Deref,
Constructor,
)]
pub struct Year(u16);
impl std::str::FromStr for Year {
type Err = crate::prelude::Error;
/// Parses a year from a string, e.g. "2025".
/// # Errors
/// Returns an error if the string is not a valid year.
/// # Examples
/// ```
/// extern crate klirr_core;
/// use klirr_core::prelude::*;
/// let year: Year = "2025".parse().unwrap();
/// assert_eq!(*year, 2025);
/// ```
fn from_str(s: &str) -> Result<Self, Self::Err> {
s.parse::<u16>()
.map_err(|_| Error::FailedToParseYear {
invalid_string: s.to_owned(),
})
.map(Self)
}
}
impl From<i32> for Year {
/// Converts an `i32` year to a `Year`.
/// # Examples
/// ```
/// extern crate klirr_core;
/// use klirr_core::prelude::*;
/// let year: Year = 2025.into();
/// assert_eq!(*year, 2025);
/// ```
fn from(year: i32) -> Self {
Self(year as u16)
}
}