Serializer: implement Struct
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
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”.