Сериализатор: реализация 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, но на самом деле им может быть и что-то другое, напримерStructв случае вложенных «структур».