Skip to main content

cdragon_prop/
serializer.rs

1//! Interfaces for serializing bin data to string
2//!
3//! Two serializers are implemented:
4//!
5//! - [JsonSerializer], for JSON serialization, simpler but drop type details
6//! - [TextTreeSerializer], for custom text format that retains detailed type information
7
8use std::io;
9use super::{
10    BinEntry,
11    PropFile,
12    data::*,
13};
14
15/// Serialize bin data
16#[allow(missing_docs)]
17pub trait BinSerializer {
18    type EntriesSerializer: BinEntriesSerializer;
19
20    /// Write a single entry
21    fn write_entry(&mut self, v: &BinEntry) -> io::Result<()>;
22    /// Return a serializer to write streamed entries
23    fn write_entries(self) -> io::Result<Self::EntriesSerializer>;
24
25    /// Write entries from a `PropFile`
26    fn write_binfile(self, v: &PropFile) -> io::Result<()> where Self: Sized {
27        let mut s = self.write_entries()?;
28        for entry in &v.entries {
29            s.write_entry(entry)?;
30        }
31        s.end()?;
32        Ok(())
33    }
34
35    // Scalar values
36    fn write_none(&mut self, v: &BinNone) -> io::Result<()>;
37    fn write_bool(&mut self, v: &BinBool) -> io::Result<()>;
38    fn write_s8(&mut self, v: &BinS8) -> io::Result<()>;
39    fn write_u8(&mut self, v: &BinU8) -> io::Result<()>;
40    fn write_s16(&mut self, v: &BinS16) -> io::Result<()>;
41    fn write_u16(&mut self, v: &BinU16) -> io::Result<()>;
42    fn write_s32(&mut self, v: &BinS32) -> io::Result<()>;
43    fn write_u32(&mut self, v: &BinU32) -> io::Result<()>;
44    fn write_s64(&mut self, v: &BinS64) -> io::Result<()>;
45    fn write_u64(&mut self, v: &BinU64) -> io::Result<()>;
46    fn write_float(&mut self, v: &BinFloat) -> io::Result<()>;
47    fn write_vec2(&mut self, v: &BinVec2) -> io::Result<()>;
48    fn write_vec3(&mut self, v: &BinVec3) -> io::Result<()>;
49    fn write_vec4(&mut self, v: &BinVec4) -> io::Result<()>;
50    fn write_matrix(&mut self, v: &BinMatrix) -> io::Result<()>;
51    fn write_color(&mut self, v: &BinColor) -> io::Result<()>;
52    fn write_string(&mut self, v: &BinString) -> io::Result<()>;
53    fn write_hash(&mut self, v: &BinHash) -> io::Result<()>;
54    fn write_path(&mut self, v: &BinPath) -> io::Result<()>;
55    fn write_link(&mut self, v: &BinLink) -> io::Result<()>;
56    fn write_flag(&mut self, v: &BinFlag) -> io::Result<()>;
57
58    // Nested types
59    fn write_list(&mut self, v: &BinList) -> io::Result<()>;
60    fn write_struct(&mut self, v: &BinStruct) -> io::Result<()>;
61    fn write_embed(&mut self, v: &BinEmbed) -> io::Result<()>;
62    fn write_option(&mut self, v: &BinOption) -> io::Result<()>;
63    fn write_map(&mut self, v: &BinMap) -> io::Result<()>;
64}
65
66/// Serialize streamed bin entries
67pub trait BinEntriesSerializer {
68    /// Serialize an [BinEntry]
69    fn write_entry(&mut self, entry: &BinEntry) -> io::Result<()>;
70    /// End the serialization
71    ///
72    /// This method should move out `end(self)` but it does not work on boxed instances.
73    fn end(&mut self) -> io::Result<()>;
74}
75
76
77/// Serializable bin data
78///
79/// This trait is intended to be used by `BinSerializer` implementations.
80pub trait BinSerializable {
81    fn serialize_bin<S: BinSerializer>(&self, s: &mut S) -> io::Result<()>;
82}
83
84macro_rules! impl_serializable {
85    ($type:ty, $func:ident) => {
86        impl BinSerializable for $type {
87            /// Serialize the value
88            fn serialize_bin<S: BinSerializer>(&self, s: &mut S) -> io::Result<()> {
89                s.$func(self)
90            }
91        }
92    }
93}
94
95impl_serializable!(BinNone, write_none);
96impl_serializable!(BinBool, write_bool);
97impl_serializable!(BinS8, write_s8);
98impl_serializable!(BinU8, write_u8);
99impl_serializable!(BinS16, write_s16);
100impl_serializable!(BinU16, write_u16);
101impl_serializable!(BinS32, write_s32);
102impl_serializable!(BinU32, write_u32);
103impl_serializable!(BinS64, write_s64);
104impl_serializable!(BinU64, write_u64);
105impl_serializable!(BinFloat, write_float);
106impl_serializable!(BinVec2, write_vec2);
107impl_serializable!(BinVec3, write_vec3);
108impl_serializable!(BinVec4, write_vec4);
109impl_serializable!(BinMatrix, write_matrix);
110impl_serializable!(BinColor, write_color);
111impl_serializable!(BinString, write_string);
112impl_serializable!(BinHash, write_hash);
113impl_serializable!(BinPath, write_path);
114impl_serializable!(BinList, write_list);
115impl_serializable!(BinStruct, write_struct);
116impl_serializable!(BinEmbed, write_embed);
117impl_serializable!(BinLink, write_link);
118impl_serializable!(BinOption, write_option);
119impl_serializable!(BinMap, write_map);
120impl_serializable!(BinFlag, write_flag);
121