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 }
    }
}

図は次のように拡張できます:

Serializer<Root>Serializer<Struct<S>>Serializer<Property<Struct<S>>>Stringfinishstructserializestructfinishstructserializepropertyfinish
  • StructProperty しか含められません;

  • Struct を終了すると、その親に制御が戻ります。前の スライドではその親を Root と仮定していましたが、実際には、ネストした “structs” の場合の Struct のように、別のものになることもあります。