preserves/implementations/rust/src/value/ser.rs

297 lines
8.4 KiB
Rust

use crate::value::{Value, AValue, Dictionary};
use serde::Serialize;
use crate::value::error::{Error, Result};
pub struct Serializer;
pub struct SerializeDictionary {
next_key: Option<AValue>,
items: Dictionary,
}
pub struct SerializeRecord {
name: &'static str,
vec: Vec<AValue>,
}
pub struct SerializeSequence {
vec: Vec<AValue>,
}
impl serde::Serializer for Serializer {
type Ok = AValue;
type Error = Error;
type SerializeSeq = SerializeSequence;
type SerializeTuple = SerializeRecord;
type SerializeTupleStruct = SerializeRecord;
type SerializeTupleVariant = SerializeRecord;
type SerializeMap = SerializeDictionary;
type SerializeStruct = SerializeRecord;
type SerializeStructVariant = SerializeRecord;
fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_char(self, v: char) -> Result<Self::Ok> {
Ok(Value::simple_record("UnicodeScalar", vec![Value::from(v as u32).wrap()]).wrap())
}
fn serialize_str(self, v: &str) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok> {
Ok(Value::from(v).wrap())
}
fn serialize_none(self) -> Result<Self::Ok> {
Ok(Value::simple_record("None", vec![]).wrap())
}
fn serialize_some<T: ?Sized>(self, v: &T) -> Result<Self::Ok> where T: Serialize {
Ok(Value::simple_record("Some", vec![to_value(v)?]).wrap())
}
fn serialize_unit(self) -> Result<Self::Ok> {
Ok(Value::simple_record("tuple", vec![]).wrap())
}
fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok> {
Ok(Value::simple_record(name, vec![]).wrap())
}
fn serialize_unit_variant(self,
_name: &'static str,
_variant: u32,
variant_name: &'static str) ->
Result<Self::Ok>
{
Ok(Value::simple_record(variant_name, vec![]).wrap())
}
fn serialize_newtype_struct<T: ?Sized>(self, name: &'static str, value: &T) ->
Result<Self::Ok> where T: Serialize
{
if name == crate::value::value::MAGIC {
let v = to_value(value)?;
let buf: &[u8] = v.value().as_bytestring().ok_or(Error::InternalMagicError)?;
crate::value::Decoder::new(buf, None).next().or(Err(Error::InternalMagicError))
} else {
// TODO: This is apparently discouraged, and we should apparently just serialize `value`?
Ok(Value::simple_record(name, vec![to_value(value)?]).wrap())
}
}
fn serialize_newtype_variant<T: ?Sized>(self,
_name: &'static str,
_variant: u32,
variant_name: &'static str,
value: &T) ->
Result<Self::Ok> where T: Serialize
{
Ok(Value::simple_record(variant_name, vec![to_value(value)?]).wrap())
}
fn serialize_seq(self, count: Option<usize>) -> Result<Self::SerializeSeq> {
let vec = match count { Some(n) => Vec::with_capacity(n), None => Vec::new() };
Ok(SerializeSequence{ vec })
}
fn serialize_tuple(self, count: usize) -> Result<Self::SerializeTuple> {
Ok(SerializeRecord{ name: "tuple", vec: Vec::with_capacity(count) })
}
fn serialize_tuple_struct(self, name: &'static str, count: usize) ->
Result<Self::SerializeTupleStruct>
{
Ok(SerializeRecord{ name, vec: Vec::with_capacity(count) })
}
fn serialize_tuple_variant(self,
_name: &'static str,
_variant: u32,
variant_name: &'static str,
count: usize) ->
Result<Self::SerializeTupleVariant>
{
Ok(SerializeRecord{ name: variant_name, vec: Vec::with_capacity(count) })
}
fn serialize_map(self, _count: Option<usize>) -> Result<Self::SerializeMap> {
Ok(SerializeDictionary{ next_key: None, items: Dictionary::new() })
}
fn serialize_struct(self, name: &'static str, count: usize) -> Result<Self::SerializeStruct> {
Ok(SerializeRecord{ name, vec: Vec::with_capacity(count) })
}
fn serialize_struct_variant(self,
_name: &'static str,
_variant: u32,
variant_name: &'static str,
count: usize) ->
Result<Self::SerializeStructVariant>
{
Ok(SerializeRecord{ name: variant_name, vec: Vec::with_capacity(count) })
}
}
impl serde::ser::SerializeMap for SerializeDictionary {
type Ok = AValue;
type Error = Error;
fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<()> where T: Serialize {
self.next_key = Some(to_value(key)?);
Ok(())
}
fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: Serialize {
let key = self.next_key.take().unwrap();
self.items.insert(key, to_value(value)?);
Ok(())
}
fn end(self) -> Result<Self::Ok> {
Ok(Value::from(self.items).wrap())
}
}
impl SerializeRecord {
fn push(&mut self, value: AValue) -> Result<()> {
self.vec.push(value);
Ok(())
}
fn finish(self) -> Result<AValue> {
Ok(Value::simple_record(self.name, self.vec).wrap())
}
}
impl serde::ser::SerializeStruct for SerializeRecord {
type Ok = AValue;
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, _name: &'static str, value: &T) -> Result<()>
where T: Serialize
{
self.push(to_value(value)?)
}
fn end(self) -> Result<Self::Ok> {
self.finish()
}
}
impl serde::ser::SerializeStructVariant for SerializeRecord {
type Ok = AValue;
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, _name: &'static str, value: &T) -> Result<()>
where T: Serialize
{
self.push(to_value(value)?)
}
fn end(self) -> Result<Self::Ok> {
self.finish()
}
}
impl serde::ser::SerializeTuple for SerializeRecord {
type Ok = AValue;
type Error = Error;
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: Serialize {
self.push(to_value(value)?)
}
fn end(self) -> Result<Self::Ok> {
self.finish()
}
}
impl serde::ser::SerializeTupleStruct for SerializeRecord {
type Ok = AValue;
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: Serialize {
self.push(to_value(value)?)
}
fn end(self) -> Result<Self::Ok> {
self.finish()
}
}
impl serde::ser::SerializeTupleVariant for SerializeRecord {
type Ok = AValue;
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: Serialize {
self.push(to_value(value)?)
}
fn end(self) -> Result<Self::Ok> {
self.finish()
}
}
impl serde::ser::SerializeSeq for SerializeSequence {
type Ok = AValue;
type Error = Error;
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()> where T: Serialize {
self.vec.push(to_value(value)?);
Ok(())
}
fn end(self) -> Result<Self::Ok> {
Ok(Value::from(self.vec).wrap())
}
}
pub fn to_value<T>(value: T) -> Result<AValue> where T: Serialize {
value.serialize(Serializer)
}