tycho 0.1.2

A minimal, self-describing and traversable binary data format designed around rust and the serde data model.
Documentation
use serde::{Serialize, Serializer};
use crate::{Element, Value, Number};
use serde::ser::{SerializeStruct, SerializeSeq, SerializeMap};

#[cfg(feature="serde_types")]
impl Serialize for Element {
    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
        S: Serializer {
        match self {
            Element::Unit => serializer.serialize_unit(),
            Element::Value(x) => x.serialize(serializer),
            Element::Option(o) => match o {
                Some(x) => serializer.serialize_some(x),
                None => serializer.serialize_none()
            },
            Element::Variant(n, v) => serializer.serialize_newtype_variant("", 0, &*n.to_string(), v),
            Element::Struct(x) => {
                let mut s = serializer.serialize_struct("___tycho___/struct", 1)?;
                s.serialize_field("inner", x);
                s.end()
            },
            Element::List(x) => {
                let mut s = serializer.serialize_struct("___tycho___/list", 1)?;
                s.serialize_field("inner", x);
                s.end()
            }
            Element::Array(i, x) => {
                let mut s = serializer.serialize_struct("___tycho___/array", 2)?;
                s.serialize_field("ident", &i.to_internal_prefix())?;
                s.serialize_field("inner", x)?;
                s.end()
            }
            Element::Map(i, x) => {
                let mut s = serializer.serialize_struct("___tycho___/map", 2)?;
                s.serialize_field("ident", &i.to_internal_prefix())?;
                s.serialize_field("inner", x)?;
                s.end()
            }
            Element::Compression(c) => {
                let mut s = serializer.serialize_struct("___tycho___/compression", 1)?;
                s.serialize_field("inner", c);
                s.end()
            }
        }
    }
}

#[cfg(not(feature="serde_types"))]
impl Serialize for Element {
    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
        S: Serializer {
        match self {
            Element::Unit => serializer.serialize_unit(),
            Element::Value(x) => x.serialize(serializer),
            Element::Option(o) => match o {
                Some(x) => serializer.serialize_some(x),
                None => serializer.serialize_none()
            },
            Element::Variant(n, v) => serializer.serialize_newtype_variant("", 0, &n.to_string(), v),
            Element::Struct(x) => x.serialize(serializer),
            Element::List(x) => x.serialize(serializer),
            Element::Array(_i, x) => x.serialize(serializer),
            Element::Map(_i, x) => x.serialize(serializer),
            Element::Compression(c) => c.serialize(serializer),
        }
    }
}

impl Serialize for Value {
    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
        S: Serializer {
        match self {
            Value::Null => serializer.serialize_unit(),
            Value::Boolean(x) => serializer.serialize_bool(*x),
            Value::String(x) => serializer.serialize_str(x),
            Value::Char(x) => serializer.serialize_char(*x),
            Value::Number(num) => num.serialize(serializer),
            Value::Bytes(x) => serializer.serialize_bytes(x),
            Value::UUID(x) => x.serialize(serializer)
        }
    }
}

impl Serialize for Number {
    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
        S: Serializer {
        match self {
            Number::Bit(x) => serializer.serialize_bool(*x),
            Number::Unsigned8(x) => serializer.serialize_u8(*x),
            Number::Signed8(x) => serializer.serialize_i8(*x),
            Number::Unsigned16(x) => serializer.serialize_u16(*x),
            Number::Signed16(x) => serializer.serialize_i16(*x),
            Number::Unsigned32(x) => serializer.serialize_u32(*x),
            Number::Signed32(x) => serializer.serialize_i32(*x),
            Number::Unsigned64(x) => serializer.serialize_u64(*x),
            Number::Signed64(x) => serializer.serialize_i64(*x),

            #[cfg(not(feature="serde_types"))]
            Number::Unsigned128(x) => serializer.serialize_bytes(&x.to_be_bytes()),
            #[cfg(not(feature="serde_types"))]
            Number::Signed128(x) => serializer.serialize_bytes(&x.to_be_bytes()),

            #[cfg(feature="serde_types")]
            Number::Unsigned128(x) => {
                let mut stu = serializer.serialize_struct("___tycho___/u128", 2)?;
                stu.serialize_field("0", &((x >> 64) as u64))?;
                stu.serialize_field("1", &((x & 0xFFFF_FFFF_FFFF_FFFF) as u64))?;
                stu.end()
            }

            #[cfg(feature="serde_types")]
            Number::Signed128(x) => {
                let mut stu = serializer.serialize_struct("___tycho___/i128", 2)?;
                stu.serialize_field("0", &(((*x as u128) >> 64) as u64))?;
                stu.serialize_field("1", &(((*x as u128) & 0xFFFF_FFFF_FFFF_FFFF) as u64))?;
                stu.end()
            }

            Number::Float32(x) => serializer.serialize_f32(*x),
            Number::Float64(x) => serializer.serialize_f64(*x),
        }
    }
}