tea_time/impls/
impl_time.rs1use std::fmt;
2use std::str::FromStr;
3
4use chrono::Timelike;
5use tea_error::*;
6
7use crate::Time;
8
9impl fmt::Display for Time {
10 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11 fmt::Debug::fmt(self, f)
12 }
13}
14
15impl FromStr for Time {
16 type Err = TError;
17 #[inline]
18 fn from_str(s: &str) -> TResult<Self> {
19 Self::parse(s, None)
20 }
21}
22
23impl From<i64> for Time {
24 #[inline]
25 fn from(value: i64) -> Self {
26 Self::from_i64(value)
27 }
28}
29
30impl From<Option<i64>> for Time {
31 #[inline]
32 fn from(value: Option<i64>) -> Self {
33 if let Some(value) = value {
34 Self::from(value)
35 } else {
36 Self::nat()
37 }
38 }
39}
40
41impl Timelike for Time {
42 #[inline]
43 fn hour(&self) -> u32 {
44 self.as_cr().unwrap().hour()
45 }
46
47 #[inline]
48 fn minute(&self) -> u32 {
49 self.as_cr().unwrap().minute()
50 }
51
52 #[inline]
53 fn second(&self) -> u32 {
54 self.as_cr().unwrap().second()
55 }
56
57 #[inline]
58 fn nanosecond(&self) -> u32 {
59 self.as_cr().unwrap().nanosecond()
60 }
61
62 #[inline]
63 fn with_hour(&self, hour: u32) -> Option<Self> {
64 if let Some(time) = self.as_cr() {
65 if let Some(time) = time.with_hour(hour) {
66 return Some(Self::from_cr(&time));
67 }
68 }
69 None
70 }
71
72 #[inline]
73 fn with_minute(&self, min: u32) -> Option<Self> {
74 if let Some(time) = self.as_cr() {
75 if let Some(time) = time.with_minute(min) {
76 return Some(Self::from_cr(&time));
77 }
78 }
79 None
80 }
81
82 #[inline]
83 fn with_second(&self, sec: u32) -> Option<Self> {
84 if let Some(time) = self.as_cr() {
85 if let Some(time) = time.with_second(sec) {
86 return Some(Self::from_cr(&time));
87 }
88 }
89 None
90 }
91
92 #[inline]
93 fn with_nanosecond(&self, nano: u32) -> Option<Self> {
94 if let Some(time) = self.as_cr() {
95 if let Some(time) = time.with_nanosecond(nano) {
96 return Some(Self::from_cr(&time));
97 }
98 }
99 None
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 use super::*;
106
107 #[test]
108 fn test_time_getters() {
109 let time = Time::from_hms(12, 34, 56);
110 assert_eq!(time.hour(), 12);
111 assert_eq!(time.minute(), 34);
112 assert_eq!(time.second(), 56);
113 assert_eq!(time.nanosecond(), 0);
114 }
115
116 #[test]
117 fn test_time_with_methods() {
118 let time = Time::from_hms(12, 34, 56);
119
120 let new_time = time.with_hour(15).unwrap();
121 assert_eq!(new_time.hour(), 15);
122 assert_eq!(new_time.minute(), 34);
123 assert_eq!(new_time.second(), 56);
124
125 let new_time = time.with_minute(45).unwrap();
126 assert_eq!(new_time.hour(), 12);
127 assert_eq!(new_time.minute(), 45);
128 assert_eq!(new_time.second(), 56);
129
130 let new_time = time.with_second(30).unwrap();
131 assert_eq!(new_time.hour(), 12);
132 assert_eq!(new_time.minute(), 34);
133 assert_eq!(new_time.second(), 30);
134
135 let new_time = time.with_nanosecond(500_000_000).unwrap();
136 assert_eq!(new_time.hour(), 12);
137 assert_eq!(new_time.minute(), 34);
138 assert_eq!(new_time.second(), 56);
139 assert_eq!(new_time.nanosecond(), 500_000_000);
140 }
141
142 #[test]
143 fn test_invalid_time_modifications() {
144 let time = Time::from_hms(12, 34, 56);
145
146 assert!(time.with_hour(24).is_none());
147 assert!(time.with_minute(60).is_none());
148 assert!(time.with_second(60).is_none());
149 assert!(time.with_nanosecond(3_000_000_000).is_none());
150 }
151}