enum ParentState<'a> {
Variant {
buffer: &'a mut ValueBuffer,
metadata_builder: &'a mut MetadataBuilder,
},
List {
buffer: &'a mut ValueBuffer,
metadata_builder: &'a mut MetadataBuilder,
offsets: &'a mut Vec<usize>,
},
Object {
buffer: &'a mut ValueBuffer,
metadata_builder: &'a mut MetadataBuilder,
fields: &'a mut IndexMap<u32, usize>,
field_name: &'a str,
},
}
Expand description
Tracks information needed to correctly finalize a nested builder, for each parent builder type.
A child builder has no effect on its parent unless/until its finalize
method is called, at
which point the child appends the new value to the parent. As a (desirable) side effect,
creating a parent state instance captures mutable references to a subset of the parent’s fields,
rendering the parent object completely unusable until the parent state goes out of scope. This
ensures that at most one child builder can exist at a time.
The redundancy in buffer and metadata_builder is because all the references come from the
parent, and we cannot “split” a mutable reference across two objects (parent state and the child
builder that uses it). So everything has to be here. Rust layout optimizations should treat the
variants as a union, so that accessing a buffer
or metadata_builder
is branch-free.