dbf_dextractor 0.1.2

Extract and deserialize dbf files
use serde::{Serialize, Serializer};

use crate::dbf::FieldValue;
use crate::model::{Date, Timestamp};

#[derive(Debug, Clone)]
pub enum Value {
    Str(String),
    Int(i32),
    Float(f64),
    Bool(bool),
    Date(Date),
    Timestamp(Timestamp),
    Bytes(Vec<u8>),
    Null,
}

impl Serialize for Value {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        match *self {
            Value::Bool(val) => serializer.serialize_bool(val),
            Value::Str(ref val) => serializer.serialize_str(val),
            Value::Int(val) => serializer.serialize_i32(val),
            Value::Float(val) => serializer.serialize_f64(val),
            Value::Date(ref val) => serializer.serialize_str(&val.to_string()),
            Value::Timestamp(ref val) => serializer.serialize_str(&val.to_string()),
            Value::Bytes(ref val) => serializer.collect_seq(val),
            Value::Null => serializer.serialize_none(),
        }
    }
}

impl From<FieldValue> for Value {
    fn from(value: FieldValue) -> Self {
        match value {
            FieldValue::Logical(val) => Value::Bool(val),
            FieldValue::Character(val) | FieldValue::Memo(val) => Value::Str(val),
            FieldValue::Integer(val) => Value::Int(val),
            FieldValue::Numeric(val) => Value::Float(val),
            FieldValue::Float(val) => Value::Float(val),
            FieldValue::Date(year, month, day) => Value::Date(Date::new(year, month, day)),
            FieldValue::Timestamp(year, month, day, hour, minute, second, millisecond) => {
                Value::Timestamp(Timestamp::new(year, month, day, hour, minute, second, millisecond))
            }
            FieldValue::Binary(val) | FieldValue::General(val) => Value::Bytes(val),
            FieldValue::Null => Value::Null,
        }
    }
}