use std::fmt;
use std::string::ToString;
use serde::de::{self, SeqAccess, Visitor};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Clone, Debug)]
pub struct Date {
pub year: u16,
pub month: u8,
pub day: u8,
}
impl Date {
pub fn new(year: u16, month: u8, day: u8) -> Self {
Self { year, month, day }
}
}
impl fmt::Display for Date {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}-{:02}-{:02}", self.year, self.month, self.day)
}
}
impl Serialize for Date {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&self.to_string())
}
}
impl<'de> Deserialize<'de> for Date {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct DateVisitor;
impl<'de> Visitor<'de> for DateVisitor {
type Value = Date;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("struct Timestamp")
}
fn visit_seq<V>(self, mut seq: V) -> Result<Date, V::Error>
where
V: SeqAccess<'de>,
{
let year = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(0, &self))?;
let month = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(1, &self))?;
let day = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(2, &self))?;
Ok(Date { year, month, day })
}
}
deserializer.deserialize_seq(DateVisitor)
}
}
#[derive(Clone, Debug)]
pub struct Time {
pub hour: u8,
pub minute: u8,
pub second: u8,
pub millisecond: u16,
}
impl Time {
pub fn new(hour: u8, minute: u8, second: u8, millisecond: u16) -> Self {
Self { hour, minute, second, millisecond }
}
}
impl fmt::Display for Time {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:02}:{:02}:{:02}.{:03}", self.hour, self.minute, self.second, self.millisecond)
}
}
#[derive(Clone, Debug)]
pub struct Timestamp {
pub date: Date,
pub time: Time,
}
impl Timestamp {
pub(crate) fn new(year: u16, month: u8, day: u8, hour: u8, minute: u8, second: u8, millisecond: u16) -> Self {
Self {
date: Date { year, month, day },
time: Time { hour, minute, second, millisecond },
}
}
}
impl fmt::Display for Timestamp {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}T{}", self.date, self.time)
}
}
impl Serialize for Timestamp {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&self.to_string())
}
}
impl<'de> Deserialize<'de> for Timestamp {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct TimestampVisitor;
impl<'de> Visitor<'de> for TimestampVisitor {
type Value = Timestamp;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("struct Timestamp")
}
fn visit_seq<V>(self, mut seq: V) -> Result<Timestamp, V::Error>
where
V: SeqAccess<'de>,
{
let year = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(0, &self))?;
let month = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(1, &self))?;
let day = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(2, &self))?;
let hour = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(3, &self))?;
let minute = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(4, &self))?;
let second = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(5, &self))?;
let millisecond = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(6, &self))?;
Ok(Timestamp::new(year, month, day, hour, minute, second, millisecond))
}
}
deserializer.deserialize_seq(TimestampVisitor)
}
}