tpack-core 0.1.0

Core wire codec, schema AST, validation, and native traits for TPACK
Documentation
use crate::{Decimal, Result, Schema, TpackValue, TypeDescriptor};

use super::helpers::{deserialize_via_from_value, type_mismatch};
use super::{FromTpackValue, TpackDeserialize, TpackSerialize};

macro_rules! impl_scalar {
    ($ty:ty, $variant:ident, $desc:ident, $name:literal) => {
        impl TpackSerialize for $ty {
            fn schema() -> Schema {
                Schema::new(TypeDescriptor::$desc)
            }

            fn to_value(&self) -> TpackValue<'_> {
                TpackValue::$variant(*self)
            }
        }

        impl<'de> TpackDeserialize<'de> for $ty {
            fn schema() -> Schema {
                <Self as TpackSerialize>::schema()
            }

            fn from_value(value: TpackValue<'de>) -> Result<Self> {
                deserialize_via_from_value(value)
            }
        }

        impl<'de> FromTpackValue<'de> for $ty {
            fn from_value(value: TpackValue<'de>) -> Result<Self> {
                match value {
                    TpackValue::$variant(value) => Ok(value),
                    _ => Err(type_mismatch($name)),
                }
            }
        }
    };
}

impl_scalar!(bool, Bool, Bool, "Bool");
impl_scalar!(i8, I8, I8, "I8");
impl_scalar!(i16, I16, I16, "I16");
impl_scalar!(i32, I32, I32, "I32");
impl_scalar!(i64, I64, I64, "I64");
impl_scalar!(u8, U8, U8, "U8");
impl_scalar!(u16, U16, U16, "U16");
impl_scalar!(u32, U32, U32, "U32");
impl_scalar!(u64, U64, U64, "U64");
impl_scalar!(f32, F32, F32, "F32");
impl_scalar!(f64, F64, F64, "F64");
impl_scalar!(Decimal, Decimal, Decimal, "Decimal");