serde_gff/ser/
value.rs

1//! Содержит реализацию типажа `Serialize` для сериализации типа `Value`
2
3use serde::ser::{Serialize, SerializeMap, Serializer};
4
5use crate::Label;
6use crate::value::Value;
7
8impl Serialize for Label {
9  #[inline]
10  fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11    where S: Serializer,
12  {
13    serializer.serialize_bytes(self.as_ref())
14  }
15}
16
17impl Serialize for Value {
18  #[inline]
19  fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
20    where S: Serializer,
21  {
22    use self::Value::*;
23
24    match *self {
25      Byte(val)       => serializer.serialize_u8(val),
26      Char(val)       => serializer.serialize_i8(val),
27      Word(val)       => serializer.serialize_u16(val),
28      Short(val)      => serializer.serialize_i16(val),
29      Dword(val)      => serializer.serialize_u32(val),
30      Int(val)        => serializer.serialize_i32(val),
31      Dword64(val)    => serializer.serialize_u64(val),
32      Int64(val)      => serializer.serialize_i64(val),
33      Float(val)      => serializer.serialize_f32(val),
34      Double(val)     => serializer.serialize_f64(val),
35      String(ref val) => serializer.serialize_str(&val),
36      ResRef(ref val) => serializer.serialize_bytes(&val.0),
37      //TODO: реализовать сериализацию LocString
38      LocString(ref _val) => unimplemented!("serialization of LocString not yet implemented"),
39      Void(ref val)   => serializer.serialize_bytes(&val),
40      Struct(ref val) => {
41        let mut map = serializer.serialize_map(Some(val.len()))?;
42        for (k, v) in val {
43          map.serialize_key(k)?;
44          map.serialize_value(v)?;
45        }
46        map.end()
47      },
48      List(ref val)   => val.serialize(serializer),
49    }
50  }
51}