Serializer: 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 } } }
図は次のように拡張できます:
-
StructはPropertyしか含められません; -
Structを終了すると、その親に制御が戻ります。前の スライドではその親をRootと仮定していましたが、実際には、ネストした “structs” の場合のStructのように、別のものになることもあります。