1mod from_bin_ccsds;
11mod from_str;
12mod from_str_iso;
13mod to_bin_ccsds;
14mod to_deep_time;
15
16#[cfg(feature = "alloc")]
17mod to_str_ccsds;
18
19#[cfg(feature = "chrono")]
20mod to_chrono;
21
22#[cfg(feature = "jiff")]
23mod to_jiff;
24
25use crate::{LiteStr, Scale};
26
27#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
43#[cfg_attr(feature = "tsify", derive(tsify::Tsify))]
44#[derive(Debug, Clone, Copy, Default, PartialEq)]
45pub struct Parts {
46 pub yr: Option<i64>,
48 pub mo: Option<u8>,
50 pub day: Option<u8>,
52 pub hr: u8,
54 pub min: u8,
56 pub sec: u8,
58 pub attos: u64,
60 pub offset: Option<Offset>,
62 pub iana_name: Option<LiteStr<49>>,
64 pub scale: Scale,
66 pub wkday: Option<Weekday>,
68 pub day_of_yr: Option<u16>,
70 pub iso_wk_yr: Option<i64>,
72 pub iso_wk: Option<u8>,
74 pub wk_sun: Option<u8>,
76 pub wk_mon: Option<u8>,
78 pub meridiem: Option<Meridiem>,
80 pub timestamp: Option<Timestamp>,
82}
83
84#[derive(Clone, Copy)]
86pub(crate) struct SecF {
87 pub(crate) negative: bool,
88 pub(crate) int_u: u64,
90 pub(crate) frac_attos: u64,
92 pub(crate) scale: Scale,
93}
94
95impl Parts {
96 #[inline(always)]
97 pub fn new_utc() -> Parts {
98 Self {
99 scale: Scale::UTC,
100 ..Default::default()
101 }
102 }
103
104 #[inline(always)]
106 pub fn set_iana_name(&mut self, name: Option<&str>) {
107 self.iana_name = name.map(LiteStr::new);
108 }
109}
110
111#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
115#[cfg_attr(feature = "tsify", derive(tsify::Tsify))]
116#[derive(Copy, Clone, Debug, PartialEq, Eq)]
117pub enum Epoch {
118 Unix,
119 Noon2000,
120}
121
122#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
126#[cfg_attr(feature = "tsify", derive(tsify::Tsify))]
127#[derive(Debug, Clone, Copy, PartialEq, Eq)]
128pub struct Timestamp {
129 pub attos: i128,
130 pub epoch: Epoch,
131}
132
133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
135#[cfg_attr(feature = "tsify", derive(tsify::Tsify))]
136#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
137pub enum Meridiem {
138 #[default]
139 AM,
140 PM,
141}
142
143#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
145#[cfg_attr(feature = "tsify", derive(tsify::Tsify))]
146#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
147pub enum Weekday {
148 #[default]
149 Sunday,
150 Monday,
151 Tuesday,
152 Wednesday,
153 Thursday,
154 Friday,
155 Saturday,
156}
157
158impl Weekday {
159 pub const fn from_sunday_0_based(n: u8) -> Option<Self> {
161 match n {
162 0 => Some(Weekday::Sunday),
163 1 => Some(Weekday::Monday),
164 2 => Some(Weekday::Tuesday),
165 3 => Some(Weekday::Wednesday),
166 4 => Some(Weekday::Thursday),
167 5 => Some(Weekday::Friday),
168 6 => Some(Weekday::Saturday),
169 _ => None,
170 }
171 }
172
173 pub const fn from_monday_1_based(n: u8) -> Option<Self> {
175 match n {
176 1 => Some(Weekday::Monday),
177 2 => Some(Weekday::Tuesday),
178 3 => Some(Weekday::Wednesday),
179 4 => Some(Weekday::Thursday),
180 5 => Some(Weekday::Friday),
181 6 => Some(Weekday::Saturday),
182 7 => Some(Weekday::Sunday),
183 _ => None,
184 }
185 }
186
187 pub const fn wkday_sun_0_based(self) -> u8 {
189 match self {
190 Weekday::Sunday => 0,
191 Weekday::Monday => 1,
192 Weekday::Tuesday => 2,
193 Weekday::Wednesday => 3,
194 Weekday::Thursday => 4,
195 Weekday::Friday => 5,
196 Weekday::Saturday => 6,
197 }
198 }
199
200 pub const fn wkday_sun_1_based(self) -> u8 {
202 match self {
203 Weekday::Sunday => 1,
204 Weekday::Monday => 2,
205 Weekday::Tuesday => 3,
206 Weekday::Wednesday => 4,
207 Weekday::Thursday => 5,
208 Weekday::Friday => 6,
209 Weekday::Saturday => 7,
210 }
211 }
212
213 pub const fn wkday_mon_0_based(self) -> u8 {
215 match self {
216 Weekday::Monday => 0,
217 Weekday::Tuesday => 1,
218 Weekday::Wednesday => 2,
219 Weekday::Thursday => 3,
220 Weekday::Friday => 4,
221 Weekday::Saturday => 5,
222 Weekday::Sunday => 6,
223 }
224 }
225
226 pub const fn wkday_mon_1_based(self) -> u8 {
228 match self {
229 Weekday::Monday => 1,
230 Weekday::Tuesday => 2,
231 Weekday::Wednesday => 3,
232 Weekday::Thursday => 4,
233 Weekday::Friday => 5,
234 Weekday::Saturday => 6,
235 Weekday::Sunday => 7,
236 }
237 }
238}
239
240#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
242#[cfg_attr(feature = "tsify", derive(tsify::Tsify))]
243#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
244pub enum Offset {
245 #[default]
246 None,
247 Fixed(i32),
249}