use std::borrow::Cow;
use std::time::SystemTime;
use super::Value;
use crate::MessageError;
use crate::model::storage::time::Wire;
use crate::schema::{Cardinality, Field, Kind};
pub struct Time;
impl Value for Time {
const NAME: &'static str = concat!(module_path!(), "::", stringify!(Time));
fn postcard_write(value: &SystemTime, bytes: &mut Vec<u8>) {
use crate::__private::PostcardValue;
let wire = Wire::from(*value);
wire.secs_since_epoch.write(bytes);
wire.nanos_since_epoch.write(bytes);
wire.before_epoch.write(bytes);
}
fn postcard_size(value: &SystemTime) -> usize {
use crate::__private::PostcardValue;
let wire = Wire::from(*value);
wire.secs_since_epoch.size() + wire.nanos_since_epoch.size() + 1
}
fn postcard_memory(input: &mut crate::__private::PostcardReader<'_>) -> Result<usize, MessageError> {
Self::postcard_read(input)?;
Ok(0)
}
fn postcard_read(input: &mut crate::__private::PostcardReader<'_>) -> Result<SystemTime, MessageError> {
input.nested(|input| {
Wire {
secs_since_epoch: input.value()?,
nanos_since_epoch: input.value()?,
before_epoch: input.value()?,
}
.timestamp()
.map_err(MessageError::borrowed)
})
}
type Native = SystemTime;
const KIND: Kind = Kind::Message {
definition: <Self as crate::schema::Described>::DEFINITION,
};
}
impl crate::schema::Described for Time {
const NAME: &'static str = <Self as Value>::NAME;
const FIELDS: &'static [Field] = FIELDS;
const MARKER: &'static [u8] = &crate::schema::declaration::encode::<
{ crate::schema::declaration::encoded_len(<Self as crate::schema::Described>::NAME, Self::FIELDS) },
>(<Self as crate::schema::Described>::NAME, Self::FIELDS);
}
const FIELDS: &[Field] = &[
Field {
name: Cow::Borrowed("secs_since_epoch"),
tag: 1,
kind: Kind::U64,
cardinality: Cardinality::Required,
},
Field {
name: Cow::Borrowed("nanos_since_epoch"),
tag: 2,
kind: Kind::U32,
cardinality: Cardinality::Required,
},
Field {
name: Cow::Borrowed("before_epoch"),
tag: 3,
kind: Kind::Bool,
cardinality: Cardinality::Required,
},
];