rustt 0.1.2

A wire-protocol for efficiently transfering self-describing data implemented in rust.
use serde::de::{Deserialize, Deserializer};
use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer};

mod de;
pub use de::{KeyVisitor, ValueVisitor};

#[derive(Hash, PartialEq, Eq, Debug)]
pub enum Key {
	String(String),
	Bytes(Vec<u8>),
	I8(i8),
	I16(i16),
	I32(i32),
	I64(i64),
	U8(u8),
	U16(u16),
	U32(u32),
	U64(u64),
	Bool(bool),
	F32(crate::ttv3::serde::TtF32),
	F64(crate::ttv3::serde::TtF64),
}

impl<'de> Deserialize<'de> for Key {
	#[inline]
	fn deserialize<D>(deserializer: D) -> Result<Key, D::Error>
	where
		D: Deserializer<'de>,
	{
		deserializer.deserialize_any(crate::ttv3::untyped::KeyVisitor)
	}
}

impl Serialize for Key {
	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
	where
		S: Serializer,
	{
		match self {
			Key::String(s) => serializer.serialize_str(s),
			Key::Bytes(b) => serializer.serialize_bytes(b),
			Key::I8(i) => serializer.serialize_i8(*i),
			Key::I16(i) => serializer.serialize_i16(*i),
			Key::I32(i) => serializer.serialize_i32(*i),
			Key::I64(i) => serializer.serialize_i64(*i),
			Key::U8(u) => serializer.serialize_u8(*u),
			Key::U16(u) => serializer.serialize_u16(*u),
			Key::U32(u) => serializer.serialize_u32(*u),
			Key::U64(u) => serializer.serialize_u64(*u),
			Key::Bool(b) => serializer.serialize_bool(*b),
			Key::F32(ttf32) => serializer.serialize_f32(ttf32.into()),
			Key::F64(ttf64) => serializer.serialize_f64(ttf64.into()),
		}
	}
}

#[derive(Debug)]
pub enum Value {
	String(String),
	Bytes(Vec<u8>),
	I8(i8),
	I16(i16),
	I32(i32),
	I64(i64),
	U8(u8),
	U16(u16),
	U32(u32),
	U64(u64),
	Bool(bool),
	F32(f32),
	F64(f64),
	Map(std::collections::HashMap<Key, Value>),
	Vec(Vec<Value>),
}

impl<'de> Deserialize<'de> for Value {
	#[inline]
	fn deserialize<D>(deserializer: D) -> Result<Value, D::Error>
	where
		D: Deserializer<'de>,
	{
		deserializer.deserialize_any(crate::ttv3::untyped::ValueVisitor)
	}
}

impl Serialize for Value {
	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
	where
		S: Serializer,
	{
		match self {
			Value::String(s) => serializer.serialize_str(s),
			Value::Bytes(b) => serializer.serialize_bytes(b),
			Value::I8(i) => serializer.serialize_i8(*i),
			Value::I16(i) => serializer.serialize_i16(*i),
			Value::I32(i) => serializer.serialize_i32(*i),
			Value::I64(i) => serializer.serialize_i64(*i),
			Value::U8(u) => serializer.serialize_u8(*u),
			Value::U16(u) => serializer.serialize_u16(*u),
			Value::U32(u) => serializer.serialize_u32(*u),
			Value::U64(u) => serializer.serialize_u64(*u),
			Value::Bool(b) => serializer.serialize_bool(*b),
			Value::F32(f) => serializer.serialize_f32(*f),
			Value::F64(f) => serializer.serialize_f64(*f),
			Value::Map(m) => {
				let mut map = serializer.serialize_map(Some(m.len()))?;
				for (k, v) in m {
					map.serialize_entry(k, v)?;
				}
				map.end()
			}
			Value::Vec(m) => {
				let mut seq = serializer.serialize_seq(Some(m.len()))?;
				for e in m {
					seq.serialize_element(e)?;
				}
				seq.end()
			}
		}
	}
}