brk_core/structs/
dateindex.rs

1use std::ops::Add;
2
3use serde::Serialize;
4// use color_eyre::eyre::eyre;
5use zerocopy_derive::{FromBytes, Immutable, IntoBytes, KnownLayout};
6
7use crate::{CheckedSub, Error};
8
9use super::Date;
10
11#[derive(
12    Debug,
13    Default,
14    Clone,
15    Copy,
16    PartialEq,
17    Eq,
18    PartialOrd,
19    Ord,
20    FromBytes,
21    Immutable,
22    IntoBytes,
23    KnownLayout,
24    Serialize,
25)]
26pub struct DateIndex(u16);
27
28impl DateIndex {
29    pub const BYTES: usize = size_of::<Self>();
30}
31
32impl From<DateIndex> for usize {
33    fn from(value: DateIndex) -> Self {
34        value.0 as usize
35    }
36}
37
38impl From<usize> for DateIndex {
39    fn from(value: usize) -> Self {
40        Self(value as u16)
41    }
42}
43
44impl From<DateIndex> for i64 {
45    fn from(value: DateIndex) -> Self {
46        value.0 as i64
47    }
48}
49
50impl Add<usize> for DateIndex {
51    type Output = Self;
52    fn add(self, rhs: usize) -> Self::Output {
53        Self(self.0 + rhs as u16)
54    }
55}
56
57impl TryFrom<Date> for DateIndex {
58    type Error = Error;
59    fn try_from(value: Date) -> Result<Self, Self::Error> {
60        let value_ = jiff::civil::Date::from(value);
61        if value_ < Date::INDEX_ZERO_ {
62            Err(Error::UnindexableDate)
63        } else if value == Date::INDEX_ZERO {
64            Ok(Self(0))
65        } else if value_ < Date::INDEX_ONE_ {
66            Err(Error::UnindexableDate)
67        } else if value == Date::INDEX_ONE {
68            Ok(Self(1))
69        } else {
70            Ok(Self(Date::INDEX_ONE_.until(value_)?.get_days() as u16 + 1))
71        }
72    }
73}
74
75impl CheckedSub for DateIndex {
76    fn checked_sub(self, rhs: Self) -> Option<Self> {
77        self.0.checked_sub(rhs.0).map(Self)
78    }
79}