Serializer: 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 } } }
Property 状態のメソッドが追加されたことで、図はほぼ完成です:
-
プロパティは
String、Struct<S>、またはList<S>として定義できるため、ネストした構造を表現できます。 -
これで段階的な実装は完了です。
List<S>のサポートを含む完全な実装は、次のスライドで示します。