parquet_variant/
builder.rs

1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements.  See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.  The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License.  You may obtain a copy of the License at
8//
9//   http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied.  See the License for the
15// specific language governing permissions and limitations
16// under the License.
17use crate::decoder::{VariantBasicType, VariantPrimitiveType};
18use crate::{
19    ShortString, Variant, VariantDecimal16, VariantDecimal4, VariantDecimal8, VariantList,
20    VariantMetadata, VariantObject,
21};
22use arrow_schema::ArrowError;
23use chrono::Timelike;
24use indexmap::{IndexMap, IndexSet};
25use uuid::Uuid;
26
27use std::collections::HashMap;
28
29const BASIC_TYPE_BITS: u8 = 2;
30const UNIX_EPOCH_DATE: chrono::NaiveDate = chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
31
32fn primitive_header(primitive_type: VariantPrimitiveType) -> u8 {
33    (primitive_type as u8) << 2 | VariantBasicType::Primitive as u8
34}
35
36fn short_string_header(len: usize) -> u8 {
37    (len as u8) << 2 | VariantBasicType::ShortString as u8
38}
39
40fn array_header(large: bool, offset_size: u8) -> u8 {
41    let large_bit = if large { 1 } else { 0 };
42    (large_bit << (BASIC_TYPE_BITS + 2))
43        | ((offset_size - 1) << BASIC_TYPE_BITS)
44        | VariantBasicType::Array as u8
45}
46
47fn object_header(large: bool, id_size: u8, offset_size: u8) -> u8 {
48    let large_bit = if large { 1 } else { 0 };
49    (large_bit << (BASIC_TYPE_BITS + 4))
50        | ((id_size - 1) << (BASIC_TYPE_BITS + 2))
51        | ((offset_size - 1) << BASIC_TYPE_BITS)
52        | VariantBasicType::Object as u8
53}
54
55fn int_size(v: usize) -> u8 {
56    match v {
57        0..=0xFF => 1,
58        0x100..=0xFFFF => 2,
59        0x10000..=0xFFFFFF => 3,
60        _ => 4,
61    }
62}
63
64/// Write little-endian integer to buffer
65fn write_offset(buf: &mut Vec<u8>, value: usize, nbytes: u8) {
66    let bytes = value.to_le_bytes();
67    buf.extend_from_slice(&bytes[..nbytes as usize]);
68}
69
70/// Write little-endian integer to buffer at a specific position
71fn write_offset_at_pos(buf: &mut [u8], start_pos: usize, value: usize, nbytes: u8) {
72    let bytes = value.to_le_bytes();
73    buf[start_pos..start_pos + nbytes as usize].copy_from_slice(&bytes[..nbytes as usize]);
74}
75
76/// Append `value_size` bytes of given `value` into `dest`.
77fn append_packed_u32(dest: &mut Vec<u8>, value: u32, value_size: usize) {
78    let n = dest.len() + value_size;
79    dest.extend(value.to_le_bytes());
80    dest.truncate(n);
81}
82
83/// Wrapper around a `Vec<u8>` that provides methods for appending
84/// primitive values, variant types, and metadata.
85///
86/// This is used internally by the builders to construct the
87/// the `value` field for [`Variant`] values.
88///
89/// You can reuse an existing `Vec<u8>` by using the `from` impl
90#[derive(Debug, Default)]
91pub struct ValueBuilder(Vec<u8>);
92
93impl ValueBuilder {
94    /// Construct a ValueBuffer that will write to a new underlying `Vec`
95    pub fn new() -> Self {
96        Default::default()
97    }
98}
99
100/// Macro to generate the match statement for each append_variant, try_append_variant, and
101/// append_variant_bytes -- they each have slightly different handling for object and list handling.
102macro_rules! variant_append_value {
103    ($builder:expr, $value:expr, $object_pat:pat => $object_arm:expr, $list_pat:pat => $list_arm:expr) => {
104        match $value {
105            Variant::Null => $builder.append_null(),
106            Variant::BooleanTrue => $builder.append_bool(true),
107            Variant::BooleanFalse => $builder.append_bool(false),
108            Variant::Int8(v) => $builder.append_int8(v),
109            Variant::Int16(v) => $builder.append_int16(v),
110            Variant::Int32(v) => $builder.append_int32(v),
111            Variant::Int64(v) => $builder.append_int64(v),
112            Variant::Date(v) => $builder.append_date(v),
113            Variant::Time(v) => $builder.append_time_micros(v),
114            Variant::TimestampMicros(v) => $builder.append_timestamp_micros(v),
115            Variant::TimestampNtzMicros(v) => $builder.append_timestamp_ntz_micros(v),
116            Variant::TimestampNanos(v) => $builder.append_timestamp_nanos(v),
117            Variant::TimestampNtzNanos(v) => $builder.append_timestamp_ntz_nanos(v),
118            Variant::Decimal4(decimal4) => $builder.append_decimal4(decimal4),
119            Variant::Decimal8(decimal8) => $builder.append_decimal8(decimal8),
120            Variant::Decimal16(decimal16) => $builder.append_decimal16(decimal16),
121            Variant::Float(v) => $builder.append_float(v),
122            Variant::Double(v) => $builder.append_double(v),
123            Variant::Binary(v) => $builder.append_binary(v),
124            Variant::String(s) => $builder.append_string(s),
125            Variant::ShortString(s) => $builder.append_short_string(s),
126            Variant::Uuid(v) => $builder.append_uuid(v),
127            $object_pat => $object_arm,
128            $list_pat => $list_arm,
129        }
130    };
131}
132
133impl ValueBuilder {
134    fn append_u8(&mut self, term: u8) {
135        self.0.push(term);
136    }
137
138    fn append_slice(&mut self, other: &[u8]) {
139        self.0.extend_from_slice(other);
140    }
141
142    fn append_primitive_header(&mut self, primitive_type: VariantPrimitiveType) {
143        self.0.push(primitive_header(primitive_type));
144    }
145
146    /// Returns the underlying buffer, consuming self
147    pub fn into_inner(self) -> Vec<u8> {
148        self.0
149    }
150
151    fn inner_mut(&mut self) -> &mut Vec<u8> {
152        &mut self.0
153    }
154
155    // Variant types below
156
157    fn append_null(&mut self) {
158        self.append_primitive_header(VariantPrimitiveType::Null);
159    }
160
161    fn append_bool(&mut self, value: bool) {
162        let primitive_type = if value {
163            VariantPrimitiveType::BooleanTrue
164        } else {
165            VariantPrimitiveType::BooleanFalse
166        };
167        self.append_primitive_header(primitive_type);
168    }
169
170    fn append_int8(&mut self, value: i8) {
171        self.append_primitive_header(VariantPrimitiveType::Int8);
172        self.append_u8(value as u8);
173    }
174
175    fn append_int16(&mut self, value: i16) {
176        self.append_primitive_header(VariantPrimitiveType::Int16);
177        self.append_slice(&value.to_le_bytes());
178    }
179
180    fn append_int32(&mut self, value: i32) {
181        self.append_primitive_header(VariantPrimitiveType::Int32);
182        self.append_slice(&value.to_le_bytes());
183    }
184
185    fn append_int64(&mut self, value: i64) {
186        self.append_primitive_header(VariantPrimitiveType::Int64);
187        self.append_slice(&value.to_le_bytes());
188    }
189
190    fn append_float(&mut self, value: f32) {
191        self.append_primitive_header(VariantPrimitiveType::Float);
192        self.append_slice(&value.to_le_bytes());
193    }
194
195    fn append_double(&mut self, value: f64) {
196        self.append_primitive_header(VariantPrimitiveType::Double);
197        self.append_slice(&value.to_le_bytes());
198    }
199
200    fn append_date(&mut self, value: chrono::NaiveDate) {
201        self.append_primitive_header(VariantPrimitiveType::Date);
202        let days_since_epoch = value.signed_duration_since(UNIX_EPOCH_DATE).num_days() as i32;
203        self.append_slice(&days_since_epoch.to_le_bytes());
204    }
205
206    fn append_timestamp_micros(&mut self, value: chrono::DateTime<chrono::Utc>) {
207        self.append_primitive_header(VariantPrimitiveType::TimestampMicros);
208        let micros = value.timestamp_micros();
209        self.append_slice(&micros.to_le_bytes());
210    }
211
212    fn append_timestamp_ntz_micros(&mut self, value: chrono::NaiveDateTime) {
213        self.append_primitive_header(VariantPrimitiveType::TimestampNtzMicros);
214        let micros = value.and_utc().timestamp_micros();
215        self.append_slice(&micros.to_le_bytes());
216    }
217
218    fn append_time_micros(&mut self, value: chrono::NaiveTime) {
219        self.append_primitive_header(VariantPrimitiveType::Time);
220        let micros_from_midnight = value.num_seconds_from_midnight() as u64 * 1_000_000
221            + value.nanosecond() as u64 / 1_000;
222        self.append_slice(&micros_from_midnight.to_le_bytes());
223    }
224
225    fn append_timestamp_nanos(&mut self, value: chrono::DateTime<chrono::Utc>) {
226        self.append_primitive_header(VariantPrimitiveType::TimestampNanos);
227        let nanos = value.timestamp_nanos_opt().unwrap();
228        self.append_slice(&nanos.to_le_bytes());
229    }
230
231    fn append_timestamp_ntz_nanos(&mut self, value: chrono::NaiveDateTime) {
232        self.append_primitive_header(VariantPrimitiveType::TimestampNtzNanos);
233        let nanos = value.and_utc().timestamp_nanos_opt().unwrap();
234        self.append_slice(&nanos.to_le_bytes());
235    }
236
237    fn append_uuid(&mut self, value: Uuid) {
238        self.append_primitive_header(VariantPrimitiveType::Uuid);
239        self.append_slice(&value.into_bytes());
240    }
241
242    fn append_decimal4(&mut self, decimal4: VariantDecimal4) {
243        self.append_primitive_header(VariantPrimitiveType::Decimal4);
244        self.append_u8(decimal4.scale());
245        self.append_slice(&decimal4.integer().to_le_bytes());
246    }
247
248    fn append_decimal8(&mut self, decimal8: VariantDecimal8) {
249        self.append_primitive_header(VariantPrimitiveType::Decimal8);
250        self.append_u8(decimal8.scale());
251        self.append_slice(&decimal8.integer().to_le_bytes());
252    }
253
254    fn append_decimal16(&mut self, decimal16: VariantDecimal16) {
255        self.append_primitive_header(VariantPrimitiveType::Decimal16);
256        self.append_u8(decimal16.scale());
257        self.append_slice(&decimal16.integer().to_le_bytes());
258    }
259
260    fn append_binary(&mut self, value: &[u8]) {
261        self.append_primitive_header(VariantPrimitiveType::Binary);
262        self.append_slice(&(value.len() as u32).to_le_bytes());
263        self.append_slice(value);
264    }
265
266    fn append_short_string(&mut self, value: ShortString) {
267        let inner = value.0;
268        self.append_u8(short_string_header(inner.len()));
269        self.append_slice(inner.as_bytes());
270    }
271
272    fn append_string(&mut self, value: &str) {
273        self.append_primitive_header(VariantPrimitiveType::String);
274        self.append_slice(&(value.len() as u32).to_le_bytes());
275        self.append_slice(value.as_bytes());
276    }
277
278    fn append_object(state: ParentState<'_>, obj: VariantObject) {
279        let mut object_builder = ObjectBuilder::new(state, false);
280
281        for (field_name, value) in obj.iter() {
282            object_builder.insert(field_name, value);
283        }
284
285        object_builder.finish();
286    }
287
288    fn try_append_object(state: ParentState<'_>, obj: VariantObject) -> Result<(), ArrowError> {
289        let mut object_builder = ObjectBuilder::new(state, false);
290
291        for res in obj.iter_try() {
292            let (field_name, value) = res?;
293            object_builder.try_insert(field_name, value)?;
294        }
295
296        object_builder.finish();
297        Ok(())
298    }
299
300    fn append_list(state: ParentState<'_>, list: VariantList) {
301        let mut list_builder = ListBuilder::new(state, false);
302        for value in list.iter() {
303            list_builder.append_value(value);
304        }
305        list_builder.finish();
306    }
307
308    fn try_append_list(state: ParentState<'_>, list: VariantList) -> Result<(), ArrowError> {
309        let mut list_builder = ListBuilder::new(state, false);
310        for res in list.iter_try() {
311            let value = res?;
312            list_builder.try_append_value(value)?;
313        }
314
315        list_builder.finish();
316
317        Ok(())
318    }
319
320    /// Returns the current size of the underlying buffer
321    pub fn offset(&self) -> usize {
322        self.0.len()
323    }
324
325    /// Appends a variant to the builder.
326    ///
327    /// # Panics
328    ///
329    /// This method will panic if the variant contains duplicate field names in objects
330    /// when validation is enabled. For a fallible version, use [`ValueBuilder::try_append_variant`]
331    pub fn append_variant(mut state: ParentState<'_>, variant: Variant<'_, '_>) {
332        let builder = state.value_builder();
333        variant_append_value!(
334            builder,
335            variant,
336            Variant::Object(obj) => return Self::append_object(state, obj),
337            Variant::List(list) => return Self::append_list(state, list)
338        );
339        state.finish();
340    }
341
342    /// Tries to append a variant to the provided [`ParentState`] instance.
343    ///
344    /// The attempt fails if the variant contains duplicate field names in objects when validation
345    /// is enabled.
346    pub fn try_append_variant(
347        mut state: ParentState<'_>,
348        variant: Variant<'_, '_>,
349    ) -> Result<(), ArrowError> {
350        let builder = state.value_builder();
351        variant_append_value!(
352            builder,
353            variant,
354            Variant::Object(obj) => return Self::try_append_object(state, obj),
355            Variant::List(list) => return Self::try_append_list(state, list)
356        );
357        state.finish();
358        Ok(())
359    }
360
361    /// Appends a variant to the buffer by copying raw bytes when possible.
362    ///
363    /// For objects and lists, this directly copies their underlying byte representation instead of
364    /// performing a logical copy and without touching the metadata builder. For other variant
365    /// types, this falls back to the standard append behavior.
366    ///
367    /// The caller must ensure that the metadata dictionary is already built and correct for
368    /// any objects or lists being appended.
369    pub fn append_variant_bytes(mut state: ParentState<'_>, variant: Variant<'_, '_>) {
370        let builder = state.value_builder();
371        variant_append_value!(
372            builder,
373            variant,
374            Variant::Object(obj) => builder.append_slice(obj.value),
375            Variant::List(list) => builder.append_slice(list.value)
376        );
377        state.finish();
378    }
379
380    /// Writes out the header byte for a variant object or list, from the starting position
381    /// of the builder, will return the position after this write
382    fn append_header_start_from_buf_pos(
383        &mut self,
384        start_pos: usize, // the start position where the header will be inserted
385        header_byte: u8,
386        is_large: bool,
387        num_fields: usize,
388    ) -> usize {
389        let buffer = self.inner_mut();
390
391        // Write header at the original start position
392        let mut header_pos = start_pos;
393
394        // Write header byte
395        buffer[header_pos] = header_byte;
396        header_pos += 1;
397
398        // Write number of fields
399        if is_large {
400            buffer[header_pos..header_pos + 4].copy_from_slice(&(num_fields as u32).to_le_bytes());
401            header_pos += 4;
402        } else {
403            buffer[header_pos] = num_fields as u8;
404            header_pos += 1;
405        }
406
407        header_pos
408    }
409
410    /// Writes out the offsets for an array of offsets, including the final offset (data size).
411    /// from the starting position of the buffer, will return the position after this write
412    fn append_offset_array_start_from_buf_pos(
413        &mut self,
414        start_pos: usize,
415        offsets: impl IntoIterator<Item = usize>,
416        data_size: Option<usize>,
417        nbytes: u8,
418    ) -> usize {
419        let buf = self.inner_mut();
420
421        let mut current_pos = start_pos;
422        for relative_offset in offsets {
423            write_offset_at_pos(buf, current_pos, relative_offset, nbytes);
424            current_pos += nbytes as usize;
425        }
426
427        // Write data_size
428        if let Some(data_size) = data_size {
429            // Write data_size at the end of the offsets
430            write_offset_at_pos(buf, current_pos, data_size, nbytes);
431            current_pos += nbytes as usize;
432        }
433
434        current_pos
435    }
436}
437
438/// A trait for building variant metadata dictionaries, to be used in conjunction with a
439/// [`ValueBuilder`]. The trait provides methods for managing field names and their IDs, as well as
440/// rolling back a failed builder operation that might have created new field ids.
441pub trait MetadataBuilder: std::fmt::Debug {
442    /// Attempts to register a field name, returning the corresponding (possibly newly-created)
443    /// field id on success. Attempting to register the same field name twice will _generally_
444    /// produce the same field id both times, but the variant spec does not actually require it.
445    fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError>;
446
447    /// Retrieves the field name for a given field id, which must be less than
448    /// [`Self::num_field_names`]. Panics if the field id is out of bounds.
449    fn field_name(&self, field_id: usize) -> &str;
450
451    /// Returns the number of field names stored in this metadata builder. Any number less than this
452    /// is a valid field id. The builder can be reverted back to this size later on (discarding any
453    /// newer/higher field ids) by calling [`Self::truncate_field_names`].
454    fn num_field_names(&self) -> usize;
455
456    /// Reverts the field names to a previous size, discarding any newly out of bounds field ids.
457    fn truncate_field_names(&mut self, new_size: usize);
458
459    /// Finishes the current metadata dictionary, returning the new size of the underlying buffer.
460    fn finish(&mut self) -> usize;
461}
462
463impl MetadataBuilder for WritableMetadataBuilder {
464    fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError> {
465        Ok(self.upsert_field_name(field_name))
466    }
467    fn field_name(&self, field_id: usize) -> &str {
468        self.field_name(field_id)
469    }
470    fn num_field_names(&self) -> usize {
471        self.num_field_names()
472    }
473    fn truncate_field_names(&mut self, new_size: usize) {
474        self.field_names.truncate(new_size)
475    }
476    fn finish(&mut self) -> usize {
477        self.finish()
478    }
479}
480
481/// A metadata builder that cannot register new field names, and merely returns the field id
482/// associated with a known field name. This is useful for variant unshredding operations, where the
483/// metadata column is fixed and -- per variant shredding spec -- already contains all field names
484/// from the typed_value column. It is also useful when projecting a subset of fields from a variant
485/// object value, since the bytes can be copied across directly without re-encoding their field ids.
486///
487/// NOTE: [`Self::finish`] is a no-op. If the intent is to make a copy of the underlying bytes each
488/// time `finish` is called, a different trait impl will be needed.
489#[derive(Debug)]
490pub struct ReadOnlyMetadataBuilder<'m> {
491    metadata: VariantMetadata<'m>,
492    // A cache that tracks field names this builder has already seen, because finding the field id
493    // for a given field name is expensive -- O(n) for a large and unsorted metadata dictionary.
494    known_field_names: HashMap<&'m str, u32>,
495}
496
497impl<'m> ReadOnlyMetadataBuilder<'m> {
498    /// Creates a new read-only metadata builder from the given metadata dictionary.
499    pub fn new(metadata: VariantMetadata<'m>) -> Self {
500        Self {
501            metadata,
502            known_field_names: HashMap::new(),
503        }
504    }
505}
506
507impl MetadataBuilder for ReadOnlyMetadataBuilder<'_> {
508    fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError> {
509        if let Some(field_id) = self.known_field_names.get(field_name) {
510            return Ok(*field_id);
511        }
512
513        let Some((field_id, field_name)) = self.metadata.get_entry(field_name) else {
514            return Err(ArrowError::InvalidArgumentError(format!(
515                "Field name '{field_name}' not found in metadata dictionary"
516            )));
517        };
518
519        self.known_field_names.insert(field_name, field_id);
520        Ok(field_id)
521    }
522    fn field_name(&self, field_id: usize) -> &str {
523        &self.metadata[field_id]
524    }
525    fn num_field_names(&self) -> usize {
526        self.metadata.len()
527    }
528    fn truncate_field_names(&mut self, new_size: usize) {
529        debug_assert_eq!(self.metadata.len(), new_size);
530    }
531    fn finish(&mut self) -> usize {
532        self.metadata.bytes.len()
533    }
534}
535
536/// Builder for constructing metadata for [`Variant`] values.
537///
538/// This is used internally by the [`VariantBuilder`] to construct the metadata
539///
540/// You can use an existing `Vec<u8>` as the metadata buffer by using the `from` impl.
541#[derive(Default, Debug)]
542pub struct WritableMetadataBuilder {
543    // Field names -- field_ids are assigned in insert order
544    field_names: IndexSet<String>,
545
546    // flag that checks if field names by insertion order are also lexicographically sorted
547    is_sorted: bool,
548
549    /// Output buffer. Metadata is written to the end of this buffer
550    metadata_buffer: Vec<u8>,
551}
552
553impl WritableMetadataBuilder {
554    /// Upsert field name to dictionary, return its ID
555    fn upsert_field_name(&mut self, field_name: &str) -> u32 {
556        let (id, new_entry) = self.field_names.insert_full(field_name.to_string());
557
558        if new_entry {
559            let n = self.num_field_names();
560
561            // Dictionary sort order tracking:
562            // - An empty dictionary is unsorted (ambiguous in spec but required by interop tests)
563            // - A single-entry dictionary is trivially sorted
564            // - Otherwise, an already-sorted dictionary becomes unsorted if the new entry breaks order
565            self.is_sorted =
566                n == 1 || self.is_sorted && (self.field_names[n - 2] < self.field_names[n - 1]);
567        }
568
569        id as u32
570    }
571
572    /// The current length of the underlying metadata buffer
573    pub fn offset(&self) -> usize {
574        self.metadata_buffer.len()
575    }
576
577    /// Returns the number of field names stored in the metadata builder.
578    /// Note: this method should be the only place to call `self.field_names.len()`
579    ///
580    /// # Panics
581    ///
582    /// If the number of field names exceeds the maximum allowed value for `u32`.
583    fn num_field_names(&self) -> usize {
584        let n = self.field_names.len();
585        assert!(n <= u32::MAX as usize);
586
587        n
588    }
589
590    fn field_name(&self, i: usize) -> &str {
591        &self.field_names[i]
592    }
593
594    fn metadata_size(&self) -> usize {
595        self.field_names.iter().map(|k| k.len()).sum()
596    }
597
598    /// Finalizes the metadata dictionary and appends its serialized bytes to the underlying buffer,
599    /// returning the resulting [`Self::offset`]. The builder state is reset and ready to start
600    /// building a new metadata dictionary.
601    pub fn finish(&mut self) -> usize {
602        let nkeys = self.num_field_names();
603
604        // Calculate metadata size
605        let total_dict_size: usize = self.metadata_size();
606
607        let metadata_buffer = &mut self.metadata_buffer;
608        let is_sorted = std::mem::take(&mut self.is_sorted);
609        let field_names = std::mem::take(&mut self.field_names);
610
611        // Determine appropriate offset size based on the larger of dict size or total string size
612        let max_offset = std::cmp::max(total_dict_size, nkeys);
613        let offset_size = int_size(max_offset);
614
615        let offset_start = 1 + offset_size as usize;
616        let string_start = offset_start + (nkeys + 1) * offset_size as usize;
617        let metadata_size = string_start + total_dict_size;
618
619        metadata_buffer.reserve(metadata_size);
620
621        // Write header: version=1, field names are sorted, with calculated offset_size
622        metadata_buffer.push(0x01 | (is_sorted as u8) << 4 | ((offset_size - 1) << 6));
623
624        // Write dictionary size
625        write_offset(metadata_buffer, nkeys, offset_size);
626
627        // Write offsets
628        let mut cur_offset = 0;
629        for key in field_names.iter() {
630            write_offset(metadata_buffer, cur_offset, offset_size);
631            cur_offset += key.len();
632        }
633        // Write final offset
634        write_offset(metadata_buffer, cur_offset, offset_size);
635
636        // Write string data
637        for key in field_names {
638            metadata_buffer.extend_from_slice(key.as_bytes());
639        }
640
641        metadata_buffer.len()
642    }
643
644    /// Returns the inner buffer, consuming self without finalizing any in progress metadata.
645    pub fn into_inner(self) -> Vec<u8> {
646        self.metadata_buffer
647    }
648}
649
650impl<S: AsRef<str>> FromIterator<S> for WritableMetadataBuilder {
651    fn from_iter<T: IntoIterator<Item = S>>(iter: T) -> Self {
652        let mut this = Self::default();
653        this.extend(iter);
654
655        this
656    }
657}
658
659impl<S: AsRef<str>> Extend<S> for WritableMetadataBuilder {
660    fn extend<T: IntoIterator<Item = S>>(&mut self, iter: T) {
661        let iter = iter.into_iter();
662        let (min, _) = iter.size_hint();
663
664        self.field_names.reserve(min);
665
666        for field_name in iter {
667            self.upsert_field_name(field_name.as_ref());
668        }
669    }
670}
671
672/// Tracks information needed to correctly finalize a nested builder, for each parent builder type.
673///
674/// A child builder has no effect on its parent unless/until its `finalize` method is called, at
675/// which point the child appends the new value to the parent. As a (desirable) side effect,
676/// creating a parent state instance captures mutable references to a subset of the parent's fields,
677/// rendering the parent object completely unusable until the parent state goes out of scope. This
678/// ensures that at most one child builder can exist at a time.
679///
680/// The redundancy in `value_builder` and `metadata_builder` is because all the references come from
681/// the parent, and we cannot "split" a mutable reference across two objects (parent state and the
682/// child builder that uses it). So everything has to be here. Rust layout optimizations should
683/// treat the variants as a union, so that accessing a `value_builder` or `metadata_builder` is
684/// branch-free.
685#[derive(Debug)]
686pub enum ParentState<'a> {
687    Variant {
688        value_builder: &'a mut ValueBuilder,
689        saved_value_builder_offset: usize,
690        metadata_builder: &'a mut dyn MetadataBuilder,
691        saved_metadata_builder_dict_size: usize,
692        finished: bool,
693    },
694    List {
695        value_builder: &'a mut ValueBuilder,
696        saved_value_builder_offset: usize,
697        metadata_builder: &'a mut dyn MetadataBuilder,
698        saved_metadata_builder_dict_size: usize,
699        offsets: &'a mut Vec<usize>,
700        saved_offsets_size: usize,
701        finished: bool,
702    },
703    Object {
704        value_builder: &'a mut ValueBuilder,
705        saved_value_builder_offset: usize,
706        metadata_builder: &'a mut dyn MetadataBuilder,
707        saved_metadata_builder_dict_size: usize,
708        fields: &'a mut IndexMap<u32, usize>,
709        saved_fields_size: usize,
710        finished: bool,
711    },
712}
713
714impl<'a> ParentState<'a> {
715    /// Creates a new instance suitable for a top-level variant builder
716    /// (e.g. [`VariantBuilder`]). The value and metadata builder state is checkpointed and will
717    /// roll back on drop, unless [`Self::finish`] is called.
718    pub fn variant(
719        value_builder: &'a mut ValueBuilder,
720        metadata_builder: &'a mut dyn MetadataBuilder,
721    ) -> Self {
722        ParentState::Variant {
723            saved_value_builder_offset: value_builder.offset(),
724            saved_metadata_builder_dict_size: metadata_builder.num_field_names(),
725            value_builder,
726            metadata_builder,
727            finished: false,
728        }
729    }
730
731    /// Creates a new instance suitable for a [`ListBuilder`]. The value and metadata builder state
732    /// is checkpointed and will roll back on drop, unless [`Self::finish`] is called. The new
733    /// element's offset is also captured eagerly and will also roll back if not finished.
734    pub fn list(
735        value_builder: &'a mut ValueBuilder,
736        metadata_builder: &'a mut dyn MetadataBuilder,
737        offsets: &'a mut Vec<usize>,
738        saved_parent_value_builder_offset: usize,
739    ) -> Self {
740        // The saved_parent_buffer_offset is the buffer size as of when the parent builder was
741        // constructed. The saved_buffer_offset is the buffer size as of now (when a child builder
742        // is created). The variant field_offset entry for this list element is their difference.
743        let saved_value_builder_offset = value_builder.offset();
744        let saved_offsets_size = offsets.len();
745        offsets.push(saved_value_builder_offset - saved_parent_value_builder_offset);
746
747        ParentState::List {
748            saved_metadata_builder_dict_size: metadata_builder.num_field_names(),
749            saved_value_builder_offset,
750            saved_offsets_size,
751            metadata_builder,
752            value_builder,
753            offsets,
754            finished: false,
755        }
756    }
757
758    /// Creates a new instance suitable for an [`ObjectBuilder`]. The value and metadata builder state
759    /// is checkpointed and will roll back on drop, unless [`Self::finish`] is called. The new
760    /// field's name and offset are also captured eagerly and will also roll back if not finished.
761    ///
762    /// The call fails if the field name is invalid (e.g. because it duplicates an existing field).
763    pub fn try_object(
764        value_builder: &'a mut ValueBuilder,
765        metadata_builder: &'a mut dyn MetadataBuilder,
766        fields: &'a mut IndexMap<u32, usize>,
767        saved_parent_value_builder_offset: usize,
768        field_name: &str,
769        validate_unique_fields: bool,
770    ) -> Result<Self, ArrowError> {
771        // The saved_parent_buffer_offset is the buffer size as of when the parent builder was
772        // constructed. The saved_buffer_offset is the buffer size as of now (when a child builder
773        // is created). The variant field_offset entry for this field is their difference.
774        let saved_value_builder_offset = value_builder.offset();
775        let saved_fields_size = fields.len();
776        let saved_metadata_builder_dict_size = metadata_builder.num_field_names();
777        let field_id = metadata_builder.try_upsert_field_name(field_name)?;
778        let field_start = saved_value_builder_offset - saved_parent_value_builder_offset;
779        if fields.insert(field_id, field_start).is_some() && validate_unique_fields {
780            return Err(ArrowError::InvalidArgumentError(format!(
781                "Duplicate field name: {field_name}"
782            )));
783        }
784
785        Ok(ParentState::Object {
786            saved_metadata_builder_dict_size,
787            saved_value_builder_offset,
788            saved_fields_size,
789            value_builder,
790            metadata_builder,
791            fields,
792            finished: false,
793        })
794    }
795
796    fn value_builder(&mut self) -> &mut ValueBuilder {
797        self.value_and_metadata_builders().0
798    }
799
800    fn metadata_builder(&mut self) -> &mut dyn MetadataBuilder {
801        self.value_and_metadata_builders().1
802    }
803
804    fn saved_value_builder_offset(&mut self) -> usize {
805        match self {
806            ParentState::Variant {
807                saved_value_builder_offset,
808                ..
809            }
810            | ParentState::List {
811                saved_value_builder_offset,
812                ..
813            }
814            | ParentState::Object {
815                saved_value_builder_offset,
816                ..
817            } => *saved_value_builder_offset,
818        }
819    }
820
821    fn is_finished(&mut self) -> &mut bool {
822        match self {
823            ParentState::Variant { finished, .. }
824            | ParentState::List { finished, .. }
825            | ParentState::Object { finished, .. } => finished,
826        }
827    }
828
829    /// Mark the insertion as having succeeded. Internal state will no longer roll back on drop.
830    pub fn finish(&mut self) {
831        *self.is_finished() = true
832    }
833
834    // Performs any parent-specific aspects of rolling back a builder if an insertion failed.
835    fn rollback(&mut self) {
836        if *self.is_finished() {
837            return;
838        }
839
840        // All builders need to revert the buffers
841        match self {
842            ParentState::Variant {
843                value_builder,
844                saved_value_builder_offset,
845                metadata_builder,
846                saved_metadata_builder_dict_size,
847                ..
848            }
849            | ParentState::List {
850                value_builder,
851                saved_value_builder_offset,
852                metadata_builder,
853                saved_metadata_builder_dict_size,
854                ..
855            }
856            | ParentState::Object {
857                value_builder,
858                saved_value_builder_offset,
859                metadata_builder,
860                saved_metadata_builder_dict_size,
861                ..
862            } => {
863                value_builder
864                    .inner_mut()
865                    .truncate(*saved_value_builder_offset);
866                metadata_builder.truncate_field_names(*saved_metadata_builder_dict_size);
867            }
868        };
869
870        // List and Object builders also need to roll back the starting offset they stored.
871        match self {
872            ParentState::Variant { .. } => (),
873            ParentState::List {
874                offsets,
875                saved_offsets_size,
876                ..
877            } => offsets.truncate(*saved_offsets_size),
878            ParentState::Object {
879                fields,
880                saved_fields_size,
881                ..
882            } => fields.truncate(*saved_fields_size),
883        }
884    }
885
886    /// Return mutable references to the value and metadata builders that this
887    /// parent state is using.
888    pub fn value_and_metadata_builders(&mut self) -> (&mut ValueBuilder, &mut dyn MetadataBuilder) {
889        match self {
890            ParentState::Variant {
891                value_builder,
892                metadata_builder,
893                ..
894            }
895            | ParentState::List {
896                value_builder,
897                metadata_builder,
898                ..
899            }
900            | ParentState::Object {
901                value_builder,
902                metadata_builder,
903                ..
904            } => (value_builder, *metadata_builder),
905        }
906    }
907}
908
909/// Automatically rolls back any unfinished `ParentState`.
910impl Drop for ParentState<'_> {
911    fn drop(&mut self) {
912        self.rollback()
913    }
914}
915
916/// Top level builder for [`Variant`] values
917///
918/// # Example: create a Primitive Int8
919/// ```
920/// # use parquet_variant::{Variant, VariantBuilder};
921/// let mut builder = VariantBuilder::new();
922/// builder.append_value(Variant::Int8(42));
923/// // Finish the builder to get the metadata and value
924/// let (metadata, value) = builder.finish();
925/// // use the Variant API to verify the result
926/// let variant = Variant::try_new(&metadata, &value).unwrap();
927/// assert_eq!(variant, Variant::Int8(42));
928/// ```
929///
930/// # Example: Create a [`Variant::Object`]
931///
932/// This example shows how to create an object with two fields:
933/// ```json
934/// {
935///  "first_name": "Jiaying",
936///  "last_name": "Li"
937/// }
938/// ```
939///
940/// ```
941/// # use parquet_variant::{Variant, VariantBuilder};
942/// let mut builder = VariantBuilder::new();
943/// // Create an object builder that will write fields to the object
944/// let mut object_builder = builder.new_object();
945/// object_builder.insert("first_name", "Jiaying");
946/// object_builder.insert("last_name", "Li");
947/// object_builder.finish(); // call finish to finalize the object
948/// // Finish the builder to get the metadata and value
949/// let (metadata, value) = builder.finish();
950/// // use the Variant API to verify the result
951/// let variant = Variant::try_new(&metadata, &value).unwrap();
952/// let variant_object = variant.as_object().unwrap();
953/// assert_eq!(
954///   variant_object.get("first_name"),
955///   Some(Variant::from("Jiaying"))
956/// );
957/// assert_eq!(
958///   variant_object.get("last_name"),
959///   Some(Variant::from("Li"))
960/// );
961/// ```
962///
963///
964/// You can also use the [`ObjectBuilder::with_field`] to add fields to the
965/// object
966/// ```
967/// # use parquet_variant::{Variant, VariantBuilder};
968/// // build the same object as above
969/// let mut builder = VariantBuilder::new();
970/// builder.new_object()
971///   .with_field("first_name", "Jiaying")
972///   .with_field("last_name", "Li")
973///   .finish();
974/// let (metadata, value) = builder.finish();
975/// let variant = Variant::try_new(&metadata, &value).unwrap();
976/// let variant_object = variant.as_object().unwrap();
977/// assert_eq!(
978///   variant_object.get("first_name"),
979///   Some(Variant::from("Jiaying"))
980/// );
981/// assert_eq!(
982///   variant_object.get("last_name"),
983///   Some(Variant::from("Li"))
984/// );
985/// ```
986/// # Example: Create a [`Variant::List`] (an Array)
987///
988/// This example shows how to create an array of integers: `[1, 2, 3]`.
989/// ```
990///  # use parquet_variant::{Variant, VariantBuilder};
991///  let mut builder = VariantBuilder::new();
992///  // Create a builder that will write elements to the list
993///  let mut list_builder = builder.new_list();
994///  list_builder.append_value(1i8);
995///  list_builder.append_value(2i8);
996///  list_builder.append_value(3i8);
997/// // call finish to finalize the list
998///  list_builder.finish();
999/// // Finish the builder to get the metadata and value
1000/// let (metadata, value) = builder.finish();
1001/// // use the Variant API to verify the result
1002/// let variant = Variant::try_new(&metadata, &value).unwrap();
1003/// let variant_list = variant.as_list().unwrap();
1004/// // Verify the list contents
1005/// assert_eq!(variant_list.get(0).unwrap(), Variant::Int8(1));
1006/// assert_eq!(variant_list.get(1).unwrap(), Variant::Int8(2));
1007/// assert_eq!(variant_list.get(2).unwrap(), Variant::Int8(3));
1008/// ```
1009///
1010/// You can also use the [`ListBuilder::with_value`] to append values to the
1011/// list.
1012/// ```
1013///  # use parquet_variant::{Variant, VariantBuilder};
1014///  let mut builder = VariantBuilder::new();
1015///  builder.new_list()
1016///      .with_value(1i8)
1017///      .with_value(2i8)
1018///      .with_value(3i8)
1019///      .finish();
1020/// let (metadata, value) = builder.finish();
1021/// let variant = Variant::try_new(&metadata, &value).unwrap();
1022/// let variant_list = variant.as_list().unwrap();
1023/// assert_eq!(variant_list.get(0).unwrap(), Variant::Int8(1));
1024/// assert_eq!(variant_list.get(1).unwrap(), Variant::Int8(2));
1025/// assert_eq!(variant_list.get(2).unwrap(), Variant::Int8(3));
1026/// ```
1027///
1028/// # Example: [`Variant::List`] of  [`Variant::Object`]s
1029///
1030/// This example shows how to create an list of objects:
1031/// ```json
1032/// [
1033///   {
1034///      "id": 1,
1035///      "type": "Cauliflower"
1036///   },
1037///   {
1038///      "id": 2,
1039///      "type": "Beets"
1040///   }
1041/// ]
1042/// ```
1043/// ```
1044/// use parquet_variant::{Variant, VariantBuilder};
1045/// let mut builder = VariantBuilder::new();
1046///
1047/// // Create a builder that will write elements to the list
1048/// let mut list_builder = builder.new_list();
1049///
1050/// {
1051///     let mut object_builder = list_builder.new_object();
1052///     object_builder.insert("id", 1);
1053///     object_builder.insert("type", "Cauliflower");
1054///     object_builder.finish();
1055/// }
1056///
1057/// {
1058///     let mut object_builder = list_builder.new_object();
1059///     object_builder.insert("id", 2);
1060///     object_builder.insert("type", "Beets");
1061///     object_builder.finish();
1062/// }
1063///
1064/// list_builder.finish();
1065/// // Finish the builder to get the metadata and value
1066/// let (metadata, value) = builder.finish();
1067/// // use the Variant API to verify the result
1068/// let variant = Variant::try_new(&metadata, &value).unwrap();
1069/// let variant_list = variant.as_list().unwrap();
1070///
1071///
1072/// let obj1_variant = variant_list.get(0).unwrap();
1073/// let obj1 = obj1_variant.as_object().unwrap();
1074/// assert_eq!(
1075///     obj1.get("id"),
1076///     Some(Variant::from(1))
1077/// );
1078/// assert_eq!(
1079///     obj1.get("type"),
1080///     Some(Variant::from("Cauliflower"))
1081/// );
1082///
1083/// let obj2_variant = variant_list.get(1).unwrap();
1084/// let obj2 = obj2_variant.as_object().unwrap();
1085///
1086/// assert_eq!(
1087///     obj2.get("id"),
1088///     Some(Variant::from(2))
1089/// );
1090/// assert_eq!(
1091///     obj2.get("type"),
1092///     Some(Variant::from("Beets"))
1093/// );
1094///
1095/// ```
1096/// # Example: Unique Field Validation
1097///
1098/// This example shows how enabling unique field validation will cause an error
1099/// if the same field is inserted more than once.
1100/// ```
1101/// # use parquet_variant::VariantBuilder;
1102/// #
1103/// let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
1104///
1105/// // When validation is enabled, try_with_field will return an error
1106/// let result = builder
1107///     .new_object()
1108///     .with_field("a", 1)
1109///     .try_with_field("a", 2);
1110/// assert!(result.is_err());
1111/// ```
1112///
1113/// # Example: Sorted dictionaries
1114///
1115/// This example shows how to create a [`VariantBuilder`] with a pre-sorted field dictionary
1116/// to improve field access performance when reading [`Variant`] objects.
1117///
1118/// You can use [`VariantBuilder::with_field_names`] to add multiple field names at once:
1119/// ```
1120/// use parquet_variant::{Variant, VariantBuilder};
1121/// let mut builder = VariantBuilder::new()
1122///     .with_field_names(["age", "name", "score"].into_iter());
1123///
1124/// let mut obj = builder.new_object();
1125/// obj.insert("name", "Alice");
1126/// obj.insert("age", 30);
1127/// obj.insert("score", 95.5);
1128/// obj.finish();
1129///
1130/// let (metadata, value) = builder.finish();
1131/// let variant = Variant::try_new(&metadata, &value).unwrap();
1132/// ```
1133///
1134/// Alternatively, you can use [`VariantBuilder::add_field_name`] to add field names one by one:
1135/// ```
1136/// use parquet_variant::{Variant, VariantBuilder};
1137/// let mut builder = VariantBuilder::new();
1138/// builder.add_field_name("age"); // field id = 0
1139/// builder.add_field_name("name"); // field id = 1
1140/// builder.add_field_name("score"); // field id = 2
1141///
1142/// let mut obj = builder.new_object();
1143/// obj.insert("name", "Bob"); // field id = 3
1144/// obj.insert("age", 25);
1145/// obj.insert("score", 88.0);
1146/// obj.finish();
1147///
1148/// let (metadata, value) = builder.finish();
1149/// let variant = Variant::try_new(&metadata, &value).unwrap();
1150/// ```
1151#[derive(Default, Debug)]
1152pub struct VariantBuilder {
1153    value_builder: ValueBuilder,
1154    metadata_builder: WritableMetadataBuilder,
1155    validate_unique_fields: bool,
1156}
1157
1158impl VariantBuilder {
1159    /// Create a new VariantBuilder with new underlying buffers
1160    pub fn new() -> Self {
1161        Self {
1162            value_builder: ValueBuilder::new(),
1163            metadata_builder: WritableMetadataBuilder::default(),
1164            validate_unique_fields: false,
1165        }
1166    }
1167
1168    /// Create a new VariantBuilder with pre-existing [`VariantMetadata`].
1169    pub fn with_metadata(mut self, metadata: VariantMetadata) -> Self {
1170        self.metadata_builder.extend(metadata.iter());
1171
1172        self
1173    }
1174
1175    /// Enables validation of unique field keys in nested objects.
1176    ///
1177    /// This setting is propagated to all [`ObjectBuilder`]s created through this [`VariantBuilder`]
1178    /// (including via any [`ListBuilder`]), and causes [`ObjectBuilder::finish()`] to return
1179    /// an error if duplicate keys were inserted.
1180    pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1181        self.validate_unique_fields = validate_unique_fields;
1182        self
1183    }
1184
1185    /// This method pre-populates the field name directory in the Variant metadata with
1186    /// the specific field names, in order.
1187    ///
1188    /// You can use this to pre-populate a [`VariantBuilder`] with a sorted dictionary if you
1189    /// know the field names beforehand. Sorted dictionaries can accelerate field access when
1190    /// reading [`Variant`]s.
1191    pub fn with_field_names<'a>(mut self, field_names: impl IntoIterator<Item = &'a str>) -> Self {
1192        self.metadata_builder.extend(field_names);
1193
1194        self
1195    }
1196
1197    /// Builder-style API for appending a value to the list and returning self to enable method chaining.
1198    ///
1199    /// # Panics
1200    ///
1201    /// This method will panic if the variant contains duplicate field names in objects
1202    /// when validation is enabled. For a fallible version, use [`ListBuilder::try_with_value`].
1203    pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
1204        self.append_value(value);
1205        self
1206    }
1207
1208    /// Builder-style API for appending a value to the list and returns self for method chaining.
1209    ///
1210    /// This is the fallible version of [`ListBuilder::with_value`].
1211    pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1212        mut self,
1213        value: T,
1214    ) -> Result<Self, ArrowError> {
1215        self.try_append_value(value)?;
1216        Ok(self)
1217    }
1218
1219    /// This method reserves capacity for field names in the Variant metadata,
1220    /// which can improve performance when you know the approximate number of unique field
1221    /// names that will be used across all objects in the [`Variant`].
1222    pub fn reserve(&mut self, capacity: usize) {
1223        self.metadata_builder.field_names.reserve(capacity);
1224    }
1225
1226    /// Adds a single field name to the field name directory in the Variant metadata.
1227    ///
1228    /// This method does the same thing as [`VariantBuilder::with_field_names`] but adds one field name at a time.
1229    pub fn add_field_name(&mut self, field_name: &str) {
1230        self.metadata_builder.upsert_field_name(field_name);
1231    }
1232
1233    /// Create an [`ListBuilder`] for creating [`Variant::List`] values.
1234    ///
1235    /// See the examples on [`VariantBuilder`] for usage.
1236    pub fn new_list(&mut self) -> ListBuilder<'_> {
1237        let parent_state =
1238            ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1239        ListBuilder::new(parent_state, self.validate_unique_fields)
1240    }
1241
1242    /// Create an [`ObjectBuilder`] for creating [`Variant::Object`] values.
1243    ///
1244    /// See the examples on [`VariantBuilder`] for usage.
1245    pub fn new_object(&mut self) -> ObjectBuilder<'_> {
1246        let parent_state =
1247            ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1248        ObjectBuilder::new(parent_state, self.validate_unique_fields)
1249    }
1250
1251    /// Append a value to the builder.
1252    ///
1253    /// # Panics
1254    ///
1255    /// This method will panic if the variant contains duplicate field names in objects
1256    /// when validation is enabled. For a fallible version, use [`VariantBuilder::try_append_value`]
1257    ///
1258    /// # Example
1259    /// ```
1260    /// # use parquet_variant::{Variant, VariantBuilder};
1261    /// let mut builder = VariantBuilder::new();
1262    /// // most primitive types can be appended directly as they implement `Into<Variant>`
1263    /// builder.append_value(42i8);
1264    /// ```
1265    pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1266        let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1267        ValueBuilder::append_variant(state, value.into())
1268    }
1269
1270    /// Append a value to the builder.
1271    pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1272        &mut self,
1273        value: T,
1274    ) -> Result<(), ArrowError> {
1275        let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1276        ValueBuilder::try_append_variant(state, value.into())
1277    }
1278
1279    /// Appends a variant value to the builder by copying raw bytes when possible.
1280    ///
1281    /// For objects and lists, this directly copies their underlying byte representation instead of
1282    /// performing a logical copy and without touching the metadata builder. For other variant
1283    /// types, this falls back to the standard append behavior.
1284    ///
1285    /// The caller must ensure that the metadata dictionary entries are already built and correct for
1286    /// any objects or lists being appended.
1287    pub fn append_value_bytes<'m, 'd>(&mut self, value: impl Into<Variant<'m, 'd>>) {
1288        let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1289        ValueBuilder::append_variant_bytes(state, value.into());
1290    }
1291
1292    /// Finish the builder and return the metadata and value buffers.
1293    pub fn finish(mut self) -> (Vec<u8>, Vec<u8>) {
1294        self.metadata_builder.finish();
1295        (
1296            self.metadata_builder.into_inner(),
1297            self.value_builder.into_inner(),
1298        )
1299    }
1300}
1301
1302/// A builder for creating [`Variant::List`] values.
1303///
1304/// See the examples on [`VariantBuilder`] for usage.
1305#[derive(Debug)]
1306pub struct ListBuilder<'a> {
1307    parent_state: ParentState<'a>,
1308    offsets: Vec<usize>,
1309    validate_unique_fields: bool,
1310}
1311
1312impl<'a> ListBuilder<'a> {
1313    /// Creates a new list builder, nested on top of the given parent state.
1314    pub fn new(parent_state: ParentState<'a>, validate_unique_fields: bool) -> Self {
1315        Self {
1316            parent_state,
1317            offsets: vec![],
1318            validate_unique_fields,
1319        }
1320    }
1321
1322    /// Enables unique field key validation for objects created within this list.
1323    ///
1324    /// Propagates the validation flag to any [`ObjectBuilder`]s created using
1325    /// [`ListBuilder::new_object`].
1326    pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1327        self.validate_unique_fields = validate_unique_fields;
1328        self
1329    }
1330
1331    // Returns validate_unique_fields because we can no longer reference self once this method returns.
1332    fn parent_state(&mut self) -> (ParentState<'_>, bool) {
1333        let saved_parent_value_builder_offset = self.parent_state.saved_value_builder_offset();
1334        let (value_builder, metadata_builder) = self.parent_state.value_and_metadata_builders();
1335        let state = ParentState::list(
1336            value_builder,
1337            metadata_builder,
1338            &mut self.offsets,
1339            saved_parent_value_builder_offset,
1340        );
1341        (state, self.validate_unique_fields)
1342    }
1343
1344    /// Returns an object builder that can be used to append a new (nested) object to this list.
1345    ///
1346    /// WARNING: The builder will have no effect unless/until [`ObjectBuilder::finish`] is called.
1347    pub fn new_object(&mut self) -> ObjectBuilder<'_> {
1348        let (parent_state, validate_unique_fields) = self.parent_state();
1349        ObjectBuilder::new(parent_state, validate_unique_fields)
1350    }
1351
1352    /// Returns a list builder that can be used to append a new (nested) list to this list.
1353    ///
1354    /// WARNING: The builder will have no effect unless/until [`ListBuilder::finish`] is called.
1355    pub fn new_list(&mut self) -> ListBuilder<'_> {
1356        let (parent_state, validate_unique_fields) = self.parent_state();
1357        ListBuilder::new(parent_state, validate_unique_fields)
1358    }
1359
1360    /// Appends a variant to the list.
1361    ///
1362    /// # Panics
1363    ///
1364    /// This method will panic if the variant contains duplicate field names in objects
1365    /// when validation is enabled. For a fallible version, use [`ListBuilder::try_append_value`].
1366    pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1367        let (state, _) = self.parent_state();
1368        ValueBuilder::append_variant(state, value.into())
1369    }
1370
1371    /// Appends a new primitive value to this list
1372    pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1373        &mut self,
1374        value: T,
1375    ) -> Result<(), ArrowError> {
1376        let (state, _) = self.parent_state();
1377        ValueBuilder::try_append_variant(state, value.into())
1378    }
1379
1380    /// Appends a variant value to this list by copying raw bytes when possible.
1381    ///
1382    /// For objects and lists, this directly copies their underlying byte representation instead of
1383    /// performing a logical copy. For other variant types, this falls back to the standard append
1384    /// behavior.
1385    ///
1386    /// The caller must ensure that the metadata dictionary is already built and correct for
1387    /// any objects or lists being appended.
1388    pub fn append_value_bytes<'m, 'd>(&mut self, value: impl Into<Variant<'m, 'd>>) {
1389        let (state, _) = self.parent_state();
1390        ValueBuilder::append_variant_bytes(state, value.into())
1391    }
1392
1393    /// Builder-style API for appending a value to the list and returning self to enable method chaining.
1394    ///
1395    /// # Panics
1396    ///
1397    /// This method will panic if the variant contains duplicate field names in objects
1398    /// when validation is enabled. For a fallible version, use [`ListBuilder::try_with_value`].
1399    pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
1400        self.append_value(value);
1401        self
1402    }
1403
1404    /// Builder-style API for appending a value to the list and returns self for method chaining.
1405    ///
1406    /// This is the fallible version of [`ListBuilder::with_value`].
1407    pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1408        mut self,
1409        value: T,
1410    ) -> Result<Self, ArrowError> {
1411        self.try_append_value(value)?;
1412        Ok(self)
1413    }
1414
1415    /// Finalizes this list and appends it to its parent, which otherwise remains unmodified.
1416    pub fn finish(mut self) {
1417        let starting_offset = self.parent_state.saved_value_builder_offset();
1418        let value_builder = self.parent_state.value_builder();
1419
1420        let data_size = value_builder
1421            .offset()
1422            .checked_sub(starting_offset)
1423            .expect("Data size overflowed usize");
1424
1425        let num_elements = self.offsets.len();
1426        let is_large = num_elements > u8::MAX as usize;
1427        let offset_size = int_size(data_size);
1428
1429        let num_elements_size = if is_large { 4 } else { 1 }; // is_large: 4 bytes, else 1 byte.
1430        let num_elements = self.offsets.len();
1431        let header_size = 1 +      // header (i.e., `array_header`)
1432            num_elements_size +  // num_element_size
1433            (num_elements + 1) * offset_size as usize; // offsets and data size
1434
1435        // Calculated header size becomes a hint; being wrong only risks extra allocations.
1436        // Make sure to reserve enough capacity to handle the extra bytes we'll truncate.
1437        let mut bytes_to_splice = Vec::with_capacity(header_size + 3);
1438        // Write header
1439        let header = array_header(is_large, offset_size);
1440        bytes_to_splice.push(header);
1441
1442        append_packed_u32(&mut bytes_to_splice, num_elements as u32, num_elements_size);
1443
1444        for offset in &self.offsets {
1445            append_packed_u32(&mut bytes_to_splice, *offset as u32, offset_size as usize);
1446        }
1447
1448        append_packed_u32(&mut bytes_to_splice, data_size as u32, offset_size as usize);
1449
1450        value_builder
1451            .inner_mut()
1452            .splice(starting_offset..starting_offset, bytes_to_splice);
1453
1454        self.parent_state.finish();
1455    }
1456}
1457
1458/// A builder for creating [`Variant::Object`] values.
1459///
1460/// See the examples on [`VariantBuilder`] for usage.
1461#[derive(Debug)]
1462pub struct ObjectBuilder<'a> {
1463    parent_state: ParentState<'a>,
1464    fields: IndexMap<u32, usize>, // (field_id, offset)
1465    validate_unique_fields: bool,
1466}
1467
1468impl<'a> ObjectBuilder<'a> {
1469    /// Creates a new object builder, nested on top of the given parent state.
1470    pub fn new(parent_state: ParentState<'a>, validate_unique_fields: bool) -> Self {
1471        Self {
1472            parent_state,
1473            fields: IndexMap::new(),
1474            validate_unique_fields,
1475        }
1476    }
1477
1478    /// Add a field with key and value to the object
1479    ///
1480    /// # See Also
1481    /// - [`ObjectBuilder::try_insert`] for a fallible version.
1482    /// - [`ObjectBuilder::with_field`] for a builder-style API.
1483    ///
1484    /// # Panics
1485    ///
1486    /// This method will panic if the variant contains duplicate field names in objects
1487    /// when validation is enabled. For a fallible version, use [`ObjectBuilder::try_insert`]
1488    pub fn insert<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, key: &str, value: T) {
1489        let (state, _) = self.parent_state(key).unwrap();
1490        ValueBuilder::append_variant(state, value.into())
1491    }
1492
1493    /// Add a field with key and value to the object
1494    ///
1495    /// # See Also
1496    /// - [`ObjectBuilder::insert`] for an infallible version that panics
1497    /// - [`ObjectBuilder::try_with_field`] for a builder-style API.
1498    ///
1499    /// # Note
1500    /// Attempting to insert a duplicate field name produces an error if unique field
1501    /// validation is enabled. Otherwise, the new value overwrites the previous field mapping
1502    /// without erasing the old value, resulting in a larger variant
1503    pub fn try_insert<'m, 'd, T: Into<Variant<'m, 'd>>>(
1504        &mut self,
1505        key: &str,
1506        value: T,
1507    ) -> Result<(), ArrowError> {
1508        let (state, _) = self.parent_state(key)?;
1509        ValueBuilder::try_append_variant(state, value.into())
1510    }
1511
1512    /// Add a field with key and value to the object by copying raw bytes when possible.
1513    ///
1514    /// For objects and lists, this directly copies their underlying byte representation instead of
1515    /// performing a logical copy, and without touching the metadata builder. For other variant
1516    /// types, this falls back to the standard append behavior.
1517    ///
1518    /// The caller must ensure that the metadata dictionary is already built and correct for
1519    /// any objects or lists being appended, but the value's new field name is handled normally.
1520    ///
1521    /// # Panics
1522    ///
1523    /// This method will panic if the variant contains duplicate field names in objects
1524    /// when validation is enabled. For a fallible version, use [`ObjectBuilder::try_insert_bytes`]
1525    pub fn insert_bytes<'m, 'd>(&mut self, key: &str, value: impl Into<Variant<'m, 'd>>) {
1526        self.try_insert_bytes(key, value).unwrap()
1527    }
1528
1529    /// Add a field with key and value to the object by copying raw bytes when possible.
1530    ///
1531    /// For objects and lists, this directly copies their underlying byte representation instead of
1532    /// performing a logical copy, and without touching the metadata builder. For other variant
1533    /// types, this falls back to the standard append behavior.
1534    ///
1535    /// The caller must ensure that the metadata dictionary is already built and correct for
1536    /// any objects or lists being appended, but the value's new field name is handled normally.
1537    ///
1538    /// # Note
1539    /// When inserting duplicate keys, the new value overwrites the previous mapping,
1540    /// but the old value remains in the buffer, resulting in a larger variant
1541    pub fn try_insert_bytes<'m, 'd>(
1542        &mut self,
1543        key: &str,
1544        value: impl Into<Variant<'m, 'd>>,
1545    ) -> Result<(), ArrowError> {
1546        let (state, _) = self.parent_state(key)?;
1547        ValueBuilder::append_variant_bytes(state, value.into());
1548        Ok(())
1549    }
1550
1551    /// Builder style API for adding a field with key and value to the object
1552    ///
1553    /// Same as [`ObjectBuilder::insert`], but returns `self` for chaining.
1554    pub fn with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, key: &str, value: T) -> Self {
1555        self.insert(key, value);
1556        self
1557    }
1558
1559    /// Builder style API for adding a field with key and value to the object
1560    ///
1561    /// Same as [`ObjectBuilder::try_insert`], but returns `self` for chaining.
1562    pub fn try_with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(
1563        mut self,
1564        key: &str,
1565        value: T,
1566    ) -> Result<Self, ArrowError> {
1567        self.try_insert(key, value)?;
1568        Ok(self)
1569    }
1570
1571    /// Enables validation for unique field keys when inserting into this object.
1572    ///
1573    /// When this is enabled, calling [`ObjectBuilder::finish`] will return an error
1574    /// if any duplicate field keys were added using [`ObjectBuilder::insert`].
1575    pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1576        self.validate_unique_fields = validate_unique_fields;
1577        self
1578    }
1579
1580    // Returns validate_unique_fields because we can no longer reference self once this method returns.
1581    fn parent_state<'b>(
1582        &'b mut self,
1583        field_name: &'b str,
1584    ) -> Result<(ParentState<'b>, bool), ArrowError> {
1585        let saved_parent_value_builder_offset = self.parent_state.saved_value_builder_offset();
1586        let validate_unique_fields = self.validate_unique_fields;
1587        let (value_builder, metadata_builder) = self.parent_state.value_and_metadata_builders();
1588        let state = ParentState::try_object(
1589            value_builder,
1590            metadata_builder,
1591            &mut self.fields,
1592            saved_parent_value_builder_offset,
1593            field_name,
1594            validate_unique_fields,
1595        )?;
1596        Ok((state, validate_unique_fields))
1597    }
1598
1599    /// Returns an object builder that can be used to append a new (nested) object to this object.
1600    ///
1601    /// Panics if the proposed key was a duplicate
1602    ///
1603    /// WARNING: The builder will have no effect unless/until [`ObjectBuilder::finish`] is called.
1604    pub fn new_object<'b>(&'b mut self, key: &'b str) -> ObjectBuilder<'b> {
1605        self.try_new_object(key).unwrap()
1606    }
1607
1608    /// Returns an object builder that can be used to append a new (nested) object to this object.
1609    ///
1610    /// Fails if the proposed key was a duplicate
1611    ///
1612    /// WARNING: The builder will have no effect unless/until [`ObjectBuilder::finish`] is called.
1613    pub fn try_new_object<'b>(&'b mut self, key: &'b str) -> Result<ObjectBuilder<'b>, ArrowError> {
1614        let (parent_state, validate_unique_fields) = self.parent_state(key)?;
1615        Ok(ObjectBuilder::new(parent_state, validate_unique_fields))
1616    }
1617
1618    /// Returns a list builder that can be used to append a new (nested) list to this object.
1619    ///
1620    /// Panics if the proposed key was a duplicate
1621    ///
1622    /// WARNING: The builder will have no effect unless/until [`ListBuilder::finish`] is called.
1623    pub fn new_list<'b>(&'b mut self, key: &'b str) -> ListBuilder<'b> {
1624        self.try_new_list(key).unwrap()
1625    }
1626
1627    /// Returns a list builder that can be used to append a new (nested) list to this object.
1628    ///
1629    /// Fails if the proposed key was a duplicate
1630    ///
1631    /// WARNING: The builder will have no effect unless/until [`ListBuilder::finish`] is called.
1632    pub fn try_new_list<'b>(&'b mut self, key: &'b str) -> Result<ListBuilder<'b>, ArrowError> {
1633        let (parent_state, validate_unique_fields) = self.parent_state(key)?;
1634        Ok(ListBuilder::new(parent_state, validate_unique_fields))
1635    }
1636
1637    /// Finalizes this object and appends it to its parent, which otherwise remains unmodified.
1638    pub fn finish(mut self) {
1639        let metadata_builder = self.parent_state.metadata_builder();
1640
1641        self.fields.sort_by(|&field_a_id, _, &field_b_id, _| {
1642            let field_a_name = metadata_builder.field_name(field_a_id as usize);
1643            let field_b_name = metadata_builder.field_name(field_b_id as usize);
1644            field_a_name.cmp(field_b_name)
1645        });
1646
1647        let max_id = self.fields.iter().map(|(i, _)| *i).max().unwrap_or(0);
1648        let id_size = int_size(max_id as usize);
1649
1650        let starting_offset = self.parent_state.saved_value_builder_offset();
1651        let value_builder = self.parent_state.value_builder();
1652        let current_offset = value_builder.offset();
1653        // Current object starts from `object_start_offset`
1654        let data_size = current_offset - starting_offset;
1655        let offset_size = int_size(data_size);
1656
1657        let num_fields = self.fields.len();
1658        let is_large = num_fields > u8::MAX as usize;
1659
1660        let header_size = 1 + // header byte
1661            (if is_large { 4 } else { 1 }) + // num_fields
1662            (num_fields * id_size as usize) + // field IDs
1663            ((num_fields + 1) * offset_size as usize); // field offsets + data_size
1664
1665        // Shift existing data to make room for the header
1666        value_builder.inner_mut().splice(
1667            starting_offset..starting_offset,
1668            std::iter::repeat_n(0u8, header_size),
1669        );
1670
1671        // Write header at the original start position
1672        let mut header_pos = starting_offset;
1673
1674        // Write header byte
1675        let header = object_header(is_large, id_size, offset_size);
1676
1677        header_pos = self
1678            .parent_state
1679            .value_builder()
1680            .append_header_start_from_buf_pos(header_pos, header, is_large, num_fields);
1681
1682        header_pos = self
1683            .parent_state
1684            .value_builder()
1685            .append_offset_array_start_from_buf_pos(
1686                header_pos,
1687                self.fields.keys().copied().map(|id| id as usize),
1688                None,
1689                id_size,
1690            );
1691
1692        self.parent_state
1693            .value_builder()
1694            .append_offset_array_start_from_buf_pos(
1695                header_pos,
1696                self.fields.values().copied(),
1697                Some(data_size),
1698                offset_size,
1699            );
1700        self.parent_state.finish();
1701    }
1702}
1703
1704/// Extends [`VariantBuilder`] to help building nested [`Variant`]s
1705///
1706/// Allows users to append values to a [`VariantBuilder`], [`ListBuilder`] or
1707/// [`ObjectBuilder`]. using the same interface.
1708pub trait VariantBuilderExt {
1709    /// Appends a new variant value to this builder. See e.g. [`VariantBuilder::append_value`].
1710    fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>);
1711
1712    /// Creates a nested list builder. See e.g. [`VariantBuilder::new_list`]. Panics if the nested
1713    /// builder cannot be created, see e.g. [`ObjectBuilder::new_list`].
1714    fn new_list(&mut self) -> ListBuilder<'_> {
1715        self.try_new_list().unwrap()
1716    }
1717
1718    /// Creates a nested object builder. See e.g. [`VariantBuilder::new_object`]. Panics if the
1719    /// nested builder cannot be created, see e.g. [`ObjectBuilder::new_object`].
1720    fn new_object(&mut self) -> ObjectBuilder<'_> {
1721        self.try_new_object().unwrap()
1722    }
1723
1724    /// Creates a nested list builder. See e.g. [`VariantBuilder::new_list`]. Returns an error if
1725    /// the nested builder cannot be created, see e.g. [`ObjectBuilder::try_new_list`].
1726    fn try_new_list(&mut self) -> Result<ListBuilder<'_>, ArrowError>;
1727
1728    /// Creates a nested object builder. See e.g. [`VariantBuilder::new_object`]. Returns an error
1729    /// if the nested builder cannot be created, see e.g. [`ObjectBuilder::try_new_object`].
1730    fn try_new_object(&mut self) -> Result<ObjectBuilder<'_>, ArrowError>;
1731}
1732
1733impl VariantBuilderExt for ListBuilder<'_> {
1734    fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1735        self.append_value(value);
1736    }
1737
1738    fn try_new_list(&mut self) -> Result<ListBuilder<'_>, ArrowError> {
1739        Ok(self.new_list())
1740    }
1741
1742    fn try_new_object(&mut self) -> Result<ObjectBuilder<'_>, ArrowError> {
1743        Ok(self.new_object())
1744    }
1745}
1746
1747impl VariantBuilderExt for VariantBuilder {
1748    fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1749        self.append_value(value);
1750    }
1751
1752    fn try_new_list(&mut self) -> Result<ListBuilder<'_>, ArrowError> {
1753        Ok(self.new_list())
1754    }
1755
1756    fn try_new_object(&mut self) -> Result<ObjectBuilder<'_>, ArrowError> {
1757        Ok(self.new_object())
1758    }
1759}
1760
1761#[cfg(test)]
1762mod tests {
1763    use crate::VariantMetadata;
1764
1765    use super::*;
1766
1767    #[test]
1768    fn test_simple_usage() {
1769        {
1770            let mut builder = VariantBuilder::new();
1771            builder.append_value(());
1772            let (metadata, value) = builder.finish();
1773            let variant = Variant::try_new(&metadata, &value).unwrap();
1774            assert_eq!(variant, Variant::Null);
1775        }
1776
1777        {
1778            let mut builder = VariantBuilder::new();
1779            builder.append_value(true);
1780            let (metadata, value) = builder.finish();
1781            let variant = Variant::try_new(&metadata, &value).unwrap();
1782            assert_eq!(variant, Variant::BooleanTrue);
1783        }
1784
1785        {
1786            let mut builder = VariantBuilder::new();
1787            builder.append_value(false);
1788            let (metadata, value) = builder.finish();
1789            let variant = Variant::try_new(&metadata, &value).unwrap();
1790            assert_eq!(variant, Variant::BooleanFalse);
1791        }
1792
1793        {
1794            let mut builder = VariantBuilder::new();
1795            builder.append_value(42i8);
1796            let (metadata, value) = builder.finish();
1797            let variant = Variant::try_new(&metadata, &value).unwrap();
1798            assert_eq!(variant, Variant::Int8(42));
1799        }
1800
1801        {
1802            let mut builder = VariantBuilder::new();
1803            builder.append_value(1234i16);
1804            let (metadata, value) = builder.finish();
1805            let variant = Variant::try_new(&metadata, &value).unwrap();
1806            assert_eq!(variant, Variant::Int16(1234));
1807        }
1808
1809        {
1810            let mut builder = VariantBuilder::new();
1811            builder.append_value(123456i32);
1812            let (metadata, value) = builder.finish();
1813            let variant = Variant::try_new(&metadata, &value).unwrap();
1814            assert_eq!(variant, Variant::Int32(123456));
1815        }
1816
1817        {
1818            let mut builder = VariantBuilder::new();
1819            builder.append_value(123456789i64);
1820            let (metadata, value) = builder.finish();
1821            let variant = Variant::try_new(&metadata, &value).unwrap();
1822            assert_eq!(variant, Variant::Int64(123456789));
1823        }
1824
1825        {
1826            let mut builder = VariantBuilder::new();
1827            builder.append_value(1.5f32);
1828            let (metadata, value) = builder.finish();
1829            let variant = Variant::try_new(&metadata, &value).unwrap();
1830            assert_eq!(variant, Variant::Float(1.5));
1831        }
1832
1833        {
1834            let mut builder = VariantBuilder::new();
1835            builder.append_value(2.5f64);
1836            let (metadata, value) = builder.finish();
1837            let variant = Variant::try_new(&metadata, &value).unwrap();
1838            assert_eq!(variant, Variant::Double(2.5));
1839        }
1840
1841        {
1842            let mut builder = VariantBuilder::new();
1843            builder.append_value("hello");
1844            let (metadata, value) = builder.finish();
1845            let variant = Variant::try_new(&metadata, &value).unwrap();
1846            assert_eq!(variant, Variant::ShortString(ShortString("hello")));
1847        }
1848
1849        {
1850            let mut builder = VariantBuilder::new();
1851            let long_string = "This is a very long string that exceeds the short string limit of 63 bytes and should be encoded as a regular string type instead of a short string";
1852            builder.append_value(long_string);
1853            let (metadata, value) = builder.finish();
1854            let variant = Variant::try_new(&metadata, &value).unwrap();
1855            assert_eq!(variant, Variant::String(long_string));
1856        }
1857
1858        {
1859            let mut builder = VariantBuilder::new();
1860            let binary_data = b"binary data";
1861            builder.append_value(binary_data.as_slice());
1862            let (metadata, value) = builder.finish();
1863            let variant = Variant::try_new(&metadata, &value).unwrap();
1864            assert_eq!(variant, Variant::Binary(binary_data.as_slice()));
1865        }
1866    }
1867
1868    #[test]
1869    fn test_list() {
1870        let mut builder = VariantBuilder::new();
1871
1872        builder
1873            .new_list()
1874            .with_value(1i8)
1875            .with_value(2i8)
1876            .with_value("test")
1877            .finish();
1878
1879        let (metadata, value) = builder.finish();
1880        assert!(!metadata.is_empty());
1881        assert!(!value.is_empty());
1882
1883        let variant = Variant::try_new(&metadata, &value).unwrap();
1884
1885        match variant {
1886            Variant::List(list) => {
1887                let val0 = list.get(0).unwrap();
1888                assert_eq!(val0, Variant::Int8(1));
1889
1890                let val1 = list.get(1).unwrap();
1891                assert_eq!(val1, Variant::Int8(2));
1892
1893                let val2 = list.get(2).unwrap();
1894                assert_eq!(val2, Variant::ShortString(ShortString("test")));
1895            }
1896            _ => panic!("Expected an array variant, got: {variant:?}"),
1897        }
1898    }
1899
1900    #[test]
1901    fn test_object() {
1902        let mut builder = VariantBuilder::new();
1903
1904        builder
1905            .new_object()
1906            .with_field("name", "John")
1907            .with_field("age", 42i8)
1908            .finish();
1909
1910        let (metadata, value) = builder.finish();
1911        assert!(!metadata.is_empty());
1912        assert!(!value.is_empty());
1913    }
1914
1915    #[test]
1916    fn test_object_field_ordering() {
1917        let mut builder = VariantBuilder::new();
1918
1919        builder
1920            .new_object()
1921            .with_field("zebra", "stripes")
1922            .with_field("apple", "red")
1923            .with_field("banana", "yellow")
1924            .finish();
1925
1926        let (_, value) = builder.finish();
1927
1928        let header = value[0];
1929        assert_eq!(header & 0x03, VariantBasicType::Object as u8);
1930
1931        let field_count = value[1] as usize;
1932        assert_eq!(field_count, 3);
1933
1934        // Get field IDs from the object header
1935        let field_ids: Vec<u8> = value[2..5].to_vec();
1936
1937        // apple(1), banana(2), zebra(0)
1938        assert_eq!(field_ids, vec![1, 2, 0]);
1939    }
1940
1941    #[test]
1942    fn test_duplicate_fields_in_object() {
1943        let mut builder = VariantBuilder::new();
1944        builder
1945            .new_object()
1946            .with_field("name", "Ron Artest")
1947            .with_field("name", "Metta World Peace") // Duplicate field
1948            .finish();
1949
1950        let (metadata, value) = builder.finish();
1951        let variant = Variant::try_new(&metadata, &value).unwrap();
1952
1953        let obj = variant.as_object().unwrap();
1954        assert_eq!(obj.len(), 1);
1955        assert_eq!(obj.field(0).unwrap(), Variant::from("Metta World Peace"));
1956
1957        assert_eq!(
1958            vec![("name", Variant::from("Metta World Peace"))],
1959            obj.iter().collect::<Vec<_>>()
1960        );
1961    }
1962
1963    #[test]
1964    fn test_nested_list() {
1965        let mut builder = VariantBuilder::new();
1966
1967        let mut outer_list_builder = builder.new_list();
1968
1969        // create inner list
1970        outer_list_builder
1971            .new_list()
1972            .with_value("a")
1973            .with_value("b")
1974            .with_value("c")
1975            .with_value("d")
1976            .finish();
1977
1978        outer_list_builder.finish();
1979
1980        let (metadata, value) = builder.finish();
1981
1982        let variant = Variant::try_new(&metadata, &value).unwrap();
1983        let outer_list = variant.as_list().unwrap();
1984
1985        assert_eq!(outer_list.len(), 1);
1986
1987        let inner_variant = outer_list.get(0).unwrap();
1988        let inner_list = inner_variant.as_list().unwrap();
1989
1990        assert_eq!(
1991            vec![
1992                Variant::from("a"),
1993                Variant::from("b"),
1994                Variant::from("c"),
1995                Variant::from("d"),
1996            ],
1997            inner_list.iter().collect::<Vec<_>>()
1998        );
1999    }
2000
2001    #[test]
2002    fn test_super_nested_list() {
2003        /*
2004        [[[[[1]]]]]
2005        */
2006
2007        let mut builder = VariantBuilder::new();
2008        {
2009            let mut list_builder1 = builder.new_list();
2010            {
2011                let mut list_builder2 = list_builder1.new_list();
2012                {
2013                    let mut list_builder3 = list_builder2.new_list();
2014                    {
2015                        let mut list_builder4 = list_builder3.new_list();
2016                        {
2017                            let mut list_builder5 = list_builder4.new_list();
2018                            list_builder5.append_value(1);
2019                            list_builder5.finish();
2020                        }
2021                        list_builder4.finish();
2022                    }
2023                    list_builder3.finish();
2024                }
2025                list_builder2.finish();
2026            }
2027            list_builder1.finish();
2028        }
2029
2030        let (metadata, value) = builder.finish();
2031
2032        let variant = Variant::try_new(&metadata, &value).unwrap();
2033        let list1 = variant.as_list().unwrap();
2034        assert_eq!(list1.len(), 1);
2035
2036        let list2_variant = list1.get(0).unwrap();
2037        let list2 = list2_variant.as_list().unwrap();
2038        assert_eq!(list2.len(), 1);
2039
2040        let list3_variant = list2.get(0).unwrap();
2041        let list3 = list3_variant.as_list().unwrap();
2042        assert_eq!(list3.len(), 1);
2043
2044        let list4_variant = list3.get(0).unwrap();
2045        let list4 = list4_variant.as_list().unwrap();
2046        assert_eq!(list4.len(), 1);
2047
2048        let list5_variant = list4.get(0).unwrap();
2049        let list5 = list5_variant.as_list().unwrap();
2050        assert_eq!(list5.len(), 1);
2051
2052        assert_eq!(list5.len(), 1);
2053
2054        assert_eq!(list5.get(0).unwrap(), Variant::from(1));
2055    }
2056
2057    #[test]
2058    fn test_object_list() {
2059        let mut builder = VariantBuilder::new();
2060
2061        let mut list_builder = builder.new_list();
2062
2063        list_builder
2064            .new_object()
2065            .with_field("id", 1)
2066            .with_field("type", "Cauliflower")
2067            .finish();
2068
2069        list_builder
2070            .new_object()
2071            .with_field("id", 2)
2072            .with_field("type", "Beets")
2073            .finish();
2074
2075        list_builder.finish();
2076
2077        let (metadata, value) = builder.finish();
2078
2079        let variant = Variant::try_new(&metadata, &value).unwrap();
2080        let list = variant.as_list().unwrap();
2081
2082        assert_eq!(list.len(), 2);
2083
2084        let obj1_variant = list.get(0).unwrap();
2085        let obj1 = obj1_variant.as_object().unwrap();
2086
2087        assert_eq!(
2088            vec![
2089                ("id", Variant::from(1)),
2090                ("type", Variant::from("Cauliflower")),
2091            ],
2092            obj1.iter().collect::<Vec<_>>()
2093        );
2094
2095        let obj2_variant = list.get(1).unwrap();
2096        let obj2 = obj2_variant.as_object().unwrap();
2097
2098        assert_eq!(
2099            vec![("id", Variant::from(2)), ("type", Variant::from("Beets")),],
2100            obj2.iter().collect::<Vec<_>>()
2101        );
2102    }
2103
2104    #[test]
2105    fn test_object_list2() {
2106        let mut builder = VariantBuilder::new();
2107
2108        let mut list_builder = builder.new_list();
2109
2110        list_builder.new_object().with_field("a", 1).finish();
2111
2112        list_builder.new_object().with_field("b", 2).finish();
2113
2114        list_builder.finish();
2115
2116        let (metadata, value) = builder.finish();
2117
2118        let variant = Variant::try_new(&metadata, &value).unwrap();
2119        let list = variant.as_list().unwrap();
2120        assert_eq!(list.len(), 2);
2121
2122        let obj1_variant = list.get(0).unwrap();
2123        let obj1 = obj1_variant.as_object().unwrap();
2124        assert_eq!(
2125            vec![("a", Variant::from(1)),],
2126            obj1.iter().collect::<Vec<_>>()
2127        );
2128
2129        let obj2_variant = list.get(1).unwrap();
2130        let obj2 = obj2_variant.as_object().unwrap();
2131        assert_eq!(
2132            vec![("b", Variant::from(2)),],
2133            obj2.iter().collect::<Vec<_>>()
2134        );
2135    }
2136
2137    #[test]
2138    fn test_hetergenous_list() {
2139        /*
2140        [
2141            1,
2142            { "a": 1 },
2143            2,
2144            { "b": 2},
2145            3
2146        ]
2147        */
2148
2149        let mut builder = VariantBuilder::new();
2150
2151        let mut list_builder = builder.new_list();
2152
2153        list_builder.append_value(1);
2154
2155        {
2156            let mut object_builder = list_builder.new_object();
2157            object_builder.insert("a", 1);
2158            object_builder.finish();
2159        }
2160
2161        list_builder.append_value(2);
2162
2163        {
2164            let mut object_builder = list_builder.new_object();
2165            object_builder.insert("b", 2);
2166            object_builder.finish();
2167        }
2168
2169        list_builder.append_value(3);
2170
2171        list_builder.finish();
2172
2173        let (metadata, value) = builder.finish();
2174
2175        let variant = Variant::try_new(&metadata, &value).unwrap();
2176        let list = variant.as_list().unwrap();
2177        assert_eq!(list.len(), 5);
2178        assert_eq!(list.get(0).unwrap(), Variant::from(1));
2179
2180        let obj1_variant = list.get(1).unwrap();
2181        let obj1 = obj1_variant.as_object().unwrap();
2182        assert_eq!(
2183            vec![("a", Variant::from(1)),],
2184            obj1.iter().collect::<Vec<_>>()
2185        );
2186
2187        assert_eq!(list.get(2).unwrap(), Variant::from(2));
2188
2189        let obj2_variant = list.get(3).unwrap();
2190        let obj2 = obj2_variant.as_object().unwrap();
2191        assert_eq!(
2192            vec![("b", Variant::from(2)),],
2193            obj2.iter().collect::<Vec<_>>()
2194        );
2195
2196        assert_eq!(list.get(4).unwrap(), Variant::from(3));
2197    }
2198
2199    #[test]
2200    fn test_nested_object() {
2201        /*
2202        {
2203            "c": {
2204                "b": "a"
2205            }
2206        }
2207
2208        */
2209
2210        let mut builder = VariantBuilder::new();
2211        {
2212            let mut outer_object_builder = builder.new_object();
2213            {
2214                let mut inner_object_builder = outer_object_builder.new_object("c");
2215                inner_object_builder.insert("b", "a");
2216                inner_object_builder.finish();
2217            }
2218
2219            outer_object_builder.finish();
2220        }
2221
2222        let (metadata, value) = builder.finish();
2223        let variant = Variant::try_new(&metadata, &value).unwrap();
2224        let outer_object = variant.as_object().unwrap();
2225
2226        assert_eq!(outer_object.len(), 1);
2227        assert_eq!(outer_object.field_name(0).unwrap(), "c");
2228
2229        let inner_object_variant = outer_object.field(0).unwrap();
2230        let inner_object = inner_object_variant.as_object().unwrap();
2231
2232        assert_eq!(inner_object.len(), 1);
2233        assert_eq!(inner_object.field_name(0).unwrap(), "b");
2234        assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2235    }
2236
2237    #[test]
2238    fn test_nested_object_with_duplicate_field_names_per_object() {
2239        /*
2240        {
2241            "c": {
2242                "b": false,
2243                "c": "a"
2244            },
2245            "b": false,
2246        }
2247
2248        */
2249
2250        let mut builder = VariantBuilder::new();
2251        {
2252            let mut outer_object_builder = builder.new_object();
2253            {
2254                let mut inner_object_builder = outer_object_builder.new_object("c");
2255                inner_object_builder.insert("b", false);
2256                inner_object_builder.insert("c", "a");
2257
2258                inner_object_builder.finish();
2259            }
2260
2261            outer_object_builder.insert("b", false);
2262            outer_object_builder.finish();
2263        }
2264
2265        let (metadata, value) = builder.finish();
2266        let variant = Variant::try_new(&metadata, &value).unwrap();
2267        let outer_object = variant.as_object().unwrap();
2268
2269        assert_eq!(outer_object.len(), 2);
2270        assert_eq!(outer_object.field_name(0).unwrap(), "b");
2271
2272        let inner_object_variant = outer_object.field(1).unwrap();
2273        let inner_object = inner_object_variant.as_object().unwrap();
2274
2275        assert_eq!(inner_object.len(), 2);
2276        assert_eq!(inner_object.field_name(0).unwrap(), "b");
2277        assert_eq!(inner_object.field(0).unwrap(), Variant::from(false));
2278        assert_eq!(inner_object.field_name(1).unwrap(), "c");
2279        assert_eq!(inner_object.field(1).unwrap(), Variant::from("a"));
2280    }
2281
2282    #[test]
2283    fn test_nested_object_with_lists() {
2284        /*
2285        {
2286            "door 1": {
2287                "items": ["apple", false ]
2288            }
2289        }
2290
2291        */
2292
2293        let mut builder = VariantBuilder::new();
2294        {
2295            let mut outer_object_builder = builder.new_object();
2296            {
2297                let mut inner_object_builder = outer_object_builder.new_object("door 1");
2298
2299                // create inner_object_list
2300                inner_object_builder
2301                    .new_list("items")
2302                    .with_value("apple")
2303                    .with_value(false)
2304                    .finish();
2305
2306                inner_object_builder.finish();
2307            }
2308
2309            outer_object_builder.finish();
2310        }
2311
2312        let (metadata, value) = builder.finish();
2313        let variant = Variant::try_new(&metadata, &value).unwrap();
2314        let outer_object = variant.as_object().unwrap();
2315
2316        assert_eq!(outer_object.len(), 1);
2317        assert_eq!(outer_object.field_name(0).unwrap(), "door 1");
2318
2319        let inner_object_variant = outer_object.field(0).unwrap();
2320        let inner_object = inner_object_variant.as_object().unwrap();
2321
2322        assert_eq!(inner_object.len(), 1);
2323        assert_eq!(inner_object.field_name(0).unwrap(), "items");
2324
2325        let items_variant = inner_object.field(0).unwrap();
2326        let items_list = items_variant.as_list().unwrap();
2327
2328        assert_eq!(items_list.len(), 2);
2329        assert_eq!(items_list.get(0).unwrap(), Variant::from("apple"));
2330        assert_eq!(items_list.get(1).unwrap(), Variant::from(false));
2331    }
2332
2333    #[test]
2334    fn test_nested_object_with_heterogeneous_fields() {
2335        /*
2336        {
2337            "a": false,
2338            "c": {
2339                "b": "a",
2340                "c": {
2341                   "aa": "bb",
2342                },
2343                "d": {
2344                    "cc": "dd"
2345                }
2346            },
2347            "b": true,
2348            "d": {
2349               "e": 1,
2350               "f": [1, true],
2351               "g": ["tree", false],
2352            }
2353        }
2354        */
2355
2356        let mut builder = VariantBuilder::new();
2357        {
2358            let mut outer_object_builder = builder.new_object();
2359
2360            outer_object_builder.insert("a", false);
2361
2362            {
2363                let mut inner_object_builder = outer_object_builder.new_object("c");
2364                inner_object_builder.insert("b", "a");
2365
2366                {
2367                    let mut inner_inner_object_builder = inner_object_builder.new_object("c");
2368                    inner_inner_object_builder.insert("aa", "bb");
2369                    inner_inner_object_builder.finish();
2370                }
2371
2372                {
2373                    let mut inner_inner_object_builder = inner_object_builder.new_object("d");
2374                    inner_inner_object_builder.insert("cc", "dd");
2375                    inner_inner_object_builder.finish();
2376                }
2377                inner_object_builder.finish();
2378            }
2379
2380            outer_object_builder.insert("b", true);
2381
2382            {
2383                let mut inner_object_builder = outer_object_builder.new_object("d");
2384                inner_object_builder.insert("e", 1);
2385                {
2386                    let mut inner_list_builder = inner_object_builder.new_list("f");
2387                    inner_list_builder.append_value(1);
2388                    inner_list_builder.append_value(true);
2389
2390                    inner_list_builder.finish();
2391                }
2392
2393                {
2394                    let mut inner_list_builder = inner_object_builder.new_list("g");
2395                    inner_list_builder.append_value("tree");
2396                    inner_list_builder.append_value(false);
2397
2398                    inner_list_builder.finish();
2399                }
2400
2401                inner_object_builder.finish();
2402            }
2403
2404            outer_object_builder.finish();
2405        }
2406
2407        let (metadata, value) = builder.finish();
2408
2409        // note, object fields are now sorted lexigraphically by field name
2410        /*
2411         {
2412            "a": false,
2413            "b": true,
2414            "c": {
2415                "b": "a",
2416                "c": {
2417                   "aa": "bb",
2418                },
2419                "d": {
2420                    "cc": "dd"
2421                }
2422            },
2423            "d": {
2424               "e": 1,
2425               "f": [1, true],
2426               "g": ["tree", false],
2427            }
2428        }
2429        */
2430
2431        let variant = Variant::try_new(&metadata, &value).unwrap();
2432        let outer_object = variant.as_object().unwrap();
2433
2434        assert_eq!(outer_object.len(), 4);
2435
2436        assert_eq!(outer_object.field_name(0).unwrap(), "a");
2437        assert_eq!(outer_object.field(0).unwrap(), Variant::from(false));
2438
2439        assert_eq!(outer_object.field_name(2).unwrap(), "c");
2440
2441        let inner_object_variant = outer_object.field(2).unwrap();
2442        let inner_object = inner_object_variant.as_object().unwrap();
2443
2444        assert_eq!(inner_object.len(), 3);
2445        assert_eq!(inner_object.field_name(0).unwrap(), "b");
2446        assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2447
2448        let inner_iner_object_variant_c = inner_object.field(1).unwrap();
2449        let inner_inner_object_c = inner_iner_object_variant_c.as_object().unwrap();
2450        assert_eq!(inner_inner_object_c.len(), 1);
2451        assert_eq!(inner_inner_object_c.field_name(0).unwrap(), "aa");
2452        assert_eq!(inner_inner_object_c.field(0).unwrap(), Variant::from("bb"));
2453
2454        let inner_iner_object_variant_d = inner_object.field(2).unwrap();
2455        let inner_inner_object_d = inner_iner_object_variant_d.as_object().unwrap();
2456        assert_eq!(inner_inner_object_d.len(), 1);
2457        assert_eq!(inner_inner_object_d.field_name(0).unwrap(), "cc");
2458        assert_eq!(inner_inner_object_d.field(0).unwrap(), Variant::from("dd"));
2459
2460        assert_eq!(outer_object.field_name(1).unwrap(), "b");
2461        assert_eq!(outer_object.field(1).unwrap(), Variant::from(true));
2462
2463        let out_object_variant_d = outer_object.field(3).unwrap();
2464        let out_object_d = out_object_variant_d.as_object().unwrap();
2465        assert_eq!(out_object_d.len(), 3);
2466        assert_eq!("e", out_object_d.field_name(0).unwrap());
2467        assert_eq!(Variant::from(1), out_object_d.field(0).unwrap());
2468        assert_eq!("f", out_object_d.field_name(1).unwrap());
2469
2470        let first_inner_list_variant_f = out_object_d.field(1).unwrap();
2471        let first_inner_list_f = first_inner_list_variant_f.as_list().unwrap();
2472        assert_eq!(2, first_inner_list_f.len());
2473        assert_eq!(Variant::from(1), first_inner_list_f.get(0).unwrap());
2474        assert_eq!(Variant::from(true), first_inner_list_f.get(1).unwrap());
2475
2476        let second_inner_list_variant_g = out_object_d.field(2).unwrap();
2477        let second_inner_list_g = second_inner_list_variant_g.as_list().unwrap();
2478        assert_eq!(2, second_inner_list_g.len());
2479        assert_eq!(Variant::from("tree"), second_inner_list_g.get(0).unwrap());
2480        assert_eq!(Variant::from(false), second_inner_list_g.get(1).unwrap());
2481    }
2482
2483    // This test wants to cover the logic for reuse parent buffer for list builder
2484    // the builder looks like
2485    // [ "apple", "false", [{"a": "b", "b": "c"}, {"c":"d", "d":"e"}], [[1, true], ["tree", false]], 1]
2486    #[test]
2487    fn test_nested_list_with_heterogeneous_fields_for_buffer_reuse() {
2488        let mut builder = VariantBuilder::new();
2489
2490        {
2491            let mut outer_list_builder = builder.new_list();
2492
2493            outer_list_builder.append_value("apple");
2494            outer_list_builder.append_value(false);
2495
2496            {
2497                // the list here wants to cover the logic object builder inside list builder
2498                let mut inner_list_builder = outer_list_builder.new_list();
2499
2500                {
2501                    let mut inner_object_builder = inner_list_builder.new_object();
2502                    inner_object_builder.insert("a", "b");
2503                    inner_object_builder.insert("b", "c");
2504                    inner_object_builder.finish();
2505                }
2506
2507                {
2508                    // the seconde object builder here wants to cover the logic for
2509                    // list builder resue the parent buffer.
2510                    let mut inner_object_builder = inner_list_builder.new_object();
2511                    inner_object_builder.insert("c", "d");
2512                    inner_object_builder.insert("d", "e");
2513                    inner_object_builder.finish();
2514                }
2515
2516                inner_list_builder.finish();
2517            }
2518
2519            {
2520                // the list here wants to cover the logic list builder inside list builder
2521                let mut inner_list_builder = outer_list_builder.new_list();
2522
2523                {
2524                    let mut double_inner_list_builder = inner_list_builder.new_list();
2525                    double_inner_list_builder.append_value(1);
2526                    double_inner_list_builder.append_value(true);
2527
2528                    double_inner_list_builder.finish();
2529                }
2530
2531                {
2532                    let mut double_inner_list_builder = inner_list_builder.new_list();
2533                    double_inner_list_builder.append_value("tree");
2534                    double_inner_list_builder.append_value(false);
2535
2536                    double_inner_list_builder.finish();
2537                }
2538                inner_list_builder.finish();
2539            }
2540
2541            outer_list_builder.append_value(1);
2542
2543            outer_list_builder.finish();
2544        }
2545
2546        let (metadata, value) = builder.finish();
2547
2548        let variant = Variant::try_new(&metadata, &value).unwrap();
2549        let outer_list = variant.as_list().unwrap();
2550
2551        assert_eq!(5, outer_list.len());
2552
2553        // Primitive value
2554        assert_eq!(Variant::from("apple"), outer_list.get(0).unwrap());
2555        assert_eq!(Variant::from(false), outer_list.get(1).unwrap());
2556        assert_eq!(Variant::from(1), outer_list.get(4).unwrap());
2557
2558        // The first inner list [{"a": "b", "b": "c"}, {"c":"d", "d":"e"}]
2559        let list1_variant = outer_list.get(2).unwrap();
2560        let list1 = list1_variant.as_list().unwrap();
2561        assert_eq!(2, list1.len());
2562
2563        let list1_obj1_variant = list1.get(0).unwrap();
2564        let list1_obj1 = list1_obj1_variant.as_object().unwrap();
2565        assert_eq!("a", list1_obj1.field_name(0).unwrap());
2566        assert_eq!(Variant::from("b"), list1_obj1.field(0).unwrap());
2567
2568        assert_eq!("b", list1_obj1.field_name(1).unwrap());
2569        assert_eq!(Variant::from("c"), list1_obj1.field(1).unwrap());
2570
2571        // The second inner list [[1, true], ["tree", false]]
2572        let list2_variant = outer_list.get(3).unwrap();
2573        let list2 = list2_variant.as_list().unwrap();
2574        assert_eq!(2, list2.len());
2575
2576        // The list [1, true]
2577        let list2_list1_variant = list2.get(0).unwrap();
2578        let list2_list1 = list2_list1_variant.as_list().unwrap();
2579        assert_eq!(2, list2_list1.len());
2580        assert_eq!(Variant::from(1), list2_list1.get(0).unwrap());
2581        assert_eq!(Variant::from(true), list2_list1.get(1).unwrap());
2582
2583        // The list ["true", false]
2584        let list2_list2_variant = list2.get(1).unwrap();
2585        let list2_list2 = list2_list2_variant.as_list().unwrap();
2586        assert_eq!(2, list2_list2.len());
2587        assert_eq!(Variant::from("tree"), list2_list2.get(0).unwrap());
2588        assert_eq!(Variant::from(false), list2_list2.get(1).unwrap());
2589    }
2590
2591    #[test]
2592    fn test_object_without_unique_field_validation() {
2593        let mut builder = VariantBuilder::new();
2594
2595        // Root object with duplicates
2596        let mut obj = builder.new_object();
2597        obj.insert("a", 1);
2598        obj.insert("a", 2);
2599        obj.finish();
2600
2601        // Deeply nested list structure with duplicates
2602        let mut builder = VariantBuilder::new();
2603        let mut outer_list = builder.new_list();
2604        let mut inner_list = outer_list.new_list();
2605        let mut nested_obj = inner_list.new_object();
2606        nested_obj.insert("x", 1);
2607        nested_obj.insert("x", 2);
2608        nested_obj.new_list("x").with_value(3).finish();
2609        nested_obj.new_object("x").with_field("y", 4).finish();
2610        nested_obj.finish();
2611        inner_list.finish();
2612        outer_list.finish();
2613
2614        // Verify the nested object is built correctly -- the nested object "x" should have "won"
2615        let (metadata, value) = builder.finish();
2616        let variant = Variant::try_new(&metadata, &value).unwrap();
2617        let outer_element = variant.get_list_element(0).unwrap();
2618        let inner_element = outer_element.get_list_element(0).unwrap();
2619        let outer_field = inner_element.get_object_field("x").unwrap();
2620        let inner_field = outer_field.get_object_field("y").unwrap();
2621        assert_eq!(inner_field, Variant::from(4));
2622    }
2623
2624    #[test]
2625    fn test_object_with_unique_field_validation() {
2626        let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
2627
2628        // Root-level object with duplicates
2629        let result = builder
2630            .new_object()
2631            .with_field("a", 1)
2632            .with_field("b", 2)
2633            .try_with_field("a", 3);
2634        assert_eq!(
2635            result.unwrap_err().to_string(),
2636            "Invalid argument error: Duplicate field name: a"
2637        );
2638
2639        // Deeply nested list -> list -> object with duplicate
2640        let mut outer_list = builder.new_list();
2641        let mut inner_list = outer_list.new_list();
2642        let mut object = inner_list.new_object().with_field("x", 1);
2643        let nested_result = object.try_insert("x", 2);
2644        assert_eq!(
2645            nested_result.unwrap_err().to_string(),
2646            "Invalid argument error: Duplicate field name: x"
2647        );
2648        let nested_result = object.try_new_list("x");
2649        assert_eq!(
2650            nested_result.unwrap_err().to_string(),
2651            "Invalid argument error: Duplicate field name: x"
2652        );
2653
2654        let nested_result = object.try_new_object("x");
2655        assert_eq!(
2656            nested_result.unwrap_err().to_string(),
2657            "Invalid argument error: Duplicate field name: x"
2658        );
2659
2660        drop(object);
2661        inner_list.finish();
2662        outer_list.finish();
2663
2664        // Valid object should succeed
2665        let mut list = builder.new_list();
2666        let mut valid_obj = list.new_object();
2667        valid_obj.insert("m", 1);
2668        valid_obj.insert("n", 2);
2669
2670        valid_obj.finish();
2671        list.finish();
2672    }
2673
2674    #[test]
2675    fn test_sorted_dictionary() {
2676        // check if variant metadatabuilders are equivalent from different ways of constructing them
2677        let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"]);
2678
2679        let mut variant2 = {
2680            let mut builder = VariantBuilder::new();
2681
2682            builder.add_field_name("b");
2683            builder.add_field_name("c");
2684            builder.add_field_name("d");
2685
2686            builder
2687        };
2688
2689        assert_eq!(
2690            variant1.metadata_builder.field_names,
2691            variant2.metadata_builder.field_names
2692        );
2693
2694        // check metadata builders say it's sorted
2695        assert!(variant1.metadata_builder.is_sorted);
2696        assert!(variant2.metadata_builder.is_sorted);
2697
2698        {
2699            // test the bad case and break the sort order
2700            variant2.add_field_name("a");
2701            assert!(!variant2.metadata_builder.is_sorted);
2702
2703            // per the spec, make sure the variant will fail to build if only metadata is provided
2704            let (m, v) = variant2.finish();
2705            let res = Variant::try_new(&m, &v);
2706            assert!(res.is_err());
2707
2708            // since it is not sorted, make sure the metadata says so
2709            let header = VariantMetadata::try_new(&m).unwrap();
2710            assert!(!header.is_sorted());
2711        }
2712
2713        // write out variant1 and make sure the sorted flag is properly encoded
2714        variant1.append_value(false);
2715
2716        let (m, v) = variant1.finish();
2717        let res = Variant::try_new(&m, &v);
2718        assert!(res.is_ok());
2719
2720        let header = VariantMetadata::try_new(&m).unwrap();
2721        assert!(header.is_sorted());
2722    }
2723
2724    #[test]
2725    fn test_object_sorted_dictionary() {
2726        // predefine the list of field names
2727        let mut variant1 = VariantBuilder::new().with_field_names(["a", "b", "c"]);
2728        let mut obj = variant1.new_object();
2729
2730        obj.insert("c", true);
2731        obj.insert("a", false);
2732        obj.insert("b", ());
2733
2734        // verify the field ids are correctly
2735        let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2736        assert_eq!(field_ids_by_insert_order, vec![2, 0, 1]);
2737
2738        // add a field name that wasn't pre-defined but doesn't break the sort order
2739        obj.insert("d", 2);
2740        obj.finish();
2741
2742        let (metadata, value) = variant1.finish();
2743        let variant = Variant::try_new(&metadata, &value).unwrap();
2744
2745        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2746        assert!(metadata.is_sorted());
2747
2748        // verify object is sorted by field name order
2749        let object = variant.as_object().unwrap();
2750        let field_names = object
2751            .iter()
2752            .map(|(field_name, _)| field_name)
2753            .collect::<Vec<_>>();
2754
2755        assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2756    }
2757
2758    #[test]
2759    fn test_object_not_sorted_dictionary() {
2760        // predefine the list of field names
2761        let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"]);
2762        let mut obj = variant1.new_object();
2763
2764        obj.insert("c", true);
2765        obj.insert("d", false);
2766        obj.insert("b", ());
2767
2768        // verify the field ids are correctly
2769        let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2770        assert_eq!(field_ids_by_insert_order, vec![1, 2, 0]);
2771
2772        // add a field name that wasn't pre-defined but breaks the sort order
2773        obj.insert("a", 2);
2774        obj.finish();
2775
2776        let (metadata, value) = variant1.finish();
2777        let variant = Variant::try_new(&metadata, &value).unwrap();
2778
2779        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2780        assert!(!metadata.is_sorted());
2781
2782        // verify object field names are sorted by field name order
2783        let object = variant.as_object().unwrap();
2784        let field_names = object
2785            .iter()
2786            .map(|(field_name, _)| field_name)
2787            .collect::<Vec<_>>();
2788
2789        assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2790    }
2791
2792    #[test]
2793    fn test_building_sorted_dictionary() {
2794        let mut builder = VariantBuilder::new();
2795        assert!(!builder.metadata_builder.is_sorted);
2796        assert_eq!(builder.metadata_builder.num_field_names(), 0);
2797
2798        builder.add_field_name("a");
2799
2800        assert!(builder.metadata_builder.is_sorted);
2801        assert_eq!(builder.metadata_builder.num_field_names(), 1);
2802
2803        let builder = builder.with_field_names(["b", "c", "d"]);
2804
2805        assert!(builder.metadata_builder.is_sorted);
2806        assert_eq!(builder.metadata_builder.num_field_names(), 4);
2807
2808        let builder = builder.with_field_names(["z", "y"]);
2809        assert!(!builder.metadata_builder.is_sorted);
2810        assert_eq!(builder.metadata_builder.num_field_names(), 6);
2811    }
2812
2813    #[test]
2814    fn test_metadata_builder_from_iter() {
2815        let metadata = WritableMetadataBuilder::from_iter(vec!["apple", "banana", "cherry"]);
2816        assert_eq!(metadata.num_field_names(), 3);
2817        assert_eq!(metadata.field_name(0), "apple");
2818        assert_eq!(metadata.field_name(1), "banana");
2819        assert_eq!(metadata.field_name(2), "cherry");
2820        assert!(metadata.is_sorted);
2821
2822        let metadata = WritableMetadataBuilder::from_iter(["zebra", "apple", "banana"]);
2823        assert_eq!(metadata.num_field_names(), 3);
2824        assert_eq!(metadata.field_name(0), "zebra");
2825        assert_eq!(metadata.field_name(1), "apple");
2826        assert_eq!(metadata.field_name(2), "banana");
2827        assert!(!metadata.is_sorted);
2828
2829        let metadata = WritableMetadataBuilder::from_iter(Vec::<&str>::new());
2830        assert_eq!(metadata.num_field_names(), 0);
2831        assert!(!metadata.is_sorted);
2832    }
2833
2834    #[test]
2835    fn test_metadata_builder_extend() {
2836        let mut metadata = WritableMetadataBuilder::default();
2837        assert_eq!(metadata.num_field_names(), 0);
2838        assert!(!metadata.is_sorted);
2839
2840        metadata.extend(["apple", "cherry"]);
2841        assert_eq!(metadata.num_field_names(), 2);
2842        assert_eq!(metadata.field_name(0), "apple");
2843        assert_eq!(metadata.field_name(1), "cherry");
2844        assert!(metadata.is_sorted);
2845
2846        // extend with more field names that maintain sort order
2847        metadata.extend(vec!["dinosaur", "monkey"]);
2848        assert_eq!(metadata.num_field_names(), 4);
2849        assert_eq!(metadata.field_name(2), "dinosaur");
2850        assert_eq!(metadata.field_name(3), "monkey");
2851        assert!(metadata.is_sorted);
2852
2853        // test extending with duplicate field names
2854        let initial_count = metadata.num_field_names();
2855        metadata.extend(["apple", "monkey"]);
2856        assert_eq!(metadata.num_field_names(), initial_count); // No new fields added
2857    }
2858
2859    #[test]
2860    fn test_metadata_builder_extend_sort_order() {
2861        let mut metadata = WritableMetadataBuilder::default();
2862
2863        metadata.extend(["middle"]);
2864        assert!(metadata.is_sorted);
2865
2866        metadata.extend(["zebra"]);
2867        assert!(metadata.is_sorted);
2868
2869        // add field that breaks sort order
2870        metadata.extend(["apple"]);
2871        assert!(!metadata.is_sorted);
2872    }
2873
2874    #[test]
2875    fn test_metadata_builder_from_iter_with_string_types() {
2876        // &str
2877        let metadata = WritableMetadataBuilder::from_iter(["a", "b", "c"]);
2878        assert_eq!(metadata.num_field_names(), 3);
2879
2880        // string
2881        let metadata = WritableMetadataBuilder::from_iter(vec![
2882            "a".to_string(),
2883            "b".to_string(),
2884            "c".to_string(),
2885        ]);
2886        assert_eq!(metadata.num_field_names(), 3);
2887
2888        // mixed types (anything that implements AsRef<str>)
2889        let field_names: Vec<Box<str>> = vec!["a".into(), "b".into(), "c".into()];
2890        let metadata = WritableMetadataBuilder::from_iter(field_names);
2891        assert_eq!(metadata.num_field_names(), 3);
2892    }
2893
2894    #[test]
2895    fn test_variant_builder_to_list_builder_no_finish() {
2896        // Create a list builder but never finish it
2897        let mut builder = VariantBuilder::new();
2898        let mut list_builder = builder.new_list();
2899        list_builder.append_value("hi");
2900        drop(list_builder);
2901
2902        builder.append_value(42i8);
2903
2904        // The original builder should be unchanged
2905        let (metadata, value) = builder.finish();
2906        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2907        assert!(metadata.is_empty());
2908
2909        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2910        assert_eq!(variant, Variant::Int8(42));
2911    }
2912
2913    #[test]
2914    fn test_variant_builder_to_object_builder_no_finish() {
2915        // Create an object builder but never finish it
2916        let mut builder = VariantBuilder::new();
2917        let mut object_builder = builder.new_object();
2918        object_builder.insert("name", "unknown");
2919        drop(object_builder);
2920
2921        builder.append_value(42i8);
2922
2923        // The original builder should be unchanged
2924        let (metadata, value) = builder.finish();
2925        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2926        assert!(metadata.is_empty()); // rolled back
2927
2928        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2929        assert_eq!(variant, Variant::Int8(42));
2930    }
2931
2932    #[test]
2933    fn test_list_builder_to_list_builder_inner_no_finish() {
2934        let mut builder = VariantBuilder::new();
2935        let mut list_builder = builder.new_list();
2936        list_builder.append_value(1i8);
2937
2938        // Create a nested list builder but never finish it
2939        let mut nested_list_builder = list_builder.new_list();
2940        nested_list_builder.append_value("hi");
2941        drop(nested_list_builder);
2942
2943        list_builder.append_value(2i8);
2944
2945        // The parent list should only contain the original values
2946        list_builder.finish();
2947        let (metadata, value) = builder.finish();
2948        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2949        assert!(metadata.is_empty());
2950
2951        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2952        let list = variant.as_list().unwrap();
2953        assert_eq!(list.len(), 2);
2954        assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
2955        assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
2956    }
2957
2958    #[test]
2959    fn test_list_builder_to_list_builder_outer_no_finish() {
2960        let mut builder = VariantBuilder::new();
2961        let mut list_builder = builder.new_list();
2962        list_builder.append_value(1i8);
2963
2964        // Create a nested list builder and finish it
2965        let mut nested_list_builder = list_builder.new_list();
2966        nested_list_builder.append_value("hi");
2967        nested_list_builder.finish();
2968
2969        // Drop the outer list builder without finishing it
2970        drop(list_builder);
2971
2972        builder.append_value(2i8);
2973
2974        // Only the second attempt should appear in the final variant
2975        let (metadata, value) = builder.finish();
2976        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2977        assert!(metadata.is_empty());
2978
2979        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2980        assert_eq!(variant, Variant::Int8(2));
2981    }
2982
2983    #[test]
2984    fn test_list_builder_to_object_builder_inner_no_finish() {
2985        let mut builder = VariantBuilder::new();
2986        let mut list_builder = builder.new_list();
2987        list_builder.append_value(1i8);
2988
2989        // Create a nested object builder but never finish it
2990        let mut nested_object_builder = list_builder.new_object();
2991        nested_object_builder.insert("name", "unknown");
2992        drop(nested_object_builder);
2993
2994        list_builder.append_value(2i8);
2995
2996        // The parent list should only contain the original values
2997        list_builder.finish();
2998        let (metadata, value) = builder.finish();
2999        let metadata = VariantMetadata::try_new(&metadata).unwrap();
3000        assert!(metadata.is_empty());
3001
3002        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3003        let list = variant.as_list().unwrap();
3004        assert_eq!(list.len(), 2);
3005        assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
3006        assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
3007    }
3008
3009    #[test]
3010    fn test_list_builder_to_object_builder_outer_no_finish() {
3011        let mut builder = VariantBuilder::new();
3012        let mut list_builder = builder.new_list();
3013        list_builder.append_value(1i8);
3014
3015        // Create a nested object builder and finish it
3016        let mut nested_object_builder = list_builder.new_object();
3017        nested_object_builder.insert("name", "unknown");
3018        nested_object_builder.finish();
3019
3020        // Drop the outer list builder without finishing it
3021        drop(list_builder);
3022
3023        builder.append_value(2i8);
3024
3025        // Only the second attempt should appear in the final variant
3026        let (metadata, value) = builder.finish();
3027        let metadata = VariantMetadata::try_new(&metadata).unwrap();
3028        assert!(metadata.is_empty()); // rolled back
3029
3030        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3031        assert_eq!(variant, Variant::Int8(2));
3032    }
3033
3034    #[test]
3035    fn test_object_builder_to_list_builder_inner_no_finish() {
3036        let mut builder = VariantBuilder::new();
3037        let mut object_builder = builder.new_object();
3038        object_builder.insert("first", 1i8);
3039
3040        // Create a nested list builder but never finish it
3041        let mut nested_list_builder = object_builder.new_list("nested");
3042        nested_list_builder.append_value("hi");
3043        drop(nested_list_builder);
3044
3045        object_builder.insert("second", 2i8);
3046
3047        // The parent object should only contain the original fields
3048        object_builder.finish();
3049        let (metadata, value) = builder.finish();
3050
3051        let metadata = VariantMetadata::try_new(&metadata).unwrap();
3052        assert_eq!(metadata.len(), 2);
3053        assert_eq!(&metadata[0], "first");
3054        assert_eq!(&metadata[1], "second");
3055
3056        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3057        let obj = variant.as_object().unwrap();
3058        assert_eq!(obj.len(), 2);
3059        assert_eq!(obj.get("first"), Some(Variant::Int8(1)));
3060        assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
3061    }
3062
3063    #[test]
3064    fn test_object_builder_to_list_builder_outer_no_finish() {
3065        let mut builder = VariantBuilder::new();
3066        let mut object_builder = builder.new_object();
3067        object_builder.insert("first", 1i8);
3068
3069        // Create a nested list builder and finish it
3070        let mut nested_list_builder = object_builder.new_list("nested");
3071        nested_list_builder.append_value("hi");
3072        nested_list_builder.finish();
3073
3074        // Drop the outer object builder without finishing it
3075        drop(object_builder);
3076
3077        builder.append_value(2i8);
3078
3079        // Only the second attempt should appear in the final variant
3080        let (metadata, value) = builder.finish();
3081        let metadata = VariantMetadata::try_new(&metadata).unwrap();
3082        assert!(metadata.is_empty()); // rolled back
3083
3084        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3085        assert_eq!(variant, Variant::Int8(2));
3086    }
3087
3088    #[test]
3089    fn test_object_builder_to_object_builder_inner_no_finish() {
3090        let mut builder = VariantBuilder::new();
3091        let mut object_builder = builder.new_object();
3092        object_builder.insert("first", 1i8);
3093
3094        // Create a nested object builder but never finish it
3095        let mut nested_object_builder = object_builder.new_object("nested");
3096        nested_object_builder.insert("name", "unknown");
3097        drop(nested_object_builder);
3098
3099        object_builder.insert("second", 2i8);
3100
3101        // The parent object should only contain the original fields
3102        object_builder.finish();
3103        let (metadata, value) = builder.finish();
3104
3105        let metadata = VariantMetadata::try_new(&metadata).unwrap();
3106        assert_eq!(metadata.len(), 2); // the fields of nested_object_builder has been rolled back
3107        assert_eq!(&metadata[0], "first");
3108        assert_eq!(&metadata[1], "second");
3109
3110        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3111        let obj = variant.as_object().unwrap();
3112        assert_eq!(obj.len(), 2);
3113        assert_eq!(obj.get("first"), Some(Variant::Int8(1)));
3114        assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
3115    }
3116
3117    #[test]
3118    fn test_object_builder_to_object_builder_outer_no_finish() {
3119        let mut builder = VariantBuilder::new();
3120        let mut object_builder = builder.new_object();
3121        object_builder.insert("first", 1i8);
3122
3123        // Create a nested object builder and finish it
3124        let mut nested_object_builder = object_builder.new_object("nested");
3125        nested_object_builder.insert("name", "unknown");
3126        nested_object_builder.finish();
3127
3128        // Drop the outer object builder without finishing it
3129        drop(object_builder);
3130
3131        builder.append_value(2i8);
3132
3133        // Only the second attempt should appear in the final variant
3134        let (metadata, value) = builder.finish();
3135        let metadata = VariantMetadata::try_new(&metadata).unwrap();
3136        assert_eq!(metadata.len(), 0); // rolled back
3137
3138        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3139        assert_eq!(variant, Variant::Int8(2));
3140    }
3141
3142    // matthew
3143    #[test]
3144    fn test_append_object() {
3145        let (m1, v1) = make_object();
3146        let variant = Variant::new(&m1, &v1);
3147
3148        let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3149
3150        builder.append_value(variant.clone());
3151
3152        let (metadata, value) = builder.finish();
3153        assert_eq!(variant, Variant::new(&metadata, &value));
3154    }
3155
3156    /// make an object variant with field names in reverse lexicographical order
3157    fn make_object() -> (Vec<u8>, Vec<u8>) {
3158        let mut builder = VariantBuilder::new();
3159
3160        let mut obj = builder.new_object();
3161
3162        obj.insert("b", true);
3163        obj.insert("a", false);
3164        obj.finish();
3165        builder.finish()
3166    }
3167
3168    #[test]
3169    fn test_append_nested_object() {
3170        let (m1, v1) = make_nested_object();
3171        let variant = Variant::new(&m1, &v1);
3172
3173        // because we can guarantee metadata is validated through the builder
3174        let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3175        builder.append_value(variant.clone());
3176
3177        let (metadata, value) = builder.finish();
3178        let result_variant = Variant::new(&metadata, &value);
3179
3180        assert_eq!(variant, result_variant);
3181    }
3182
3183    /// make a nested object variant
3184    fn make_nested_object() -> (Vec<u8>, Vec<u8>) {
3185        let mut builder = VariantBuilder::new();
3186
3187        {
3188            let mut outer_obj = builder.new_object();
3189
3190            {
3191                let mut inner_obj = outer_obj.new_object("b");
3192                inner_obj.insert("a", "inner_value");
3193                inner_obj.finish();
3194            }
3195
3196            outer_obj.finish();
3197        }
3198
3199        builder.finish()
3200    }
3201
3202    #[test]
3203    fn test_append_list() {
3204        let (m1, v1) = make_list();
3205        let variant = Variant::new(&m1, &v1);
3206        let mut builder = VariantBuilder::new();
3207        builder.append_value(variant.clone());
3208        let (metadata, value) = builder.finish();
3209        assert_eq!(variant, Variant::new(&metadata, &value));
3210    }
3211
3212    /// make a simple List variant
3213    fn make_list() -> (Vec<u8>, Vec<u8>) {
3214        let mut builder = VariantBuilder::new();
3215
3216        builder
3217            .new_list()
3218            .with_value(1234)
3219            .with_value("a string value")
3220            .finish();
3221
3222        builder.finish()
3223    }
3224
3225    #[test]
3226    fn test_append_nested_list() {
3227        let (m1, v1) = make_nested_list();
3228        let variant = Variant::new(&m1, &v1);
3229        let mut builder = VariantBuilder::new();
3230        builder.append_value(variant.clone());
3231        let (metadata, value) = builder.finish();
3232        assert_eq!(variant, Variant::new(&metadata, &value));
3233    }
3234
3235    fn make_nested_list() -> (Vec<u8>, Vec<u8>) {
3236        let mut builder = VariantBuilder::new();
3237        let mut list = builder.new_list();
3238
3239        //create inner list
3240        list.new_list()
3241            .with_value("the dog licked the oil")
3242            .with_value(4.3)
3243            .finish();
3244
3245        list.finish();
3246
3247        builder.finish()
3248    }
3249
3250    // Make sure that we can correctly build deeply nested objects even when some of the nested
3251    // builders don't finish.
3252    #[test]
3253    fn test_append_list_object_list_object() {
3254        // An infinite counter
3255        let mut counter = 0..;
3256        let mut take = move |i| (&mut counter).take(i).collect::<Vec<_>>();
3257        let mut builder = VariantBuilder::new();
3258        let skip = 5;
3259        {
3260            let mut list = builder.new_list();
3261            for i in take(4) {
3262                let mut object = list.new_object();
3263                for i in take(4) {
3264                    let field_name = format!("field{i}");
3265                    let mut list = object.new_list(&field_name);
3266                    for i in take(3) {
3267                        let mut object = list.new_object();
3268                        for i in take(3) {
3269                            if i % skip != 0 {
3270                                object.insert(&format!("field{i}"), i);
3271                            }
3272                        }
3273                        if i % skip != 0 {
3274                            object.finish();
3275                        }
3276                    }
3277                    if i % skip != 0 {
3278                        list.finish();
3279                    }
3280                }
3281                if i % skip != 0 {
3282                    object.finish();
3283                }
3284            }
3285            list.finish();
3286        }
3287        let (metadata, value) = builder.finish();
3288        let v1 = Variant::try_new(&metadata, &value).unwrap();
3289
3290        let (metadata, value) = VariantBuilder::new().with_value(v1.clone()).finish();
3291        let v2 = Variant::try_new(&metadata, &value).unwrap();
3292
3293        assert_eq!(format!("{v1:?}"), format!("{v2:?}"));
3294    }
3295
3296    #[test]
3297    fn test_read_only_metadata_builder() {
3298        // First create some metadata with a few field names
3299        let mut default_builder = VariantBuilder::new();
3300        default_builder.add_field_name("name");
3301        default_builder.add_field_name("age");
3302        default_builder.add_field_name("active");
3303        let (metadata_bytes, _) = default_builder.finish();
3304
3305        // Use the metadata to build new variant values
3306        let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
3307        let mut metadata_builder = ReadOnlyMetadataBuilder::new(metadata);
3308        let mut value_builder = ValueBuilder::new();
3309
3310        {
3311            let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
3312            let mut obj = ObjectBuilder::new(state, false);
3313
3314            // These should succeed because the fields exist in the metadata
3315            obj.insert("name", "Alice");
3316            obj.insert("age", 30i8);
3317            obj.insert("active", true);
3318            obj.finish();
3319        }
3320
3321        let value = value_builder.into_inner();
3322
3323        // Verify the variant was built correctly
3324        let variant = Variant::try_new(&metadata_bytes, &value).unwrap();
3325        let obj = variant.as_object().unwrap();
3326        assert_eq!(obj.get("name"), Some(Variant::from("Alice")));
3327        assert_eq!(obj.get("age"), Some(Variant::Int8(30)));
3328        assert_eq!(obj.get("active"), Some(Variant::from(true)));
3329    }
3330
3331    #[test]
3332    fn test_read_only_metadata_builder_fails_on_unknown_field() {
3333        // Create metadata with only one field
3334        let mut default_builder = VariantBuilder::new();
3335        default_builder.add_field_name("known_field");
3336        let (metadata_bytes, _) = default_builder.finish();
3337
3338        // Use the metadata to build new variant values
3339        let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
3340        let mut metadata_builder = ReadOnlyMetadataBuilder::new(metadata);
3341        let mut value_builder = ValueBuilder::new();
3342
3343        {
3344            let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
3345            let mut obj = ObjectBuilder::new(state, false);
3346
3347            // This should succeed
3348            obj.insert("known_field", "value");
3349
3350            // This should fail because "unknown_field" is not in the metadata
3351            let result = obj.try_insert("unknown_field", "value");
3352            assert!(result.is_err());
3353            assert!(result
3354                .unwrap_err()
3355                .to_string()
3356                .contains("Field name 'unknown_field' not found"));
3357        }
3358    }
3359
3360    #[test]
3361    fn test_append_variant_bytes_round_trip() {
3362        // Create a complex variant with the normal builder
3363        let mut builder = VariantBuilder::new();
3364        {
3365            let mut obj = builder.new_object();
3366            obj.insert("name", "Alice");
3367            obj.insert("age", 30i32);
3368            {
3369                let mut scores_list = obj.new_list("scores");
3370                scores_list.append_value(95i32);
3371                scores_list.append_value(87i32);
3372                scores_list.append_value(92i32);
3373                scores_list.finish();
3374            }
3375            {
3376                let mut address = obj.new_object("address");
3377                address.insert("street", "123 Main St");
3378                address.insert("city", "Anytown");
3379                address.finish();
3380            }
3381            obj.finish();
3382        }
3383        let (metadata, value1) = builder.finish();
3384        let variant1 = Variant::try_new(&metadata, &value1).unwrap();
3385
3386        // Copy using the new bytes API
3387        let metadata = VariantMetadata::new(&metadata);
3388        let mut metadata = ReadOnlyMetadataBuilder::new(metadata);
3389        let mut builder2 = ValueBuilder::new();
3390        let state = ParentState::variant(&mut builder2, &mut metadata);
3391        ValueBuilder::append_variant_bytes(state, variant1.clone());
3392        let value2 = builder2.into_inner();
3393
3394        // The bytes should be identical, we merely copied them across.
3395        assert_eq!(value1, value2);
3396    }
3397
3398    #[test]
3399    fn test_object_insert_bytes_subset() {
3400        // Create an original object, making sure to inject the field names we'll add later.
3401        let mut builder = VariantBuilder::new().with_field_names(["new_field", "another_field"]);
3402        {
3403            let mut obj = builder.new_object();
3404            obj.insert("field1", "value1");
3405            obj.insert("field2", 42i32);
3406            obj.insert("field3", true);
3407            obj.insert("field4", "value4");
3408            obj.finish();
3409        }
3410        let (metadata1, value1) = builder.finish();
3411        let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3412        let original_obj = original_variant.as_object().unwrap();
3413
3414        // Create a new object copying subset of fields interleaved with new ones
3415        let metadata2 = VariantMetadata::new(&metadata1);
3416        let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
3417        let mut builder2 = ValueBuilder::new();
3418        let state = ParentState::variant(&mut builder2, &mut metadata2);
3419        {
3420            let mut obj = ObjectBuilder::new(state, true);
3421
3422            // Copy field1 using bytes API
3423            obj.insert_bytes("field1", original_obj.get("field1").unwrap());
3424
3425            // Add new field
3426            obj.insert("new_field", "new_value");
3427
3428            // Copy field3 using bytes API
3429            obj.insert_bytes("field3", original_obj.get("field3").unwrap());
3430
3431            // Add another new field
3432            obj.insert("another_field", 99i32);
3433
3434            // Copy field2 using bytes API
3435            obj.insert_bytes("field2", original_obj.get("field2").unwrap());
3436
3437            obj.finish();
3438        }
3439        let value2 = builder2.into_inner();
3440        let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3441        let result_obj = result_variant.as_object().unwrap();
3442
3443        // Verify the object contains expected fields
3444        assert_eq!(result_obj.len(), 5);
3445        assert_eq!(
3446            result_obj.get("field1").unwrap().as_string().unwrap(),
3447            "value1"
3448        );
3449        assert_eq!(result_obj.get("field2").unwrap().as_int32().unwrap(), 42);
3450        assert!(result_obj.get("field3").unwrap().as_boolean().unwrap());
3451        assert_eq!(
3452            result_obj.get("new_field").unwrap().as_string().unwrap(),
3453            "new_value"
3454        );
3455        assert_eq!(
3456            result_obj.get("another_field").unwrap().as_int32().unwrap(),
3457            99
3458        );
3459    }
3460
3461    #[test]
3462    fn test_list_append_bytes_subset() {
3463        // Create an original list
3464        let mut builder = VariantBuilder::new();
3465        {
3466            let mut list = builder.new_list();
3467            list.append_value("item1");
3468            list.append_value(42i32);
3469            list.append_value(true);
3470            list.append_value("item4");
3471            list.append_value(1.234f64);
3472            list.finish();
3473        }
3474        let (metadata1, value1) = builder.finish();
3475        let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3476        let original_list = original_variant.as_list().unwrap();
3477
3478        // Create a new list copying subset of elements interleaved with new ones
3479        let metadata2 = VariantMetadata::new(&metadata1);
3480        let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
3481        let mut builder2 = ValueBuilder::new();
3482        let state = ParentState::variant(&mut builder2, &mut metadata2);
3483        {
3484            let mut list = ListBuilder::new(state, true);
3485
3486            // Copy first element using bytes API
3487            list.append_value_bytes(original_list.get(0).unwrap());
3488
3489            // Add new element
3490            list.append_value("new_item");
3491
3492            // Copy third element using bytes API
3493            list.append_value_bytes(original_list.get(2).unwrap());
3494
3495            // Add another new element
3496            list.append_value(99i32);
3497
3498            // Copy last element using bytes API
3499            list.append_value_bytes(original_list.get(4).unwrap());
3500
3501            list.finish();
3502        }
3503        let value2 = builder2.into_inner();
3504        let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3505        let result_list = result_variant.as_list().unwrap();
3506
3507        // Verify the list contains expected elements
3508        assert_eq!(result_list.len(), 5);
3509        assert_eq!(result_list.get(0).unwrap().as_string().unwrap(), "item1");
3510        assert_eq!(result_list.get(1).unwrap().as_string().unwrap(), "new_item");
3511        assert!(result_list.get(2).unwrap().as_boolean().unwrap());
3512        assert_eq!(result_list.get(3).unwrap().as_int32().unwrap(), 99);
3513        assert_eq!(result_list.get(4).unwrap().as_f64().unwrap(), 1.234);
3514    }
3515
3516    #[test]
3517    fn test_complex_nested_filtering_injection() {
3518        // Create a complex nested structure: object -> list -> objects. Make sure to pre-register
3519        // the extra field names we'll need later while manipulating variant bytes.
3520        let mut builder = VariantBuilder::new().with_field_names([
3521            "active_count",
3522            "active_users",
3523            "computed_score",
3524            "processed_at",
3525            "status",
3526        ]);
3527
3528        {
3529            let mut root_obj = builder.new_object();
3530            root_obj.insert("metadata", "original");
3531
3532            {
3533                let mut users_list = root_obj.new_list("users");
3534
3535                // User 1
3536                {
3537                    let mut user1 = users_list.new_object();
3538                    user1.insert("id", 1i32);
3539                    user1.insert("name", "Alice");
3540                    user1.insert("active", true);
3541                    user1.finish();
3542                }
3543
3544                // User 2
3545                {
3546                    let mut user2 = users_list.new_object();
3547                    user2.insert("id", 2i32);
3548                    user2.insert("name", "Bob");
3549                    user2.insert("active", false);
3550                    user2.finish();
3551                }
3552
3553                // User 3
3554                {
3555                    let mut user3 = users_list.new_object();
3556                    user3.insert("id", 3i32);
3557                    user3.insert("name", "Charlie");
3558                    user3.insert("active", true);
3559                    user3.finish();
3560                }
3561
3562                users_list.finish();
3563            }
3564
3565            root_obj.insert("total_count", 3i32);
3566            root_obj.finish();
3567        }
3568        let (metadata1, value1) = builder.finish();
3569        let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3570        let original_obj = original_variant.as_object().unwrap();
3571        let original_users = original_obj.get("users").unwrap();
3572        let original_users = original_users.as_list().unwrap();
3573
3574        // Create filtered/modified version: only copy active users and inject new data
3575        let metadata2 = VariantMetadata::new(&metadata1);
3576        let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
3577        let mut builder2 = ValueBuilder::new();
3578        let state = ParentState::variant(&mut builder2, &mut metadata2);
3579        {
3580            let mut root_obj = ObjectBuilder::new(state, true);
3581
3582            // Copy metadata using bytes API
3583            root_obj.insert_bytes("metadata", original_obj.get("metadata").unwrap());
3584
3585            // Add processing timestamp
3586            root_obj.insert("processed_at", "2024-01-01T00:00:00Z");
3587
3588            {
3589                let mut filtered_users = root_obj.new_list("active_users");
3590
3591                // Copy only active users and inject additional data
3592                for i in 0..original_users.len() {
3593                    let user = original_users.get(i).unwrap();
3594                    let user = user.as_object().unwrap();
3595                    if user.get("active").unwrap().as_boolean().unwrap() {
3596                        {
3597                            let mut new_user = filtered_users.new_object();
3598
3599                            // Copy existing fields using bytes API
3600                            new_user.insert_bytes("id", user.get("id").unwrap());
3601                            new_user.insert_bytes("name", user.get("name").unwrap());
3602
3603                            // Inject new computed field
3604                            let user_id = user.get("id").unwrap().as_int32().unwrap();
3605                            new_user.insert("computed_score", user_id * 10);
3606
3607                            // Add status transformation (don't copy the 'active' field)
3608                            new_user.insert("status", "verified");
3609
3610                            new_user.finish();
3611                        }
3612                    }
3613                }
3614
3615                // Inject a completely new user
3616                {
3617                    let mut new_user = filtered_users.new_object();
3618                    new_user.insert("id", 999i32);
3619                    new_user.insert("name", "System User");
3620                    new_user.insert("computed_score", 0i32);
3621                    new_user.insert("status", "system");
3622                    new_user.finish();
3623                }
3624
3625                filtered_users.finish();
3626            }
3627
3628            // Update count
3629            root_obj.insert("active_count", 3i32); // 2 active + 1 new
3630
3631            root_obj.finish();
3632        }
3633        let value2 = builder2.into_inner();
3634        let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3635        let result_obj = result_variant.as_object().unwrap();
3636
3637        // Verify the filtered/modified structure
3638        assert_eq!(
3639            result_obj.get("metadata").unwrap().as_string().unwrap(),
3640            "original"
3641        );
3642        assert_eq!(
3643            result_obj.get("processed_at").unwrap().as_string().unwrap(),
3644            "2024-01-01T00:00:00Z"
3645        );
3646        assert_eq!(
3647            result_obj.get("active_count").unwrap().as_int32().unwrap(),
3648            3
3649        );
3650
3651        let active_users = result_obj.get("active_users").unwrap();
3652        let active_users = active_users.as_list().unwrap();
3653        assert_eq!(active_users.len(), 3);
3654
3655        // Verify Alice (id=1, was active)
3656        let alice = active_users.get(0).unwrap();
3657        let alice = alice.as_object().unwrap();
3658        assert_eq!(alice.get("id").unwrap().as_int32().unwrap(), 1);
3659        assert_eq!(alice.get("name").unwrap().as_string().unwrap(), "Alice");
3660        assert_eq!(alice.get("computed_score").unwrap().as_int32().unwrap(), 10);
3661        assert_eq!(
3662            alice.get("status").unwrap().as_string().unwrap(),
3663            "verified"
3664        );
3665        assert!(alice.get("active").is_none()); // This field was not copied
3666
3667        // Verify Charlie (id=3, was active) - Bob (id=2) was not active so not included
3668        let charlie = active_users.get(1).unwrap();
3669        let charlie = charlie.as_object().unwrap();
3670        assert_eq!(charlie.get("id").unwrap().as_int32().unwrap(), 3);
3671        assert_eq!(charlie.get("name").unwrap().as_string().unwrap(), "Charlie");
3672        assert_eq!(
3673            charlie.get("computed_score").unwrap().as_int32().unwrap(),
3674            30
3675        );
3676        assert_eq!(
3677            charlie.get("status").unwrap().as_string().unwrap(),
3678            "verified"
3679        );
3680
3681        // Verify injected system user
3682        let system_user = active_users.get(2).unwrap();
3683        let system_user = system_user.as_object().unwrap();
3684        assert_eq!(system_user.get("id").unwrap().as_int32().unwrap(), 999);
3685        assert_eq!(
3686            system_user.get("name").unwrap().as_string().unwrap(),
3687            "System User"
3688        );
3689        assert_eq!(
3690            system_user
3691                .get("computed_score")
3692                .unwrap()
3693                .as_int32()
3694                .unwrap(),
3695            0
3696        );
3697        assert_eq!(
3698            system_user.get("status").unwrap().as_string().unwrap(),
3699            "system"
3700        );
3701    }
3702}