Serializer: implement Property
#![allow(unused)] fn main() { use std::fmt::Write as _; struct Serializer<S> { // [...] indent: usize, buffer: String, state: S, } struct Struct<S>(S); struct Property<S>(S); struct List<S>(S); impl<S> Serializer<Property<Struct<S>>> { fn serialize_struct(mut self, name: &str) -> Serializer<Struct<Struct<S>>> { // [...] writeln!(self.buffer, "{name} {{").unwrap(); Serializer { indent: self.indent + 1, buffer: self.buffer, state: Struct(self.state.0), } } fn serialize_list(mut self) -> Serializer<List<Struct<S>>> { // [...] writeln!(self.buffer, "[").unwrap(); Serializer { indent: self.indent + 1, buffer: self.buffer, state: List(self.state.0), } } fn serialize_string(mut self, value: &str) -> Serializer<Struct<S>> { // [...] writeln!(self.buffer, "{value},").unwrap(); Serializer { indent: self.indent, buffer: self.buffer, state: self.state.0 } } } }
With the addition of the Property state methods, our diagram is now nearly complete:
-
A property can be defined as a
String
,Struct<S>
, orList<S>
, enabling the representation of nested structures. -
This concludes the step-by-step implementation. The full implementation, including support for
List<S>
, is shown in the next slide.