brk_core/structs/
dateindex.rs1use std::ops::Add;
2
3use serde::Serialize;
4use 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}