dbf_dextractor 0.1.2

Extract and deserialize dbf files
use serde::de::{DeserializeSeed, IntoDeserializer, SeqAccess};

use crate::error::DeserializeError;

pub struct DateAccess {
    year: Option<u16>,
    month: Option<u8>,
    day: Option<u8>,
}

impl DateAccess {
    pub fn new(year: u16, month: u8, day: u8) -> Self {
        Self {
            year: Some(year),
            month: Some(month),
            day: Some(day),
        }
    }
}

impl<'de> SeqAccess<'de> for DateAccess {
    type Error = DeserializeError;

    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
    where
        T: DeserializeSeed<'de>,
    {
        if let Some(value) = self.year.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else if let Some(value) = self.month.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else if let Some(value) = self.day.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else {
            Ok(None)
        }
    }
}

pub struct TimestampAccess {
    year: Option<u16>,
    month: Option<u8>,
    day: Option<u8>,
    hour: Option<u8>,
    minute: Option<u8>,
    second: Option<u8>,
    millisecond: Option<u16>,
}

impl TimestampAccess {
    pub fn new(year: u16, month: u8, day: u8, hour: u8, minute: u8, second: u8, millisecond: u16) -> Self {
        Self {
            year: Some(year),
            month: Some(month),
            day: Some(day),
            hour: Some(hour),
            minute: Some(minute),
            second: Some(second),
            millisecond: Some(millisecond),
        }
    }
}

impl<'de> SeqAccess<'de> for TimestampAccess {
    type Error = DeserializeError;

    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
    where
        T: DeserializeSeed<'de>,
    {
        if let Some(value) = self.year.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else if let Some(value) = self.month.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else if let Some(value) = self.day.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else if let Some(value) = self.hour.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else if let Some(value) = self.minute.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else if let Some(value) = self.second.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else if let Some(value) = self.millisecond.take() {
            seed.deserialize(value.into_deserializer()).map(Some)
        } else {
            Ok(None)
        }
    }
}