1mod from_ccsds_bin;
2mod from_ccsds_str;
3mod from_str;
4mod to_ccsds_bin;
5mod to_deep_time;
6
7#[cfg(feature = "alloc")]
8mod to_ccsds_str;
9
10#[cfg(feature = "chrono")]
11mod to_chrono;
12
13#[cfg(feature = "jiff")]
14mod to_jiff;
15
16use crate::{AsciiStr, Scale};
17
18#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
32#[cfg_attr(feature = "js", derive(tsify::Tsify))]
33#[derive(Debug, Clone, Copy, Default, PartialEq)]
34pub struct TimeParts {
35 pub yr: Option<i64>,
37 pub mo: Option<u8>,
39 pub day: Option<u8>,
41 pub hr: Option<u8>,
43 pub min: Option<u8>,
45 pub sec: Option<u8>,
47 pub attos: Option<u64>,
49 pub offset: Option<Offset>,
51 pub iana_name: Option<AsciiStr<49>>,
53 pub is_leap_sec: bool,
55 pub scale: Scale,
57 pub wkday: Option<Weekday>,
59 pub day_of_yr: Option<u16>,
61 pub iso_wk_yr: Option<i64>,
63 pub iso_wk: Option<u8>,
65 pub wk_sun: Option<u8>,
67 pub wk_mon: Option<u8>,
69 pub meridiem: Option<Meridiem>,
71 pub unix_timestamp_seconds: Option<i64>,
73}
74
75impl TimeParts {
76 #[inline]
77 pub fn new_utc() -> Self {
78 Self {
79 scale: Scale::UTC,
80 ..Default::default()
81 }
82 }
83
84 #[inline]
89 pub fn set_iana_name(&mut self, name: Option<&str>) -> &mut Self {
90 self.iana_name = name.and_then(|s| AsciiStr::try_from_str(s).ok());
91 self
92 }
93}
94
95#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
97#[cfg_attr(feature = "js", derive(tsify::Tsify))]
98#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
99pub enum Meridiem {
100 #[default]
101 AM,
102 PM,
103}
104
105#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
107#[cfg_attr(feature = "js", derive(tsify::Tsify))]
108#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
109pub enum Weekday {
110 #[default]
111 Sunday,
112 Monday,
113 Tuesday,
114 Wednesday,
115 Thursday,
116 Friday,
117 Saturday,
118}
119
120impl Weekday {
121 #[inline]
123 pub const fn from_sunday_zero_offset(n: u8) -> Option<Self> {
124 match n {
125 0 => Some(Weekday::Sunday),
126 1 => Some(Weekday::Monday),
127 2 => Some(Weekday::Tuesday),
128 3 => Some(Weekday::Wednesday),
129 4 => Some(Weekday::Thursday),
130 5 => Some(Weekday::Friday),
131 6 => Some(Weekday::Saturday),
132 _ => None,
133 }
134 }
135
136 #[inline]
138 pub const fn from_monday_one_offset(n: u8) -> Option<Self> {
139 match n {
140 1 => Some(Weekday::Monday),
141 2 => Some(Weekday::Tuesday),
142 3 => Some(Weekday::Wednesday),
143 4 => Some(Weekday::Thursday),
144 5 => Some(Weekday::Friday),
145 6 => Some(Weekday::Saturday),
146 7 => Some(Weekday::Sunday),
147 _ => None,
148 }
149 }
150
151 #[inline]
153 pub const fn wk_sun(self) -> u8 {
154 match self {
155 Weekday::Sunday => 0,
156 Weekday::Monday => 1,
157 Weekday::Tuesday => 2,
158 Weekday::Wednesday => 3,
159 Weekday::Thursday => 4,
160 Weekday::Friday => 5,
161 Weekday::Saturday => 6,
162 }
163 }
164
165 #[inline]
167 pub const fn wk_mon(self) -> u8 {
168 match self {
169 Weekday::Monday => 1,
170 Weekday::Tuesday => 2,
171 Weekday::Wednesday => 3,
172 Weekday::Thursday => 4,
173 Weekday::Friday => 5,
174 Weekday::Saturday => 6,
175 Weekday::Sunday => 7,
176 }
177 }
178}
179
180#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
182#[cfg_attr(feature = "js", derive(tsify::Tsify))]
183#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
184pub enum Offset {
185 #[default]
186 Utc,
187 None,
188 Fixed(i32),
190}