serde_ron/value/
ser.rs

1use serde::ser::{SerializeSeq, SerializeTuple, SerializeTupleStruct, SerializeTupleVariant, SerializeMap, SerializeStruct, SerializeStructVariant};
2use serde::Serialize;
3
4use std::collections::BTreeMap;
5
6use crate::Error;
7use super::{Primitive, Value, Data, Number};
8
9type Result<O> = std::result::Result<O, Error>;
10
11pub struct Serializer;
12
13impl serde::Serializer for Serializer {
14    type Ok = Value;
15    type Error = Error;
16    type SerializeSeq = Sequence;
17    type SerializeTuple = Tuple;
18    type SerializeTupleStruct = TupleStruct;
19    type SerializeTupleVariant = TupleVariant;
20    type SerializeMap = Map;
21    type SerializeStruct = Struct;
22    type SerializeStructVariant = StructVariant;
23
24    fn serialize_bool(self, v: bool) -> Result<Value> {Ok(Value::Primitive(Primitive::bool(v)))}
25    fn serialize_i8(self, v: i8) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::i8(v))))}
26    fn serialize_i16(self, v: i16) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::i16(v))))}
27    fn serialize_i32(self, v: i32) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::i32(v))))}
28    fn serialize_i64(self, v: i64) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::i64(v))))}
29    fn serialize_u8(self, v: u8) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::u8(v))))}
30    fn serialize_u16(self, v: u16) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::u16(v))))}
31    fn serialize_u32(self, v: u32) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::u32(v))))}
32    fn serialize_u64(self, v: u64) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::u64(v))))}
33    fn serialize_f32(self, v: f32) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::f32(v))))}
34    fn serialize_f64(self, v: f64) -> Result<Value> {Ok(Value::Primitive(Primitive::Number(Number::f64(v))))}
35    fn serialize_char(self, v: char) -> Result<Value> {Ok(Value::Primitive(Primitive::char(v)))}
36    fn serialize_str(self, v: &str) -> Result<Value> {Ok(Value::Primitive(Primitive::String(v.to_string())))}
37    fn serialize_bytes(self, v: &[u8]) -> Result<Value> {Ok(Value::Primitive(Primitive::Bytes(v.to_vec())))}
38
39    fn serialize_none(self) -> Result<Value> {Ok(Value::None)}
40    fn serialize_some<T: Serialize + ?Sized>(self, value: &T) -> Result<Value> {Ok(Value::Some(Box::new(value.serialize(Serializer)?)))}
41    fn serialize_unit(self) -> Result<Value> {Ok(Value::Primitive(Primitive::Unit))}
42
43    fn serialize_unit_struct(self, name: &'static str) -> Result<Value> {
44        Ok(Value::Struct(name.to_string(), Data::Unit))
45    }
46    fn serialize_unit_variant(self, name: &'static str, _: u32, variant: &'static str) -> Result<Value> {
47        Ok(Value::Variant(name.to_string(), variant.to_string(), Data::Unit))
48    }
49
50    fn serialize_newtype_struct<T: Serialize + ?Sized>(self, name: &'static str, value: &T) -> Result<Value> {
51        Ok(Value::Struct(name.to_string(), Data::NewType(Box::new(value.serialize(Serializer)?))))
52    }
53    fn serialize_newtype_variant<T: Serialize + ?Sized>(
54        self, name: &'static str, _: u32, variant: &'static str, value: &T
55    ) -> Result<Value> {
56        Ok(Value::Variant(name.to_string(), variant.to_string(), Data::NewType(Box::new(value.serialize(Serializer)?))))
57    }
58
59    fn serialize_struct(self, name: &'static str, _: usize) -> Result<Struct> {
60        Ok(Struct(name.to_string(), BTreeMap::new()))
61    }
62    fn serialize_struct_variant(self, name: &'static str, _: u32, variant: &'static str, _: usize) -> Result<StructVariant> {
63        Ok(StructVariant(name.to_string(), variant.to_string(), BTreeMap::new()))
64    }
65
66    fn serialize_tuple_struct(self, name: &'static str, _: usize) -> Result<TupleStruct> {
67        Ok(TupleStruct(name.to_string(), Vec::new()))
68    }
69    fn serialize_tuple_variant(self, name: &'static str, _: u32, variant: &'static str, _: usize) -> Result<TupleVariant> {
70        Ok(TupleVariant(name.to_string(), variant.to_string(), Vec::new()))
71    }
72
73    fn serialize_tuple(self, _: usize) -> Result<Tuple> {Ok(Tuple(Vec::new()))}
74    fn serialize_seq(self, _: Option<usize>) -> Result<Sequence> {Ok(Sequence(Vec::new()))}
75    fn serialize_map(self, _: Option<usize>) -> Result<Map> {Ok(Map(None, BTreeMap::new()))}
76}
77
78pub struct Map(Option<Value>, BTreeMap<Value, Value>);
79impl SerializeMap for Map {
80    type Ok = Value;
81    type Error = Error;
82
83    fn serialize_key<T: Serialize + ?Sized>(&mut self, key: &T) -> Result<()> {
84        self.0 = Some(key.serialize(Serializer)?);
85        Ok(())
86    }
87    fn serialize_value<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
88        self.1.insert(self.0.take().unwrap(), value.serialize(Serializer)?);
89        Ok(())
90    }
91    fn end(self) -> Result<Value> {Ok(Value::Map(self.1))}
92}
93
94pub struct Sequence(Vec<Value>);
95impl SerializeSeq for Sequence {
96    type Ok = Value;
97    type Error = Error;
98
99    fn serialize_element<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
100        self.0.push(value.serialize(Serializer)?);
101        Ok(())
102    }
103    fn end(self) -> Result<Value> {Ok(Value::Vec(self.0))}
104}
105
106pub struct Tuple(Vec<Value>);
107impl SerializeTuple for Tuple {
108    type Ok = Value;
109    type Error = Error;
110
111    fn serialize_element<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
112        self.0.push(value.serialize(Serializer)?);
113        Ok(())
114    }
115    fn end(self) -> Result<Value> {Ok(Value::Tuple(self.0))}
116}
117
118pub struct TupleStruct(String, Vec<Value>);
119impl SerializeTupleStruct for TupleStruct {
120    type Ok = Value;
121    type Error = Error;
122
123    fn serialize_field<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
124        self.1.push(value.serialize(Serializer)?);
125        Ok(())
126    }
127    fn end(self) -> Result<Value> {Ok(Value::Struct(self.0, Data::Tuple(self.1)))}
128}
129
130pub struct TupleVariant(String, String, Vec<Value>);
131impl SerializeTupleVariant for TupleVariant {
132    type Ok = Value;
133    type Error = Error;
134
135    fn serialize_field<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
136        self.2.push(value.serialize(Serializer)?);
137        Ok(())
138    }
139    fn end(self) -> Result<Value> {Ok(Value::Variant(self.0, self.1, Data::Tuple(self.2)))}
140}
141
142pub struct Struct(String, BTreeMap<String, Value>);
143impl SerializeStruct for Struct {
144    type Ok = Value;
145    type Error = Error;
146
147    fn serialize_field<T: Serialize + ?Sized>(&mut self, key: &'static str, value: &T) -> Result<()> {
148        self.1.insert(key.to_string(), value.serialize(Serializer)?);
149        Ok(())
150    }
151    fn end(self) -> Result<Value> {Ok(Value::Struct(self.0, Data::Struct(self.1)))}
152}
153
154pub struct StructVariant(String, String, BTreeMap<String, Value>);
155impl SerializeStructVariant for StructVariant {
156    type Ok = Value;
157    type Error = Error;
158
159    fn serialize_field<T: Serialize + ?Sized>(&mut self, key: &'static str, value: &T) -> Result<()> {
160        self.2.insert(key.to_string(), value.serialize(Serializer)?);
161        Ok(())
162    }
163    fn end(self) -> Result<Value> {Ok(Value::Variant(self.0, self.1, Data::Struct(self.2)))}
164}