Serializer: implement Struct
#![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); impl<S> Serializer<Struct<S>> { fn serialize_property(mut self, name: &str) -> Serializer<Property<Struct<S>>> { // [...] write!(self.buffer, "{}{name}: ", " ".repeat(self.indent * 2)).unwrap(); Serializer { indent: self.indent, buffer: self.buffer, state: Property(self.state), } } fn finish_struct(mut self) -> Serializer<S> { // [...] self.indent -= 1; writeln!(self.buffer, "{}}}", " ".repeat(self.indent * 2)).unwrap(); Serializer { indent: self.indent, buffer: self.buffer, state: self.state.0 } } } }
The diagram can now be expanded as follows:
-
A
Structcan only contain aProperty; -
Finishing a
Structreturns control back to its parent, which in our previous slide was assumed theRoot, but in reality however it can be also something else such asStructin case of nested “structs”.