Serializer: implement Property
// 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);
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.