#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct Duration {
months: Months,
days: Days,
millis: Millis,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct Months(u32);
impl Months {
pub fn new(months: u32) -> Self {
Self(months)
}
fn as_bytes(&self) -> [u8; 4] {
self.0.to_le_bytes()
}
}
impl From<Months> for u32 {
fn from(days: Months) -> Self {
days.0
}
}
impl From<[u8; 4]> for Months {
fn from(bytes: [u8; 4]) -> Self {
Self(u32::from_le_bytes(bytes))
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct Days(u32);
impl Days {
pub fn new(days: u32) -> Self {
Self(days)
}
fn as_bytes(&self) -> [u8; 4] {
self.0.to_le_bytes()
}
}
impl From<Days> for u32 {
fn from(days: Days) -> Self {
days.0
}
}
impl From<[u8; 4]> for Days {
fn from(bytes: [u8; 4]) -> Self {
Self(u32::from_le_bytes(bytes))
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct Millis(u32);
impl Millis {
pub fn new(millis: u32) -> Self {
Self(millis)
}
fn as_bytes(&self) -> [u8; 4] {
self.0.to_le_bytes()
}
}
impl From<Millis> for u32 {
fn from(days: Millis) -> Self {
days.0
}
}
impl From<[u8; 4]> for Millis {
fn from(bytes: [u8; 4]) -> Self {
Self(u32::from_le_bytes(bytes))
}
}
impl Duration {
pub fn new(months: Months, days: Days, millis: Millis) -> Self {
Self {
months,
days,
millis,
}
}
pub fn months(&self) -> Months {
self.months
}
pub fn days(&self) -> Days {
self.days
}
pub fn millis(&self) -> Millis {
self.millis
}
}
impl From<Duration> for [u8; 12] {
fn from(duration: Duration) -> Self {
let mut bytes = [0u8; 12];
bytes[0..4].copy_from_slice(&duration.months.as_bytes());
bytes[4..8].copy_from_slice(&duration.days.as_bytes());
bytes[8..12].copy_from_slice(&duration.millis.as_bytes());
bytes
}
}
impl From<[u8; 12]> for Duration {
fn from(bytes: [u8; 12]) -> Self {
Self {
months: Months::from([bytes[0], bytes[1], bytes[2], bytes[3]]),
days: Days::from([bytes[4], bytes[5], bytes[6], bytes[7]]),
millis: Millis::from([bytes[8], bytes[9], bytes[10], bytes[11]]),
}
}
}