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 indexmap::{IndexMap, IndexSet};
24use std::collections::HashSet;
25
26const BASIC_TYPE_BITS: u8 = 2;
27const UNIX_EPOCH_DATE: chrono::NaiveDate = chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
28
29fn primitive_header(primitive_type: VariantPrimitiveType) -> u8 {
30    (primitive_type as u8) << 2 | VariantBasicType::Primitive as u8
31}
32
33fn short_string_header(len: usize) -> u8 {
34    (len as u8) << 2 | VariantBasicType::ShortString as u8
35}
36
37fn array_header(large: bool, offset_size: u8) -> u8 {
38    let large_bit = if large { 1 } else { 0 };
39    (large_bit << (BASIC_TYPE_BITS + 2))
40        | ((offset_size - 1) << BASIC_TYPE_BITS)
41        | VariantBasicType::Array as u8
42}
43
44fn object_header(large: bool, id_size: u8, offset_size: u8) -> u8 {
45    let large_bit = if large { 1 } else { 0 };
46    (large_bit << (BASIC_TYPE_BITS + 4))
47        | ((id_size - 1) << (BASIC_TYPE_BITS + 2))
48        | ((offset_size - 1) << BASIC_TYPE_BITS)
49        | VariantBasicType::Object as u8
50}
51
52fn int_size(v: usize) -> u8 {
53    match v {
54        0..=0xFF => 1,
55        0x100..=0xFFFF => 2,
56        0x10000..=0xFFFFFF => 3,
57        _ => 4,
58    }
59}
60
61/// Write little-endian integer to buffer
62fn write_offset(buf: &mut Vec<u8>, value: usize, nbytes: u8) {
63    let bytes = value.to_le_bytes();
64    buf.extend_from_slice(&bytes[..nbytes as usize]);
65}
66
67/// Write little-endian integer to buffer at a specific position
68fn write_offset_at_pos(buf: &mut [u8], start_pos: usize, value: usize, nbytes: u8) {
69    let bytes = value.to_le_bytes();
70    buf[start_pos..start_pos + nbytes as usize].copy_from_slice(&bytes[..nbytes as usize]);
71}
72
73/// Append `value_size` bytes of given `value` into `dest`.
74fn append_packed_u32(dest: &mut Vec<u8>, value: u32, value_size: usize) {
75    let n = dest.len() + value_size;
76    dest.extend(value.to_le_bytes());
77    dest.truncate(n);
78}
79
80/// Wrapper around a `Vec<u8>` that provides methods for appending
81/// primitive values, variant types, and metadata.
82///
83/// This is used internally by the builders to construct the
84/// the `value` field for [`Variant`] values.
85///
86/// You can reuse an existing `Vec<u8>` by using the `from` impl
87#[derive(Debug, Default)]
88struct ValueBuffer(Vec<u8>);
89
90impl ValueBuffer {
91    /// Construct a ValueBuffer that will write to a new underlying `Vec`
92    fn new() -> Self {
93        Default::default()
94    }
95}
96
97impl From<Vec<u8>> for ValueBuffer {
98    fn from(value: Vec<u8>) -> Self {
99        Self(value)
100    }
101}
102
103impl From<ValueBuffer> for Vec<u8> {
104    fn from(value_buffer: ValueBuffer) -> Self {
105        value_buffer.0
106    }
107}
108
109impl ValueBuffer {
110    fn append_u8(&mut self, term: u8) {
111        self.0.push(term);
112    }
113
114    fn append_slice(&mut self, other: &[u8]) {
115        self.0.extend_from_slice(other);
116    }
117
118    fn append_primitive_header(&mut self, primitive_type: VariantPrimitiveType) {
119        self.0.push(primitive_header(primitive_type));
120    }
121
122    fn into_inner(self) -> Vec<u8> {
123        self.into()
124    }
125
126    fn inner_mut(&mut self) -> &mut Vec<u8> {
127        &mut self.0
128    }
129
130    // Variant types below
131
132    fn append_null(&mut self) {
133        self.append_primitive_header(VariantPrimitiveType::Null);
134    }
135
136    fn append_bool(&mut self, value: bool) {
137        let primitive_type = if value {
138            VariantPrimitiveType::BooleanTrue
139        } else {
140            VariantPrimitiveType::BooleanFalse
141        };
142        self.append_primitive_header(primitive_type);
143    }
144
145    fn append_int8(&mut self, value: i8) {
146        self.append_primitive_header(VariantPrimitiveType::Int8);
147        self.append_u8(value as u8);
148    }
149
150    fn append_int16(&mut self, value: i16) {
151        self.append_primitive_header(VariantPrimitiveType::Int16);
152        self.append_slice(&value.to_le_bytes());
153    }
154
155    fn append_int32(&mut self, value: i32) {
156        self.append_primitive_header(VariantPrimitiveType::Int32);
157        self.append_slice(&value.to_le_bytes());
158    }
159
160    fn append_int64(&mut self, value: i64) {
161        self.append_primitive_header(VariantPrimitiveType::Int64);
162        self.append_slice(&value.to_le_bytes());
163    }
164
165    fn append_float(&mut self, value: f32) {
166        self.append_primitive_header(VariantPrimitiveType::Float);
167        self.append_slice(&value.to_le_bytes());
168    }
169
170    fn append_double(&mut self, value: f64) {
171        self.append_primitive_header(VariantPrimitiveType::Double);
172        self.append_slice(&value.to_le_bytes());
173    }
174
175    fn append_date(&mut self, value: chrono::NaiveDate) {
176        self.append_primitive_header(VariantPrimitiveType::Date);
177        let days_since_epoch = value.signed_duration_since(UNIX_EPOCH_DATE).num_days() as i32;
178        self.append_slice(&days_since_epoch.to_le_bytes());
179    }
180
181    fn append_timestamp_micros(&mut self, value: chrono::DateTime<chrono::Utc>) {
182        self.append_primitive_header(VariantPrimitiveType::TimestampMicros);
183        let micros = value.timestamp_micros();
184        self.append_slice(&micros.to_le_bytes());
185    }
186
187    fn append_timestamp_ntz_micros(&mut self, value: chrono::NaiveDateTime) {
188        self.append_primitive_header(VariantPrimitiveType::TimestampNtzMicros);
189        let micros = value.and_utc().timestamp_micros();
190        self.append_slice(&micros.to_le_bytes());
191    }
192
193    fn append_decimal4(&mut self, decimal4: VariantDecimal4) {
194        self.append_primitive_header(VariantPrimitiveType::Decimal4);
195        self.append_u8(decimal4.scale());
196        self.append_slice(&decimal4.integer().to_le_bytes());
197    }
198
199    fn append_decimal8(&mut self, decimal8: VariantDecimal8) {
200        self.append_primitive_header(VariantPrimitiveType::Decimal8);
201        self.append_u8(decimal8.scale());
202        self.append_slice(&decimal8.integer().to_le_bytes());
203    }
204
205    fn append_decimal16(&mut self, decimal16: VariantDecimal16) {
206        self.append_primitive_header(VariantPrimitiveType::Decimal16);
207        self.append_u8(decimal16.scale());
208        self.append_slice(&decimal16.integer().to_le_bytes());
209    }
210
211    fn append_binary(&mut self, value: &[u8]) {
212        self.append_primitive_header(VariantPrimitiveType::Binary);
213        self.append_slice(&(value.len() as u32).to_le_bytes());
214        self.append_slice(value);
215    }
216
217    fn append_short_string(&mut self, value: ShortString) {
218        let inner = value.0;
219        self.append_u8(short_string_header(inner.len()));
220        self.append_slice(inner.as_bytes());
221    }
222
223    fn append_string(&mut self, value: &str) {
224        self.append_primitive_header(VariantPrimitiveType::String);
225        self.append_slice(&(value.len() as u32).to_le_bytes());
226        self.append_slice(value.as_bytes());
227    }
228
229    fn append_object(&mut self, metadata_builder: &mut MetadataBuilder, obj: VariantObject) {
230        let mut object_builder = self.new_object(metadata_builder);
231
232        for (field_name, value) in obj.iter() {
233            object_builder.insert(field_name, value);
234        }
235
236        object_builder.finish().unwrap();
237    }
238
239    fn try_append_object(
240        &mut self,
241        metadata_builder: &mut MetadataBuilder,
242        obj: VariantObject,
243    ) -> Result<(), ArrowError> {
244        let mut object_builder = self.new_object(metadata_builder);
245
246        for res in obj.iter_try() {
247            let (field_name, value) = res?;
248            object_builder.try_insert(field_name, value)?;
249        }
250
251        object_builder.finish()?;
252
253        Ok(())
254    }
255
256    fn append_list(&mut self, metadata_builder: &mut MetadataBuilder, list: VariantList) {
257        let mut list_builder = self.new_list(metadata_builder);
258        for value in list.iter() {
259            list_builder.append_value(value);
260        }
261        list_builder.finish();
262    }
263
264    fn try_append_list(
265        &mut self,
266        metadata_builder: &mut MetadataBuilder,
267        list: VariantList,
268    ) -> Result<(), ArrowError> {
269        let mut list_builder = self.new_list(metadata_builder);
270        for res in list.iter_try() {
271            let value = res?;
272            list_builder.try_append_value(value)?;
273        }
274
275        list_builder.finish();
276
277        Ok(())
278    }
279
280    fn offset(&self) -> usize {
281        self.0.len()
282    }
283
284    fn new_object<'a>(
285        &'a mut self,
286        metadata_builder: &'a mut MetadataBuilder,
287    ) -> ObjectBuilder<'a> {
288        let parent_state = ParentState::Variant {
289            buffer: self,
290            metadata_builder,
291        };
292        let validate_unique_fields = false;
293        ObjectBuilder::new(parent_state, validate_unique_fields)
294    }
295
296    fn new_list<'a>(&'a mut self, metadata_builder: &'a mut MetadataBuilder) -> ListBuilder<'a> {
297        let parent_state = ParentState::Variant {
298            buffer: self,
299            metadata_builder,
300        };
301        let validate_unique_fields = false;
302        ListBuilder::new(parent_state, validate_unique_fields)
303    }
304
305    /// Appends a variant to the buffer.
306    ///
307    /// # Panics
308    ///
309    /// This method will panic if the variant contains duplicate field names in objects
310    /// when validation is enabled. For a fallible version, use [`ValueBuffer::try_append_variant`]
311    fn append_variant<'m, 'd>(
312        &mut self,
313        variant: Variant<'m, 'd>,
314        metadata_builder: &mut MetadataBuilder,
315    ) {
316        match variant {
317            Variant::Null => self.append_null(),
318            Variant::BooleanTrue => self.append_bool(true),
319            Variant::BooleanFalse => self.append_bool(false),
320            Variant::Int8(v) => self.append_int8(v),
321            Variant::Int16(v) => self.append_int16(v),
322            Variant::Int32(v) => self.append_int32(v),
323            Variant::Int64(v) => self.append_int64(v),
324            Variant::Date(v) => self.append_date(v),
325            Variant::TimestampMicros(v) => self.append_timestamp_micros(v),
326            Variant::TimestampNtzMicros(v) => self.append_timestamp_ntz_micros(v),
327            Variant::Decimal4(decimal4) => self.append_decimal4(decimal4),
328            Variant::Decimal8(decimal8) => self.append_decimal8(decimal8),
329            Variant::Decimal16(decimal16) => self.append_decimal16(decimal16),
330            Variant::Float(v) => self.append_float(v),
331            Variant::Double(v) => self.append_double(v),
332            Variant::Binary(v) => self.append_binary(v),
333            Variant::String(s) => self.append_string(s),
334            Variant::ShortString(s) => self.append_short_string(s),
335            Variant::Object(obj) => self.append_object(metadata_builder, obj),
336            Variant::List(list) => self.append_list(metadata_builder, list),
337        }
338    }
339
340    /// Appends a variant to the buffer
341    fn try_append_variant<'m, 'd>(
342        &mut self,
343        variant: Variant<'m, 'd>,
344        metadata_builder: &mut MetadataBuilder,
345    ) -> Result<(), ArrowError> {
346        match variant {
347            Variant::Null => self.append_null(),
348            Variant::BooleanTrue => self.append_bool(true),
349            Variant::BooleanFalse => self.append_bool(false),
350            Variant::Int8(v) => self.append_int8(v),
351            Variant::Int16(v) => self.append_int16(v),
352            Variant::Int32(v) => self.append_int32(v),
353            Variant::Int64(v) => self.append_int64(v),
354            Variant::Date(v) => self.append_date(v),
355            Variant::TimestampMicros(v) => self.append_timestamp_micros(v),
356            Variant::TimestampNtzMicros(v) => self.append_timestamp_ntz_micros(v),
357            Variant::Decimal4(decimal4) => self.append_decimal4(decimal4),
358            Variant::Decimal8(decimal8) => self.append_decimal8(decimal8),
359            Variant::Decimal16(decimal16) => self.append_decimal16(decimal16),
360            Variant::Float(v) => self.append_float(v),
361            Variant::Double(v) => self.append_double(v),
362            Variant::Binary(v) => self.append_binary(v),
363            Variant::String(s) => self.append_string(s),
364            Variant::ShortString(s) => self.append_short_string(s),
365            Variant::Object(obj) => self.try_append_object(metadata_builder, obj)?,
366            Variant::List(list) => self.try_append_list(metadata_builder, list)?,
367        }
368
369        Ok(())
370    }
371
372    /// Writes out the header byte for a variant object or list, from the starting position
373    /// of the buffer, will return the position after this write
374    fn append_header_start_from_buf_pos(
375        &mut self,
376        start_pos: usize, // the start position where the header will be inserted
377        header_byte: u8,
378        is_large: bool,
379        num_fields: usize,
380    ) -> usize {
381        let buffer = self.inner_mut();
382
383        // Write header at the original start position
384        let mut header_pos = start_pos;
385
386        // Write header byte
387        buffer[header_pos] = header_byte;
388        header_pos += 1;
389
390        // Write number of fields
391        if is_large {
392            buffer[header_pos..header_pos + 4].copy_from_slice(&(num_fields as u32).to_le_bytes());
393            header_pos += 4;
394        } else {
395            buffer[header_pos] = num_fields as u8;
396            header_pos += 1;
397        }
398
399        header_pos
400    }
401
402    /// Writes out the offsets for an array of offsets, including the final offset (data size).
403    /// from the starting position of the buffer, will return the position after this write
404    fn append_offset_array_start_from_buf_pos(
405        &mut self,
406        start_pos: usize,
407        offsets: impl IntoIterator<Item = usize>,
408        data_size: Option<usize>,
409        nbytes: u8,
410    ) -> usize {
411        let buf = self.inner_mut();
412
413        let mut current_pos = start_pos;
414        for relative_offset in offsets {
415            write_offset_at_pos(buf, current_pos, relative_offset, nbytes);
416            current_pos += nbytes as usize;
417        }
418
419        // Write data_size
420        if let Some(data_size) = data_size {
421            // Write data_size at the end of the offsets
422            write_offset_at_pos(buf, current_pos, data_size, nbytes);
423            current_pos += nbytes as usize;
424        }
425
426        current_pos
427    }
428}
429
430/// Builder for constructing metadata for [`Variant`] values.
431///
432/// This is used internally by the [`VariantBuilder`] to construct the metadata
433///
434/// You can use an existing `Vec<u8>` as the metadata buffer by using the `from` impl.
435#[derive(Default, Debug)]
436struct MetadataBuilder {
437    // Field names -- field_ids are assigned in insert order
438    field_names: IndexSet<String>,
439
440    // flag that checks if field names by insertion order are also lexicographically sorted
441    is_sorted: bool,
442
443    /// Output buffer. Metadata is written to the end of this buffer
444    metadata_buffer: Vec<u8>,
445}
446
447/// Create a new MetadataBuilder that will write to the specified metadata buffer
448impl From<Vec<u8>> for MetadataBuilder {
449    fn from(metadata_buffer: Vec<u8>) -> Self {
450        Self {
451            metadata_buffer,
452            ..Default::default()
453        }
454    }
455}
456
457impl MetadataBuilder {
458    /// Upsert field name to dictionary, return its ID
459    fn upsert_field_name(&mut self, field_name: &str) -> u32 {
460        let (id, new_entry) = self.field_names.insert_full(field_name.to_string());
461
462        if new_entry {
463            let n = self.num_field_names();
464
465            // Dictionary sort order tracking:
466            // - An empty dictionary is unsorted (ambiguous in spec but required by interop tests)
467            // - A single-entry dictionary is trivially sorted
468            // - Otherwise, an already-sorted dictionary becomes unsorted if the new entry breaks order
469            self.is_sorted =
470                n == 1 || self.is_sorted && (self.field_names[n - 2] < self.field_names[n - 1]);
471        }
472
473        id as u32
474    }
475
476    /// Returns the number of field names stored in the metadata builder.
477    /// Note: this method should be the only place to call `self.field_names.len()`
478    ///
479    /// # Panics
480    ///
481    /// If the number of field names exceeds the maximum allowed value for `u32`.
482    fn num_field_names(&self) -> usize {
483        let n = self.field_names.len();
484        assert!(n <= u32::MAX as usize);
485
486        n
487    }
488
489    fn field_name(&self, i: usize) -> &str {
490        &self.field_names[i]
491    }
492
493    fn metadata_size(&self) -> usize {
494        self.field_names.iter().map(|k| k.len()).sum()
495    }
496
497    fn finish(self) -> Vec<u8> {
498        let nkeys = self.num_field_names();
499
500        // Calculate metadata size
501        let total_dict_size: usize = self.metadata_size();
502
503        let Self {
504            field_names,
505            is_sorted,
506            mut metadata_buffer,
507        } = self;
508
509        // Determine appropriate offset size based on the larger of dict size or total string size
510        let max_offset = std::cmp::max(total_dict_size, nkeys);
511        let offset_size = int_size(max_offset);
512
513        let offset_start = 1 + offset_size as usize;
514        let string_start = offset_start + (nkeys + 1) * offset_size as usize;
515        let metadata_size = string_start + total_dict_size;
516
517        metadata_buffer.reserve(metadata_size);
518
519        // Write header: version=1, field names are sorted, with calculated offset_size
520        metadata_buffer.push(0x01 | (is_sorted as u8) << 4 | ((offset_size - 1) << 6));
521
522        // Write dictionary size
523        write_offset(&mut metadata_buffer, nkeys, offset_size);
524
525        // Write offsets
526        let mut cur_offset = 0;
527        for key in field_names.iter() {
528            write_offset(&mut metadata_buffer, cur_offset, offset_size);
529            cur_offset += key.len();
530        }
531        // Write final offset
532        write_offset(&mut metadata_buffer, cur_offset, offset_size);
533
534        // Write string data
535        for key in field_names {
536            metadata_buffer.extend_from_slice(key.as_bytes());
537        }
538
539        metadata_buffer
540    }
541
542    /// Return the inner buffer, without finalizing any in progress metadata.
543    pub(crate) fn take_buffer(self) -> Vec<u8> {
544        self.metadata_buffer
545    }
546}
547
548impl<S: AsRef<str>> FromIterator<S> for MetadataBuilder {
549    fn from_iter<T: IntoIterator<Item = S>>(iter: T) -> Self {
550        let mut this = Self::default();
551        this.extend(iter);
552
553        this
554    }
555}
556
557impl<S: AsRef<str>> Extend<S> for MetadataBuilder {
558    fn extend<T: IntoIterator<Item = S>>(&mut self, iter: T) {
559        let iter = iter.into_iter();
560        let (min, _) = iter.size_hint();
561
562        self.field_names.reserve(min);
563
564        for field_name in iter {
565            self.upsert_field_name(field_name.as_ref());
566        }
567    }
568}
569
570/// Tracks information needed to correctly finalize a nested builder, for each parent builder type.
571///
572/// A child builder has no effect on its parent unless/until its `finalize` method is called, at
573/// which point the child appends the new value to the parent. As a (desirable) side effect,
574/// creating a parent state instance captures mutable references to a subset of the parent's fields,
575/// rendering the parent object completely unusable until the parent state goes out of scope. This
576/// ensures that at most one child builder can exist at a time.
577///
578/// The redundancy in buffer and metadata_builder is because all the references come from the
579/// parent, and we cannot "split" a mutable reference across two objects (parent state and the child
580/// builder that uses it). So everything has to be here. Rust layout optimizations should treat the
581/// variants as a union, so that accessing a `buffer` or `metadata_builder` is branch-free.
582enum ParentState<'a> {
583    Variant {
584        buffer: &'a mut ValueBuffer,
585        metadata_builder: &'a mut MetadataBuilder,
586    },
587    List {
588        buffer: &'a mut ValueBuffer,
589        metadata_builder: &'a mut MetadataBuilder,
590        parent_value_offset_base: usize,
591        offsets: &'a mut Vec<usize>,
592    },
593    Object {
594        buffer: &'a mut ValueBuffer,
595        metadata_builder: &'a mut MetadataBuilder,
596        fields: &'a mut IndexMap<u32, usize>,
597        field_name: &'a str,
598        parent_value_offset_base: usize,
599    },
600}
601
602impl ParentState<'_> {
603    fn buffer(&mut self) -> &mut ValueBuffer {
604        match self {
605            ParentState::Variant { buffer, .. } => buffer,
606            ParentState::List { buffer, .. } => buffer,
607            ParentState::Object { buffer, .. } => buffer,
608        }
609    }
610
611    fn metadata_builder(&mut self) -> &mut MetadataBuilder {
612        match self {
613            ParentState::Variant {
614                metadata_builder, ..
615            } => metadata_builder,
616            ParentState::List {
617                metadata_builder, ..
618            } => metadata_builder,
619            ParentState::Object {
620                metadata_builder, ..
621            } => metadata_builder,
622        }
623    }
624
625    // Performs any parent-specific aspects of finishing, after the child has appended all necessary
626    // bytes to the parent's value buffer. ListBuilder records the new value's starting offset;
627    // ObjectBuilder associates the new value's starting offset with its field id; VariantBuilder
628    // doesn't need anything special.
629    fn finish(&mut self, starting_offset: usize) {
630        match self {
631            ParentState::Variant { .. } => (),
632            ParentState::List {
633                offsets,
634                parent_value_offset_base,
635                ..
636            } => offsets.push(starting_offset - *parent_value_offset_base),
637            ParentState::Object {
638                metadata_builder,
639                fields,
640                field_name,
641                parent_value_offset_base,
642                ..
643            } => {
644                let field_id = metadata_builder.upsert_field_name(field_name);
645                let shifted_start_offset = starting_offset - *parent_value_offset_base;
646                fields.insert(field_id, shifted_start_offset);
647            }
648        }
649    }
650
651    /// Return mutable references to the buffer and metadata builder that this
652    /// parent state is using.
653    fn buffer_and_metadata_builder(&mut self) -> (&mut ValueBuffer, &mut MetadataBuilder) {
654        match self {
655            ParentState::Variant {
656                buffer,
657                metadata_builder,
658            }
659            | ParentState::List {
660                buffer,
661                metadata_builder,
662                ..
663            }
664            | ParentState::Object {
665                buffer,
666                metadata_builder,
667                ..
668            } => (buffer, metadata_builder),
669        }
670    }
671
672    // Return the offset of the underlying buffer at the time of calling this method.
673    fn buffer_current_offset(&self) -> usize {
674        match self {
675            ParentState::Variant { buffer, .. }
676            | ParentState::Object { buffer, .. }
677            | ParentState::List { buffer, .. } => buffer.offset(),
678        }
679    }
680
681    // Return the current index of the undelying metadata buffer at the time of calling this method.
682    fn metadata_current_offset(&self) -> usize {
683        match self {
684            ParentState::Variant {
685                metadata_builder, ..
686            }
687            | ParentState::Object {
688                metadata_builder, ..
689            }
690            | ParentState::List {
691                metadata_builder, ..
692            } => metadata_builder.metadata_buffer.len(),
693        }
694    }
695}
696
697/// Top level builder for [`Variant`] values
698///
699/// # Example: create a Primitive Int8
700/// ```
701/// # use parquet_variant::{Variant, VariantBuilder};
702/// let mut builder = VariantBuilder::new();
703/// builder.append_value(Variant::Int8(42));
704/// // Finish the builder to get the metadata and value
705/// let (metadata, value) = builder.finish();
706/// // use the Variant API to verify the result
707/// let variant = Variant::try_new(&metadata, &value).unwrap();
708/// assert_eq!(variant, Variant::Int8(42));
709/// ```
710///
711/// # Example: Create a [`Variant::Object`]
712///
713/// This example shows how to create an object with two fields:
714/// ```json
715/// {
716///  "first_name": "Jiaying",
717///  "last_name": "Li"
718/// }
719/// ```
720///
721/// ```
722/// # use parquet_variant::{Variant, VariantBuilder};
723/// let mut builder = VariantBuilder::new();
724/// // Create an object builder that will write fields to the object
725/// let mut object_builder = builder.new_object();
726/// object_builder.insert("first_name", "Jiaying");
727/// object_builder.insert("last_name", "Li");
728/// object_builder.finish(); // call finish to finalize the object
729/// // Finish the builder to get the metadata and value
730/// let (metadata, value) = builder.finish();
731/// // use the Variant API to verify the result
732/// let variant = Variant::try_new(&metadata, &value).unwrap();
733/// let variant_object = variant.as_object().unwrap();
734/// assert_eq!(
735///   variant_object.get("first_name"),
736///   Some(Variant::from("Jiaying"))
737/// );
738/// assert_eq!(
739///   variant_object.get("last_name"),
740///   Some(Variant::from("Li"))
741/// );
742/// ```
743///
744///
745/// You can also use the [`ObjectBuilder::with_field`] to add fields to the
746/// object
747/// ```
748/// # use parquet_variant::{Variant, VariantBuilder};
749/// // build the same object as above
750/// let mut builder = VariantBuilder::new();
751/// builder.new_object()
752///   .with_field("first_name", "Jiaying")
753///   .with_field("last_name", "Li")
754///   .finish();
755/// let (metadata, value) = builder.finish();
756/// let variant = Variant::try_new(&metadata, &value).unwrap();
757/// let variant_object = variant.as_object().unwrap();
758/// assert_eq!(
759///   variant_object.get("first_name"),
760///   Some(Variant::from("Jiaying"))
761/// );
762/// assert_eq!(
763///   variant_object.get("last_name"),
764///   Some(Variant::from("Li"))
765/// );
766/// ```
767/// # Example: Create a [`Variant::List`] (an Array)
768///
769/// This example shows how to create an array of integers: `[1, 2, 3]`.
770/// ```
771///  # use parquet_variant::{Variant, VariantBuilder};
772///  let mut builder = VariantBuilder::new();
773///  // Create a builder that will write elements to the list
774///  let mut list_builder = builder.new_list();
775///  list_builder.append_value(1i8);
776///  list_builder.append_value(2i8);
777///  list_builder.append_value(3i8);
778/// // call finish to finalize the list
779///  list_builder.finish();
780/// // Finish the builder to get the metadata and value
781/// let (metadata, value) = builder.finish();
782/// // use the Variant API to verify the result
783/// let variant = Variant::try_new(&metadata, &value).unwrap();
784/// let variant_list = variant.as_list().unwrap();
785/// // Verify the list contents
786/// assert_eq!(variant_list.get(0).unwrap(), Variant::Int8(1));
787/// assert_eq!(variant_list.get(1).unwrap(), Variant::Int8(2));
788/// assert_eq!(variant_list.get(2).unwrap(), Variant::Int8(3));
789/// ```
790///
791/// You can also use the [`ListBuilder::with_value`] to append values to the
792/// list.
793/// ```
794///  # use parquet_variant::{Variant, VariantBuilder};
795///  let mut builder = VariantBuilder::new();
796///  builder.new_list()
797///      .with_value(1i8)
798///      .with_value(2i8)
799///      .with_value(3i8)
800///      .finish();
801/// let (metadata, value) = builder.finish();
802/// let variant = Variant::try_new(&metadata, &value).unwrap();
803/// let variant_list = variant.as_list().unwrap();
804/// assert_eq!(variant_list.get(0).unwrap(), Variant::Int8(1));
805/// assert_eq!(variant_list.get(1).unwrap(), Variant::Int8(2));
806/// assert_eq!(variant_list.get(2).unwrap(), Variant::Int8(3));
807/// ```
808///
809/// # Example: [`Variant::List`] of  [`Variant::Object`]s
810///
811/// This example shows how to create an list of objects:
812/// ```json
813/// [
814///   {
815///      "id": 1,
816///      "type": "Cauliflower"
817///   },
818///   {
819///      "id": 2,
820///      "type": "Beets"
821///   }
822/// ]
823/// ```
824/// ```
825/// use parquet_variant::{Variant, VariantBuilder};
826/// let mut builder = VariantBuilder::new();
827///
828/// // Create a builder that will write elements to the list
829/// let mut list_builder = builder.new_list();
830///
831/// {
832///     let mut object_builder = list_builder.new_object();
833///     object_builder.insert("id", 1);
834///     object_builder.insert("type", "Cauliflower");
835///     object_builder.finish();
836/// }
837///
838/// {
839///     let mut object_builder = list_builder.new_object();
840///     object_builder.insert("id", 2);
841///     object_builder.insert("type", "Beets");
842///     object_builder.finish();
843/// }
844///
845/// list_builder.finish();
846/// // Finish the builder to get the metadata and value
847/// let (metadata, value) = builder.finish();
848/// // use the Variant API to verify the result
849/// let variant = Variant::try_new(&metadata, &value).unwrap();
850/// let variant_list = variant.as_list().unwrap();
851///
852///
853/// let obj1_variant = variant_list.get(0).unwrap();
854/// let obj1 = obj1_variant.as_object().unwrap();
855/// assert_eq!(
856///     obj1.get("id"),
857///     Some(Variant::from(1))
858/// );
859/// assert_eq!(
860///     obj1.get("type"),
861///     Some(Variant::from("Cauliflower"))
862/// );
863///
864/// let obj2_variant = variant_list.get(1).unwrap();
865/// let obj2 = obj2_variant.as_object().unwrap();
866///
867/// assert_eq!(
868///     obj2.get("id"),
869///     Some(Variant::from(2))
870/// );
871/// assert_eq!(
872///     obj2.get("type"),
873///     Some(Variant::from("Beets"))
874/// );
875///
876/// ```
877/// # Example: Reusing Buffers
878///
879/// You can use the [`VariantBuilder`] to write into existing buffers (for
880/// example to write multiple variants back to back in the same buffer)
881///
882/// ```
883/// // we will write two variants back to back
884/// use parquet_variant::{Variant, VariantBuilder};
885/// // Append 12345
886/// let mut builder = VariantBuilder::new();
887/// builder.append_value(12345);
888/// let (metadata, value) = builder.finish();
889/// // remember where the first variant ends
890/// let (first_meta_offset, first_meta_len) = (0, metadata.len());
891/// let (first_value_offset, first_value_len) = (0, value.len());
892///
893/// // now, append a second variant to the same buffers
894/// let mut builder = VariantBuilder::new_with_buffers(metadata, value);
895/// builder.append_value("Foo");
896/// let (metadata, value) = builder.finish();
897///
898/// // The variants can be referenced in their appropriate location
899/// let variant1 = Variant::new(
900///   &metadata[first_meta_offset..first_meta_len],
901///   &value[first_value_offset..first_value_len]
902///  );
903/// assert_eq!(variant1, Variant::Int32(12345));
904///
905/// let variant2 = Variant::new(
906///   &metadata[first_meta_len..],
907///   &value[first_value_len..]
908///  );
909/// assert_eq!(variant2, Variant::from("Foo"));
910/// ```
911///
912/// # Example: Unique Field Validation
913///
914/// This example shows how enabling unique field validation will cause an error
915/// if the same field is inserted more than once.
916/// ```
917/// use parquet_variant::VariantBuilder;
918///
919/// let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
920/// let mut obj = builder.new_object();
921///
922/// obj.insert("a", 1);
923/// obj.insert("a", 2); // duplicate field
924///
925/// // When validation is enabled, finish will return an error
926/// let result = obj.finish(); // returns Err
927/// assert!(result.is_err());
928/// ```
929///
930/// # Example: Sorted dictionaries
931///
932/// This example shows how to create a [`VariantBuilder`] with a pre-sorted field dictionary
933/// to improve field access performance when reading [`Variant`] objects.
934///
935/// You can use [`VariantBuilder::with_field_names`] to add multiple field names at once:
936/// ```
937/// use parquet_variant::{Variant, VariantBuilder};
938/// let mut builder = VariantBuilder::new()
939///     .with_field_names(["age", "name", "score"].into_iter());
940///
941/// let mut obj = builder.new_object();
942/// obj.insert("name", "Alice");
943/// obj.insert("age", 30);
944/// obj.insert("score", 95.5);
945/// obj.finish().unwrap();
946///
947/// let (metadata, value) = builder.finish();
948/// let variant = Variant::try_new(&metadata, &value).unwrap();
949/// ```
950///
951/// Alternatively, you can use [`VariantBuilder::add_field_name`] to add field names one by one:
952/// ```
953/// use parquet_variant::{Variant, VariantBuilder};
954/// let mut builder = VariantBuilder::new();
955/// builder.add_field_name("age"); // field id = 0
956/// builder.add_field_name("name"); // field id = 1
957/// builder.add_field_name("score"); // field id = 2
958///
959/// let mut obj = builder.new_object();
960/// obj.insert("name", "Bob"); // field id = 3
961/// obj.insert("age", 25);
962/// obj.insert("score", 88.0);
963/// obj.finish().unwrap();
964///
965/// let (metadata, value) = builder.finish();
966/// let variant = Variant::try_new(&metadata, &value).unwrap();
967/// ```
968#[derive(Default, Debug)]
969pub struct VariantBuilder {
970    buffer: ValueBuffer,
971    metadata_builder: MetadataBuilder,
972    validate_unique_fields: bool,
973}
974
975impl VariantBuilder {
976    /// Create a new VariantBuilder with new underlying buffer
977    pub fn new() -> Self {
978        Self {
979            buffer: ValueBuffer::new(),
980            metadata_builder: MetadataBuilder::default(),
981            validate_unique_fields: false,
982        }
983    }
984
985    /// Create a new VariantBuilder with pre-existing [`VariantMetadata`].
986    pub fn with_metadata(mut self, metadata: VariantMetadata) -> Self {
987        self.metadata_builder.extend(metadata.iter());
988
989        self
990    }
991
992    /// Create a new VariantBuilder that will write the metadata and values to
993    /// the specified buffers.
994    pub fn new_with_buffers(metadata_buffer: Vec<u8>, value_buffer: Vec<u8>) -> Self {
995        Self {
996            buffer: ValueBuffer::from(value_buffer),
997            metadata_builder: MetadataBuilder::from(metadata_buffer),
998            validate_unique_fields: false,
999        }
1000    }
1001
1002    /// Enables validation of unique field keys in nested objects.
1003    ///
1004    /// This setting is propagated to all [`ObjectBuilder`]s created through this [`VariantBuilder`]
1005    /// (including via any [`ListBuilder`]), and causes [`ObjectBuilder::finish()`] to return
1006    /// an error if duplicate keys were inserted.
1007    pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1008        self.validate_unique_fields = validate_unique_fields;
1009        self
1010    }
1011
1012    /// This method pre-populates the field name directory in the Variant metadata with
1013    /// the specific field names, in order.
1014    ///
1015    /// You can use this to pre-populate a [`VariantBuilder`] with a sorted dictionary if you
1016    /// know the field names beforehand. Sorted dictionaries can accelerate field access when
1017    /// reading [`Variant`]s.
1018    pub fn with_field_names<'a>(mut self, field_names: impl Iterator<Item = &'a str>) -> Self {
1019        self.metadata_builder.extend(field_names);
1020
1021        self
1022    }
1023
1024    /// This method reserves capacity for field names in the Variant metadata,
1025    /// which can improve performance when you know the approximate number of unique field
1026    /// names that will be used across all objects in the [`Variant`].
1027    pub fn reserve(&mut self, capacity: usize) {
1028        self.metadata_builder.field_names.reserve(capacity);
1029    }
1030
1031    /// Adds a single field name to the field name directory in the Variant metadata.
1032    ///
1033    /// This method does the same thing as [`VariantBuilder::with_field_names`] but adds one field name at a time.
1034    pub fn add_field_name(&mut self, field_name: &str) {
1035        self.metadata_builder.upsert_field_name(field_name);
1036    }
1037
1038    // Returns validate_unique_fields because we can no longer reference self once this method returns.
1039    fn parent_state(&mut self) -> (ParentState<'_>, bool) {
1040        let state = ParentState::Variant {
1041            buffer: &mut self.buffer,
1042            metadata_builder: &mut self.metadata_builder,
1043        };
1044        (state, self.validate_unique_fields)
1045    }
1046
1047    /// Create an [`ListBuilder`] for creating [`Variant::List`] values.
1048    ///
1049    /// See the examples on [`VariantBuilder`] for usage.
1050    pub fn new_list(&mut self) -> ListBuilder<'_> {
1051        let (parent_state, validate_unique_fields) = self.parent_state();
1052        ListBuilder::new(parent_state, validate_unique_fields)
1053    }
1054
1055    /// Create an [`ObjectBuilder`] for creating [`Variant::Object`] values.
1056    ///
1057    /// See the examples on [`VariantBuilder`] for usage.
1058    pub fn new_object(&mut self) -> ObjectBuilder<'_> {
1059        let (parent_state, validate_unique_fields) = self.parent_state();
1060        ObjectBuilder::new(parent_state, validate_unique_fields)
1061    }
1062
1063    /// Append a value to the builder.
1064    ///
1065    /// # Panics
1066    ///
1067    /// This method will panic if the variant contains duplicate field names in objects
1068    /// when validation is enabled. For a fallible version, use [`VariantBuilder::try_append_value`]
1069    ///
1070    /// # Example
1071    /// ```
1072    /// # use parquet_variant::{Variant, VariantBuilder};
1073    /// let mut builder = VariantBuilder::new();
1074    /// // most primitive types can be appended directly as they implement `Into<Variant>`
1075    /// builder.append_value(42i8);
1076    /// ```
1077    pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1078        let variant = value.into();
1079        self.buffer
1080            .append_variant(variant, &mut self.metadata_builder);
1081    }
1082
1083    /// Append a value to the builder.
1084    pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1085        &mut self,
1086        value: T,
1087    ) -> Result<(), ArrowError> {
1088        let variant = value.into();
1089        self.buffer
1090            .try_append_variant(variant, &mut self.metadata_builder)?;
1091
1092        Ok(())
1093    }
1094
1095    /// Finish the builder and return the metadata and value buffers.
1096    pub fn finish(self) -> (Vec<u8>, Vec<u8>) {
1097        (self.metadata_builder.finish(), self.buffer.into_inner())
1098    }
1099
1100    /// Return the inner metadata buffers and value buffer.
1101    ///
1102    /// This can be used to get the underlying buffers provided via
1103    /// [`VariantBuilder::new_with_buffers`] without finalizing the metadata or
1104    /// values (for rolling back changes).
1105    pub fn into_buffers(self) -> (Vec<u8>, Vec<u8>) {
1106        (
1107            self.metadata_builder.take_buffer(),
1108            self.buffer.into_inner(),
1109        )
1110    }
1111}
1112
1113/// A builder for creating [`Variant::List`] values.
1114///
1115/// See the examples on [`VariantBuilder`] for usage.
1116pub struct ListBuilder<'a> {
1117    parent_state: ParentState<'a>,
1118    offsets: Vec<usize>,
1119    /// The starting offset in the parent's buffer where this list starts
1120    parent_value_offset_base: usize,
1121    /// The starting offset in the parent's metadata buffer where this list starts
1122    /// used to truncate the written fields in `drop` if the current list has not been finished
1123    parent_metadata_offset_base: usize,
1124    /// Whether the list has been finished, the written content of the current list
1125    /// will be truncated in `drop` if `has_been_finished` is false
1126    has_been_finished: bool,
1127    validate_unique_fields: bool,
1128}
1129
1130impl<'a> ListBuilder<'a> {
1131    fn new(parent_state: ParentState<'a>, validate_unique_fields: bool) -> Self {
1132        let parent_value_offset_base = parent_state.buffer_current_offset();
1133        let parent_metadata_offset_base = parent_state.metadata_current_offset();
1134        Self {
1135            parent_state,
1136            offsets: vec![],
1137            parent_value_offset_base,
1138            has_been_finished: false,
1139            parent_metadata_offset_base,
1140            validate_unique_fields,
1141        }
1142    }
1143
1144    /// Enables unique field key validation for objects created within this list.
1145    ///
1146    /// Propagates the validation flag to any [`ObjectBuilder`]s created using
1147    /// [`ListBuilder::new_object`].
1148    pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1149        self.validate_unique_fields = validate_unique_fields;
1150        self
1151    }
1152
1153    // Returns validate_unique_fields because we can no longer reference self once this method returns.
1154    fn parent_state(&mut self) -> (ParentState<'_>, bool) {
1155        let (buffer, metadata_builder) = self.parent_state.buffer_and_metadata_builder();
1156
1157        let state = ParentState::List {
1158            buffer,
1159            metadata_builder,
1160            parent_value_offset_base: self.parent_value_offset_base,
1161            offsets: &mut self.offsets,
1162        };
1163        (state, self.validate_unique_fields)
1164    }
1165
1166    /// Returns an object builder that can be used to append a new (nested) object to this list.
1167    ///
1168    /// WARNING: The builder will have no effect unless/until [`ObjectBuilder::finish`] is called.
1169    pub fn new_object(&mut self) -> ObjectBuilder<'_> {
1170        let (parent_state, validate_unique_fields) = self.parent_state();
1171        ObjectBuilder::new(parent_state, validate_unique_fields)
1172    }
1173
1174    /// Returns a list builder that can be used to append a new (nested) list to this list.
1175    ///
1176    /// WARNING: The builder will have no effect unless/until [`ListBuilder::finish`] is called.
1177    pub fn new_list(&mut self) -> ListBuilder<'_> {
1178        let (parent_state, validate_unique_fields) = self.parent_state();
1179        ListBuilder::new(parent_state, validate_unique_fields)
1180    }
1181
1182    /// Appends a variant to the list.
1183    ///
1184    /// # Panics
1185    ///
1186    /// This method will panic if the variant contains duplicate field names in objects
1187    /// when validation is enabled. For a fallible version, use [`ListBuilder::try_append_value`].
1188    pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1189        self.try_append_value(value).unwrap();
1190    }
1191
1192    /// Appends a new primitive value to this list
1193    pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1194        &mut self,
1195        value: T,
1196    ) -> Result<(), ArrowError> {
1197        let (buffer, metadata_builder) = self.parent_state.buffer_and_metadata_builder();
1198
1199        let offset = buffer.offset() - self.parent_value_offset_base;
1200        self.offsets.push(offset);
1201
1202        buffer.try_append_variant(value.into(), metadata_builder)?;
1203
1204        Ok(())
1205    }
1206
1207    /// Builder-style API for appending a value to the list and returning self to enable method chaining.
1208    ///
1209    /// # Panics
1210    ///
1211    /// This method will panic if the variant contains duplicate field names in objects
1212    /// when validation is enabled. For a fallible version, use [`ListBuilder::try_with_value`].
1213    pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
1214        self.append_value(value);
1215        self
1216    }
1217
1218    /// Builder-style API for appending a value to the list and returns self for method chaining.
1219    ///
1220    /// This is the fallible version of [`ListBuilder::with_value`].
1221    pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1222        mut self,
1223        value: T,
1224    ) -> Result<Self, ArrowError> {
1225        self.try_append_value(value)?;
1226        Ok(self)
1227    }
1228
1229    /// Finalizes this list and appends it to its parent, which otherwise remains unmodified.
1230    pub fn finish(mut self) {
1231        let buffer = self.parent_state.buffer();
1232
1233        let data_size = buffer
1234            .offset()
1235            .checked_sub(self.parent_value_offset_base)
1236            .expect("Data size overflowed usize");
1237
1238        let num_elements = self.offsets.len();
1239        let is_large = num_elements > u8::MAX as usize;
1240        let offset_size = int_size(data_size);
1241
1242        let starting_offset = self.parent_value_offset_base;
1243
1244        let num_elements_size = if is_large { 4 } else { 1 }; // is_large: 4 bytes, else 1 byte.
1245        let num_elements = self.offsets.len();
1246        let header_size = 1 +      // header (i.e., `array_header`)
1247            num_elements_size +  // num_element_size
1248            (num_elements + 1) * offset_size as usize; // offsets and data size
1249
1250        // Calculated header size becomes a hint; being wrong only risks extra allocations.
1251        // Make sure to reserve enough capacity to handle the extra bytes we'll truncate.
1252        let mut bytes_to_splice = Vec::with_capacity(header_size + 3);
1253        // Write header
1254        let header = array_header(is_large, offset_size);
1255        bytes_to_splice.push(header);
1256
1257        append_packed_u32(&mut bytes_to_splice, num_elements as u32, num_elements_size);
1258
1259        for offset in &self.offsets {
1260            append_packed_u32(&mut bytes_to_splice, *offset as u32, offset_size as usize);
1261        }
1262
1263        append_packed_u32(&mut bytes_to_splice, data_size as u32, offset_size as usize);
1264
1265        buffer
1266            .inner_mut()
1267            .splice(starting_offset..starting_offset, bytes_to_splice);
1268
1269        self.parent_state.finish(starting_offset);
1270        self.has_been_finished = true;
1271    }
1272}
1273
1274/// Drop implementation for ListBuilder does nothing
1275/// as the `finish` method must be called to finalize the list.
1276/// This is to ensure that the list is always finalized before its parent builder
1277/// is finalized.
1278impl Drop for ListBuilder<'_> {
1279    fn drop(&mut self) {
1280        if !self.has_been_finished {
1281            self.parent_state
1282                .buffer()
1283                .inner_mut()
1284                .truncate(self.parent_value_offset_base);
1285            self.parent_state
1286                .metadata_builder()
1287                .field_names
1288                .truncate(self.parent_metadata_offset_base);
1289        }
1290    }
1291}
1292
1293/// A builder for creating [`Variant::Object`] values.
1294///
1295/// See the examples on [`VariantBuilder`] for usage.
1296pub struct ObjectBuilder<'a> {
1297    parent_state: ParentState<'a>,
1298    fields: IndexMap<u32, usize>, // (field_id, offset)
1299    /// The starting offset in the parent's buffer where this object starts
1300    parent_value_offset_base: usize,
1301    /// The starting offset in the parent's metadata buffer where this object starts
1302    /// used to truncate the written fields in `drop` if the current object has not been finished
1303    parent_metadata_offset_base: usize,
1304    /// Whether the object has been finished, the written content of the current object
1305    /// will be truncated in `drop` if `has_been_finished` is false
1306    has_been_finished: bool,
1307    validate_unique_fields: bool,
1308    /// Set of duplicate fields to report for errors
1309    duplicate_fields: HashSet<u32>,
1310}
1311
1312impl<'a> ObjectBuilder<'a> {
1313    fn new(parent_state: ParentState<'a>, validate_unique_fields: bool) -> Self {
1314        let offset_base = parent_state.buffer_current_offset();
1315        let meta_offset_base = parent_state.metadata_current_offset();
1316        Self {
1317            parent_state,
1318            fields: IndexMap::new(),
1319            parent_value_offset_base: offset_base,
1320            has_been_finished: false,
1321            parent_metadata_offset_base: meta_offset_base,
1322            validate_unique_fields,
1323            duplicate_fields: HashSet::new(),
1324        }
1325    }
1326
1327    /// Add a field with key and value to the object
1328    ///
1329    /// # See Also
1330    /// - [`ObjectBuilder::try_insert`] for a fallible version.
1331    /// - [`ObjectBuilder::with_field`] for a builder-style API.
1332    ///
1333    /// # Panics
1334    ///
1335    /// This method will panic if the variant contains duplicate field names in objects
1336    /// when validation is enabled. For a fallible version, use [`ObjectBuilder::try_insert`]
1337    pub fn insert<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, key: &str, value: T) {
1338        self.try_insert(key, value).unwrap();
1339    }
1340
1341    /// Add a field with key and value to the object
1342    ///
1343    /// # See Also
1344    /// - [`ObjectBuilder::insert`] for a infallabel version
1345    /// - [`ObjectBuilder::try_with_field`] for a builder-style API.
1346    ///
1347    /// # Note
1348    /// When inserting duplicate keys, the new value overwrites the previous mapping,
1349    /// but the old value remains in the buffer, resulting in a larger variant
1350    pub fn try_insert<'m, 'd, T: Into<Variant<'m, 'd>>>(
1351        &mut self,
1352        key: &str,
1353        value: T,
1354    ) -> Result<(), ArrowError> {
1355        let (buffer, metadata_builder) = self.parent_state.buffer_and_metadata_builder();
1356
1357        let field_id = metadata_builder.upsert_field_name(key);
1358        let field_start = buffer.offset() - self.parent_value_offset_base;
1359
1360        if self.fields.insert(field_id, field_start).is_some() && self.validate_unique_fields {
1361            self.duplicate_fields.insert(field_id);
1362        }
1363
1364        buffer.try_append_variant(value.into(), metadata_builder)?;
1365        Ok(())
1366    }
1367
1368    /// Builder style API for adding a field with key and value to the object
1369    ///
1370    /// Same as [`ObjectBuilder::insert`], but returns `self` for chaining.
1371    pub fn with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, key: &str, value: T) -> Self {
1372        self.insert(key, value);
1373        self
1374    }
1375
1376    /// Builder style API for adding a field with key and value to the object
1377    ///
1378    /// Same as [`ObjectBuilder::try_insert`], but returns `self` for chaining.
1379    pub fn try_with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(
1380        mut self,
1381        key: &str,
1382        value: T,
1383    ) -> Result<Self, ArrowError> {
1384        self.try_insert(key, value)?;
1385        Ok(self)
1386    }
1387
1388    /// Enables validation for unique field keys when inserting into this object.
1389    ///
1390    /// When this is enabled, calling [`ObjectBuilder::finish`] will return an error
1391    /// if any duplicate field keys were added using [`ObjectBuilder::insert`].
1392    pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1393        self.validate_unique_fields = validate_unique_fields;
1394        self
1395    }
1396
1397    // Returns validate_unique_fields because we can no longer reference self once this method returns.
1398    fn parent_state<'b>(&'b mut self, key: &'b str) -> (ParentState<'b>, bool) {
1399        let validate_unique_fields = self.validate_unique_fields;
1400
1401        let (buffer, metadata_builder) = self.parent_state.buffer_and_metadata_builder();
1402
1403        let state = ParentState::Object {
1404            buffer,
1405            metadata_builder,
1406            fields: &mut self.fields,
1407            field_name: key,
1408            parent_value_offset_base: self.parent_value_offset_base,
1409        };
1410        (state, validate_unique_fields)
1411    }
1412
1413    /// Returns an object builder that can be used to append a new (nested) object to this object.
1414    ///
1415    /// WARNING: The builder will have no effect unless/until [`ObjectBuilder::finish`] is called.
1416    pub fn new_object<'b>(&'b mut self, key: &'b str) -> ObjectBuilder<'b> {
1417        let (parent_state, validate_unique_fields) = self.parent_state(key);
1418        ObjectBuilder::new(parent_state, validate_unique_fields)
1419    }
1420
1421    /// Returns a list builder that can be used to append a new (nested) list to this object.
1422    ///
1423    /// WARNING: The builder will have no effect unless/until [`ListBuilder::finish`] is called.
1424    pub fn new_list<'b>(&'b mut self, key: &'b str) -> ListBuilder<'b> {
1425        let (parent_state, validate_unique_fields) = self.parent_state(key);
1426        ListBuilder::new(parent_state, validate_unique_fields)
1427    }
1428
1429    /// Finalizes this object and appends it to its parent, which otherwise remains unmodified.
1430    pub fn finish(mut self) -> Result<(), ArrowError> {
1431        let metadata_builder = self.parent_state.metadata_builder();
1432        if self.validate_unique_fields && !self.duplicate_fields.is_empty() {
1433            let mut names = self
1434                .duplicate_fields
1435                .iter()
1436                .map(|id| metadata_builder.field_name(*id as usize))
1437                .collect::<Vec<_>>();
1438
1439            names.sort_unstable();
1440
1441            let joined = names.join(", ");
1442            return Err(ArrowError::InvalidArgumentError(format!(
1443                "Duplicate field keys detected: [{joined}]",
1444            )));
1445        }
1446
1447        self.fields.sort_by(|&field_a_id, _, &field_b_id, _| {
1448            let field_a_name = metadata_builder.field_name(field_a_id as usize);
1449            let field_b_name = metadata_builder.field_name(field_b_id as usize);
1450            field_a_name.cmp(field_b_name)
1451        });
1452
1453        let max_id = self.fields.iter().map(|(i, _)| *i).max().unwrap_or(0);
1454        let id_size = int_size(max_id as usize);
1455
1456        let parent_buffer = self.parent_state.buffer();
1457        let current_offset = parent_buffer.offset();
1458        // Current object starts from `object_start_offset`
1459        let data_size = current_offset - self.parent_value_offset_base;
1460        let offset_size = int_size(data_size);
1461
1462        let num_fields = self.fields.len();
1463        let is_large = num_fields > u8::MAX as usize;
1464
1465        let header_size = 1 + // header byte
1466            (if is_large { 4 } else { 1 }) + // num_fields
1467            (num_fields * id_size as usize) + // field IDs
1468            ((num_fields + 1) * offset_size as usize); // field offsets + data_size
1469
1470        let starting_offset = self.parent_value_offset_base;
1471
1472        // Shift existing data to make room for the header
1473        let buffer = parent_buffer.inner_mut();
1474        buffer.splice(
1475            starting_offset..starting_offset,
1476            std::iter::repeat_n(0u8, header_size),
1477        );
1478
1479        // Write header at the original start position
1480        let mut header_pos = starting_offset;
1481
1482        // Write header byte
1483        let header = object_header(is_large, id_size, offset_size);
1484
1485        header_pos = self
1486            .parent_state
1487            .buffer()
1488            .append_header_start_from_buf_pos(header_pos, header, is_large, num_fields);
1489
1490        header_pos = self
1491            .parent_state
1492            .buffer()
1493            .append_offset_array_start_from_buf_pos(
1494                header_pos,
1495                self.fields.keys().copied().map(|id| id as usize),
1496                None,
1497                id_size,
1498            );
1499
1500        self.parent_state
1501            .buffer()
1502            .append_offset_array_start_from_buf_pos(
1503                header_pos,
1504                self.fields.values().copied(),
1505                Some(data_size),
1506                offset_size,
1507            );
1508        self.parent_state.finish(starting_offset);
1509
1510        // Mark that this object has been finished
1511        self.has_been_finished = true;
1512
1513        Ok(())
1514    }
1515}
1516
1517/// Drop implementation for ObjectBuilder does nothing
1518/// as the `finish` method must be called to finalize the object.
1519/// This is to ensure that the object is always finalized before its parent builder
1520/// is finalized.
1521impl Drop for ObjectBuilder<'_> {
1522    fn drop(&mut self) {
1523        // Truncate the buffer if the `finish` method has not been called.
1524        if !self.has_been_finished {
1525            self.parent_state
1526                .buffer()
1527                .inner_mut()
1528                .truncate(self.parent_value_offset_base);
1529
1530            self.parent_state
1531                .metadata_builder()
1532                .field_names
1533                .truncate(self.parent_metadata_offset_base);
1534        }
1535    }
1536}
1537
1538/// Extends [`VariantBuilder`] to help building nested [`Variant`]s
1539///
1540/// Allows users to append values to a [`VariantBuilder`], [`ListBuilder`] or
1541/// [`ObjectBuilder`]. using the same interface.
1542pub trait VariantBuilderExt {
1543    fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>);
1544
1545    fn new_list(&mut self) -> ListBuilder<'_>;
1546
1547    fn new_object(&mut self) -> ObjectBuilder<'_>;
1548}
1549
1550impl VariantBuilderExt for ListBuilder<'_> {
1551    fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1552        self.append_value(value);
1553    }
1554
1555    fn new_list(&mut self) -> ListBuilder<'_> {
1556        self.new_list()
1557    }
1558
1559    fn new_object(&mut self) -> ObjectBuilder<'_> {
1560        self.new_object()
1561    }
1562}
1563
1564impl VariantBuilderExt for VariantBuilder {
1565    fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1566        self.append_value(value);
1567    }
1568
1569    fn new_list(&mut self) -> ListBuilder<'_> {
1570        self.new_list()
1571    }
1572
1573    fn new_object(&mut self) -> ObjectBuilder<'_> {
1574        self.new_object()
1575    }
1576}
1577
1578#[cfg(test)]
1579mod tests {
1580    use crate::VariantMetadata;
1581
1582    use super::*;
1583
1584    #[test]
1585    fn test_simple_usage() {
1586        {
1587            let mut builder = VariantBuilder::new();
1588            builder.append_value(());
1589            let (metadata, value) = builder.finish();
1590            let variant = Variant::try_new(&metadata, &value).unwrap();
1591            assert_eq!(variant, Variant::Null);
1592        }
1593
1594        {
1595            let mut builder = VariantBuilder::new();
1596            builder.append_value(true);
1597            let (metadata, value) = builder.finish();
1598            let variant = Variant::try_new(&metadata, &value).unwrap();
1599            assert_eq!(variant, Variant::BooleanTrue);
1600        }
1601
1602        {
1603            let mut builder = VariantBuilder::new();
1604            builder.append_value(false);
1605            let (metadata, value) = builder.finish();
1606            let variant = Variant::try_new(&metadata, &value).unwrap();
1607            assert_eq!(variant, Variant::BooleanFalse);
1608        }
1609
1610        {
1611            let mut builder = VariantBuilder::new();
1612            builder.append_value(42i8);
1613            let (metadata, value) = builder.finish();
1614            let variant = Variant::try_new(&metadata, &value).unwrap();
1615            assert_eq!(variant, Variant::Int8(42));
1616        }
1617
1618        {
1619            let mut builder = VariantBuilder::new();
1620            builder.append_value(1234i16);
1621            let (metadata, value) = builder.finish();
1622            let variant = Variant::try_new(&metadata, &value).unwrap();
1623            assert_eq!(variant, Variant::Int16(1234));
1624        }
1625
1626        {
1627            let mut builder = VariantBuilder::new();
1628            builder.append_value(123456i32);
1629            let (metadata, value) = builder.finish();
1630            let variant = Variant::try_new(&metadata, &value).unwrap();
1631            assert_eq!(variant, Variant::Int32(123456));
1632        }
1633
1634        {
1635            let mut builder = VariantBuilder::new();
1636            builder.append_value(123456789i64);
1637            let (metadata, value) = builder.finish();
1638            let variant = Variant::try_new(&metadata, &value).unwrap();
1639            assert_eq!(variant, Variant::Int64(123456789));
1640        }
1641
1642        {
1643            let mut builder = VariantBuilder::new();
1644            builder.append_value(1.5f32);
1645            let (metadata, value) = builder.finish();
1646            let variant = Variant::try_new(&metadata, &value).unwrap();
1647            assert_eq!(variant, Variant::Float(1.5));
1648        }
1649
1650        {
1651            let mut builder = VariantBuilder::new();
1652            builder.append_value(2.5f64);
1653            let (metadata, value) = builder.finish();
1654            let variant = Variant::try_new(&metadata, &value).unwrap();
1655            assert_eq!(variant, Variant::Double(2.5));
1656        }
1657
1658        {
1659            let mut builder = VariantBuilder::new();
1660            builder.append_value("hello");
1661            let (metadata, value) = builder.finish();
1662            let variant = Variant::try_new(&metadata, &value).unwrap();
1663            assert_eq!(variant, Variant::ShortString(ShortString("hello")));
1664        }
1665
1666        {
1667            let mut builder = VariantBuilder::new();
1668            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";
1669            builder.append_value(long_string);
1670            let (metadata, value) = builder.finish();
1671            let variant = Variant::try_new(&metadata, &value).unwrap();
1672            assert_eq!(variant, Variant::String(long_string));
1673        }
1674
1675        {
1676            let mut builder = VariantBuilder::new();
1677            let binary_data = b"binary data";
1678            builder.append_value(binary_data.as_slice());
1679            let (metadata, value) = builder.finish();
1680            let variant = Variant::try_new(&metadata, &value).unwrap();
1681            assert_eq!(variant, Variant::Binary(binary_data.as_slice()));
1682        }
1683    }
1684
1685    #[test]
1686    fn test_list() {
1687        let mut builder = VariantBuilder::new();
1688
1689        builder
1690            .new_list()
1691            .with_value(1i8)
1692            .with_value(2i8)
1693            .with_value("test")
1694            .finish();
1695
1696        let (metadata, value) = builder.finish();
1697        assert!(!metadata.is_empty());
1698        assert!(!value.is_empty());
1699
1700        let variant = Variant::try_new(&metadata, &value).unwrap();
1701
1702        match variant {
1703            Variant::List(list) => {
1704                let val0 = list.get(0).unwrap();
1705                assert_eq!(val0, Variant::Int8(1));
1706
1707                let val1 = list.get(1).unwrap();
1708                assert_eq!(val1, Variant::Int8(2));
1709
1710                let val2 = list.get(2).unwrap();
1711                assert_eq!(val2, Variant::ShortString(ShortString("test")));
1712            }
1713            _ => panic!("Expected an array variant, got: {variant:?}"),
1714        }
1715    }
1716
1717    #[test]
1718    fn test_object() {
1719        let mut builder = VariantBuilder::new();
1720
1721        builder
1722            .new_object()
1723            .with_field("name", "John")
1724            .with_field("age", 42i8)
1725            .finish()
1726            .unwrap();
1727
1728        let (metadata, value) = builder.finish();
1729        assert!(!metadata.is_empty());
1730        assert!(!value.is_empty());
1731    }
1732
1733    #[test]
1734    fn test_object_field_ordering() {
1735        let mut builder = VariantBuilder::new();
1736
1737        builder
1738            .new_object()
1739            .with_field("zebra", "stripes")
1740            .with_field("apple", "red")
1741            .with_field("banana", "yellow")
1742            .finish()
1743            .unwrap();
1744
1745        let (_, value) = builder.finish();
1746
1747        let header = value[0];
1748        assert_eq!(header & 0x03, VariantBasicType::Object as u8);
1749
1750        let field_count = value[1] as usize;
1751        assert_eq!(field_count, 3);
1752
1753        // Get field IDs from the object header
1754        let field_ids: Vec<u8> = value[2..5].to_vec();
1755
1756        // apple(1), banana(2), zebra(0)
1757        assert_eq!(field_ids, vec![1, 2, 0]);
1758    }
1759
1760    #[test]
1761    fn test_duplicate_fields_in_object() {
1762        let mut builder = VariantBuilder::new();
1763        builder
1764            .new_object()
1765            .with_field("name", "Ron Artest")
1766            .with_field("name", "Metta World Peace") // Duplicate field
1767            .finish()
1768            .unwrap();
1769
1770        let (metadata, value) = builder.finish();
1771        let variant = Variant::try_new(&metadata, &value).unwrap();
1772
1773        let obj = variant.as_object().unwrap();
1774        assert_eq!(obj.len(), 1);
1775        assert_eq!(obj.field(0).unwrap(), Variant::from("Metta World Peace"));
1776
1777        assert_eq!(
1778            vec![("name", Variant::from("Metta World Peace"))],
1779            obj.iter().collect::<Vec<_>>()
1780        );
1781    }
1782
1783    #[test]
1784    fn test_nested_list() {
1785        let mut builder = VariantBuilder::new();
1786
1787        let mut outer_list_builder = builder.new_list();
1788
1789        // create inner list
1790        outer_list_builder
1791            .new_list()
1792            .with_value("a")
1793            .with_value("b")
1794            .with_value("c")
1795            .with_value("d")
1796            .finish();
1797
1798        outer_list_builder.finish();
1799
1800        let (metadata, value) = builder.finish();
1801
1802        let variant = Variant::try_new(&metadata, &value).unwrap();
1803        let outer_list = variant.as_list().unwrap();
1804
1805        assert_eq!(outer_list.len(), 1);
1806
1807        let inner_variant = outer_list.get(0).unwrap();
1808        let inner_list = inner_variant.as_list().unwrap();
1809
1810        assert_eq!(
1811            vec![
1812                Variant::from("a"),
1813                Variant::from("b"),
1814                Variant::from("c"),
1815                Variant::from("d"),
1816            ],
1817            inner_list.iter().collect::<Vec<_>>()
1818        );
1819    }
1820
1821    #[test]
1822    fn test_super_nested_list() {
1823        /*
1824        [[[[[1]]]]]
1825        */
1826
1827        let mut builder = VariantBuilder::new();
1828        {
1829            let mut list_builder1 = builder.new_list();
1830            {
1831                let mut list_builder2 = list_builder1.new_list();
1832                {
1833                    let mut list_builder3 = list_builder2.new_list();
1834                    {
1835                        let mut list_builder4 = list_builder3.new_list();
1836                        {
1837                            let mut list_builder5 = list_builder4.new_list();
1838                            list_builder5.append_value(1);
1839                            list_builder5.finish();
1840                        }
1841                        list_builder4.finish();
1842                    }
1843                    list_builder3.finish();
1844                }
1845                list_builder2.finish();
1846            }
1847            list_builder1.finish();
1848        }
1849
1850        let (metadata, value) = builder.finish();
1851
1852        let variant = Variant::try_new(&metadata, &value).unwrap();
1853        let list1 = variant.as_list().unwrap();
1854        assert_eq!(list1.len(), 1);
1855
1856        let list2_variant = list1.get(0).unwrap();
1857        let list2 = list2_variant.as_list().unwrap();
1858        assert_eq!(list2.len(), 1);
1859
1860        let list3_variant = list2.get(0).unwrap();
1861        let list3 = list3_variant.as_list().unwrap();
1862        assert_eq!(list3.len(), 1);
1863
1864        let list4_variant = list3.get(0).unwrap();
1865        let list4 = list4_variant.as_list().unwrap();
1866        assert_eq!(list4.len(), 1);
1867
1868        let list5_variant = list4.get(0).unwrap();
1869        let list5 = list5_variant.as_list().unwrap();
1870        assert_eq!(list5.len(), 1);
1871
1872        assert_eq!(list5.len(), 1);
1873
1874        assert_eq!(list5.get(0).unwrap(), Variant::from(1));
1875    }
1876
1877    #[test]
1878    fn test_object_list() {
1879        let mut builder = VariantBuilder::new();
1880
1881        let mut list_builder = builder.new_list();
1882
1883        list_builder
1884            .new_object()
1885            .with_field("id", 1)
1886            .with_field("type", "Cauliflower")
1887            .finish()
1888            .unwrap();
1889
1890        list_builder
1891            .new_object()
1892            .with_field("id", 2)
1893            .with_field("type", "Beets")
1894            .finish()
1895            .unwrap();
1896
1897        list_builder.finish();
1898
1899        let (metadata, value) = builder.finish();
1900
1901        let variant = Variant::try_new(&metadata, &value).unwrap();
1902        let list = variant.as_list().unwrap();
1903
1904        assert_eq!(list.len(), 2);
1905
1906        let obj1_variant = list.get(0).unwrap();
1907        let obj1 = obj1_variant.as_object().unwrap();
1908
1909        assert_eq!(
1910            vec![
1911                ("id", Variant::from(1)),
1912                ("type", Variant::from("Cauliflower")),
1913            ],
1914            obj1.iter().collect::<Vec<_>>()
1915        );
1916
1917        let obj2_variant = list.get(1).unwrap();
1918        let obj2 = obj2_variant.as_object().unwrap();
1919
1920        assert_eq!(
1921            vec![("id", Variant::from(2)), ("type", Variant::from("Beets")),],
1922            obj2.iter().collect::<Vec<_>>()
1923        );
1924    }
1925
1926    #[test]
1927    fn test_object_list2() {
1928        let mut builder = VariantBuilder::new();
1929
1930        let mut list_builder = builder.new_list();
1931
1932        list_builder
1933            .new_object()
1934            .with_field("a", 1)
1935            .finish()
1936            .unwrap();
1937
1938        list_builder
1939            .new_object()
1940            .with_field("b", 2)
1941            .finish()
1942            .unwrap();
1943
1944        list_builder.finish();
1945
1946        let (metadata, value) = builder.finish();
1947
1948        let variant = Variant::try_new(&metadata, &value).unwrap();
1949        let list = variant.as_list().unwrap();
1950        assert_eq!(list.len(), 2);
1951
1952        let obj1_variant = list.get(0).unwrap();
1953        let obj1 = obj1_variant.as_object().unwrap();
1954        assert_eq!(
1955            vec![("a", Variant::from(1)),],
1956            obj1.iter().collect::<Vec<_>>()
1957        );
1958
1959        let obj2_variant = list.get(1).unwrap();
1960        let obj2 = obj2_variant.as_object().unwrap();
1961        assert_eq!(
1962            vec![("b", Variant::from(2)),],
1963            obj2.iter().collect::<Vec<_>>()
1964        );
1965    }
1966
1967    #[test]
1968    fn test_hetergenous_list() {
1969        /*
1970        [
1971            1,
1972            { "a": 1 },
1973            2,
1974            { "b": 2},
1975            3
1976        ]
1977        */
1978
1979        let mut builder = VariantBuilder::new();
1980
1981        let mut list_builder = builder.new_list();
1982
1983        list_builder.append_value(1);
1984
1985        {
1986            let mut object_builder = list_builder.new_object();
1987            object_builder.insert("a", 1);
1988            let _ = object_builder.finish();
1989        }
1990
1991        list_builder.append_value(2);
1992
1993        {
1994            let mut object_builder = list_builder.new_object();
1995            object_builder.insert("b", 2);
1996            let _ = object_builder.finish();
1997        }
1998
1999        list_builder.append_value(3);
2000
2001        list_builder.finish();
2002
2003        let (metadata, value) = builder.finish();
2004
2005        let variant = Variant::try_new(&metadata, &value).unwrap();
2006        let list = variant.as_list().unwrap();
2007        assert_eq!(list.len(), 5);
2008        assert_eq!(list.get(0).unwrap(), Variant::from(1));
2009
2010        let obj1_variant = list.get(1).unwrap();
2011        let obj1 = obj1_variant.as_object().unwrap();
2012        assert_eq!(
2013            vec![("a", Variant::from(1)),],
2014            obj1.iter().collect::<Vec<_>>()
2015        );
2016
2017        assert_eq!(list.get(2).unwrap(), Variant::from(2));
2018
2019        let obj2_variant = list.get(3).unwrap();
2020        let obj2 = obj2_variant.as_object().unwrap();
2021        assert_eq!(
2022            vec![("b", Variant::from(2)),],
2023            obj2.iter().collect::<Vec<_>>()
2024        );
2025
2026        assert_eq!(list.get(4).unwrap(), Variant::from(3));
2027    }
2028
2029    #[test]
2030    fn test_nested_object() {
2031        /*
2032        {
2033            "c": {
2034                "b": "a"
2035            }
2036        }
2037
2038        */
2039
2040        let mut builder = VariantBuilder::new();
2041        {
2042            let mut outer_object_builder = builder.new_object();
2043            {
2044                let mut inner_object_builder = outer_object_builder.new_object("c");
2045                inner_object_builder.insert("b", "a");
2046                let _ = inner_object_builder.finish();
2047            }
2048
2049            let _ = outer_object_builder.finish();
2050        }
2051
2052        let (metadata, value) = builder.finish();
2053        let variant = Variant::try_new(&metadata, &value).unwrap();
2054        let outer_object = variant.as_object().unwrap();
2055
2056        assert_eq!(outer_object.len(), 1);
2057        assert_eq!(outer_object.field_name(0).unwrap(), "c");
2058
2059        let inner_object_variant = outer_object.field(0).unwrap();
2060        let inner_object = inner_object_variant.as_object().unwrap();
2061
2062        assert_eq!(inner_object.len(), 1);
2063        assert_eq!(inner_object.field_name(0).unwrap(), "b");
2064        assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2065    }
2066
2067    #[test]
2068    fn test_nested_object_with_duplicate_field_names_per_object() {
2069        /*
2070        {
2071            "c": {
2072                "b": false,
2073                "c": "a"
2074            },
2075            "b": false,
2076        }
2077
2078        */
2079
2080        let mut builder = VariantBuilder::new();
2081        {
2082            let mut outer_object_builder = builder.new_object();
2083            {
2084                let mut inner_object_builder = outer_object_builder.new_object("c");
2085                inner_object_builder.insert("b", false);
2086                inner_object_builder.insert("c", "a");
2087
2088                let _ = inner_object_builder.finish();
2089            }
2090
2091            outer_object_builder.insert("b", false);
2092            let _ = outer_object_builder.finish();
2093        }
2094
2095        let (metadata, value) = builder.finish();
2096        let variant = Variant::try_new(&metadata, &value).unwrap();
2097        let outer_object = variant.as_object().unwrap();
2098
2099        assert_eq!(outer_object.len(), 2);
2100        assert_eq!(outer_object.field_name(0).unwrap(), "b");
2101
2102        let inner_object_variant = outer_object.field(1).unwrap();
2103        let inner_object = inner_object_variant.as_object().unwrap();
2104
2105        assert_eq!(inner_object.len(), 2);
2106        assert_eq!(inner_object.field_name(0).unwrap(), "b");
2107        assert_eq!(inner_object.field(0).unwrap(), Variant::from(false));
2108        assert_eq!(inner_object.field_name(1).unwrap(), "c");
2109        assert_eq!(inner_object.field(1).unwrap(), Variant::from("a"));
2110    }
2111
2112    #[test]
2113    fn test_nested_object_with_lists() {
2114        /*
2115        {
2116            "door 1": {
2117                "items": ["apple", false ]
2118            }
2119        }
2120
2121        */
2122
2123        let mut builder = VariantBuilder::new();
2124        {
2125            let mut outer_object_builder = builder.new_object();
2126            {
2127                let mut inner_object_builder = outer_object_builder.new_object("door 1");
2128
2129                // create inner_object_list
2130                inner_object_builder
2131                    .new_list("items")
2132                    .with_value("apple")
2133                    .with_value(false)
2134                    .finish();
2135
2136                let _ = inner_object_builder.finish();
2137            }
2138
2139            let _ = outer_object_builder.finish();
2140        }
2141
2142        let (metadata, value) = builder.finish();
2143        let variant = Variant::try_new(&metadata, &value).unwrap();
2144        let outer_object = variant.as_object().unwrap();
2145
2146        assert_eq!(outer_object.len(), 1);
2147        assert_eq!(outer_object.field_name(0).unwrap(), "door 1");
2148
2149        let inner_object_variant = outer_object.field(0).unwrap();
2150        let inner_object = inner_object_variant.as_object().unwrap();
2151
2152        assert_eq!(inner_object.len(), 1);
2153        assert_eq!(inner_object.field_name(0).unwrap(), "items");
2154
2155        let items_variant = inner_object.field(0).unwrap();
2156        let items_list = items_variant.as_list().unwrap();
2157
2158        assert_eq!(items_list.len(), 2);
2159        assert_eq!(items_list.get(0).unwrap(), Variant::from("apple"));
2160        assert_eq!(items_list.get(1).unwrap(), Variant::from(false));
2161    }
2162
2163    #[test]
2164    fn test_nested_object_with_heterogeneous_fields() {
2165        /*
2166        {
2167            "a": false,
2168            "c": {
2169                "b": "a",
2170                "c": {
2171                   "aa": "bb",
2172                },
2173                "d": {
2174                    "cc": "dd"
2175                }
2176            },
2177            "b": true,
2178            "d": {
2179               "e": 1,
2180               "f": [1, true],
2181               "g": ["tree", false],
2182            }
2183        }
2184        */
2185
2186        let mut builder = VariantBuilder::new();
2187        {
2188            let mut outer_object_builder = builder.new_object();
2189
2190            outer_object_builder.insert("a", false);
2191
2192            {
2193                let mut inner_object_builder = outer_object_builder.new_object("c");
2194                inner_object_builder.insert("b", "a");
2195
2196                {
2197                    let mut inner_inner_object_builder = inner_object_builder.new_object("c");
2198                    inner_inner_object_builder.insert("aa", "bb");
2199                    let _ = inner_inner_object_builder.finish();
2200                }
2201
2202                {
2203                    let mut inner_inner_object_builder = inner_object_builder.new_object("d");
2204                    inner_inner_object_builder.insert("cc", "dd");
2205                    let _ = inner_inner_object_builder.finish();
2206                }
2207                let _ = inner_object_builder.finish();
2208            }
2209
2210            outer_object_builder.insert("b", true);
2211
2212            {
2213                let mut inner_object_builder = outer_object_builder.new_object("d");
2214                inner_object_builder.insert("e", 1);
2215                {
2216                    let mut inner_list_builder = inner_object_builder.new_list("f");
2217                    inner_list_builder.append_value(1);
2218                    inner_list_builder.append_value(true);
2219
2220                    inner_list_builder.finish();
2221                }
2222
2223                {
2224                    let mut inner_list_builder = inner_object_builder.new_list("g");
2225                    inner_list_builder.append_value("tree");
2226                    inner_list_builder.append_value(false);
2227
2228                    inner_list_builder.finish();
2229                }
2230
2231                let _ = inner_object_builder.finish();
2232            }
2233
2234            let _ = outer_object_builder.finish();
2235        }
2236
2237        let (metadata, value) = builder.finish();
2238
2239        // note, object fields are now sorted lexigraphically by field name
2240        /*
2241         {
2242            "a": false,
2243            "b": true,
2244            "c": {
2245                "b": "a",
2246                "c": {
2247                   "aa": "bb",
2248                },
2249                "d": {
2250                    "cc": "dd"
2251                }
2252            },
2253            "d": {
2254               "e": 1,
2255               "f": [1, true],
2256               "g": ["tree", false],
2257            }
2258        }
2259        */
2260
2261        let variant = Variant::try_new(&metadata, &value).unwrap();
2262        let outer_object = variant.as_object().unwrap();
2263
2264        assert_eq!(outer_object.len(), 4);
2265
2266        assert_eq!(outer_object.field_name(0).unwrap(), "a");
2267        assert_eq!(outer_object.field(0).unwrap(), Variant::from(false));
2268
2269        assert_eq!(outer_object.field_name(2).unwrap(), "c");
2270
2271        let inner_object_variant = outer_object.field(2).unwrap();
2272        let inner_object = inner_object_variant.as_object().unwrap();
2273
2274        assert_eq!(inner_object.len(), 3);
2275        assert_eq!(inner_object.field_name(0).unwrap(), "b");
2276        assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2277
2278        let inner_iner_object_variant_c = inner_object.field(1).unwrap();
2279        let inner_inner_object_c = inner_iner_object_variant_c.as_object().unwrap();
2280        assert_eq!(inner_inner_object_c.len(), 1);
2281        assert_eq!(inner_inner_object_c.field_name(0).unwrap(), "aa");
2282        assert_eq!(inner_inner_object_c.field(0).unwrap(), Variant::from("bb"));
2283
2284        let inner_iner_object_variant_d = inner_object.field(2).unwrap();
2285        let inner_inner_object_d = inner_iner_object_variant_d.as_object().unwrap();
2286        assert_eq!(inner_inner_object_d.len(), 1);
2287        assert_eq!(inner_inner_object_d.field_name(0).unwrap(), "cc");
2288        assert_eq!(inner_inner_object_d.field(0).unwrap(), Variant::from("dd"));
2289
2290        assert_eq!(outer_object.field_name(1).unwrap(), "b");
2291        assert_eq!(outer_object.field(1).unwrap(), Variant::from(true));
2292
2293        let out_object_variant_d = outer_object.field(3).unwrap();
2294        let out_object_d = out_object_variant_d.as_object().unwrap();
2295        assert_eq!(out_object_d.len(), 3);
2296        assert_eq!("e", out_object_d.field_name(0).unwrap());
2297        assert_eq!(Variant::from(1), out_object_d.field(0).unwrap());
2298        assert_eq!("f", out_object_d.field_name(1).unwrap());
2299
2300        let first_inner_list_variant_f = out_object_d.field(1).unwrap();
2301        let first_inner_list_f = first_inner_list_variant_f.as_list().unwrap();
2302        assert_eq!(2, first_inner_list_f.len());
2303        assert_eq!(Variant::from(1), first_inner_list_f.get(0).unwrap());
2304        assert_eq!(Variant::from(true), first_inner_list_f.get(1).unwrap());
2305
2306        let second_inner_list_variant_g = out_object_d.field(2).unwrap();
2307        let second_inner_list_g = second_inner_list_variant_g.as_list().unwrap();
2308        assert_eq!(2, second_inner_list_g.len());
2309        assert_eq!(Variant::from("tree"), second_inner_list_g.get(0).unwrap());
2310        assert_eq!(Variant::from(false), second_inner_list_g.get(1).unwrap());
2311    }
2312
2313    // This test wants to cover the logic for reuse parent buffer for list builder
2314    // the builder looks like
2315    // [ "apple", "false", [{"a": "b", "b": "c"}, {"c":"d", "d":"e"}], [[1, true], ["tree", false]], 1]
2316    #[test]
2317    fn test_nested_list_with_heterogeneous_fields_for_buffer_reuse() {
2318        let mut builder = VariantBuilder::new();
2319
2320        {
2321            let mut outer_list_builder = builder.new_list();
2322
2323            outer_list_builder.append_value("apple");
2324            outer_list_builder.append_value(false);
2325
2326            {
2327                // the list here wants to cover the logic object builder inside list builder
2328                let mut inner_list_builder = outer_list_builder.new_list();
2329
2330                {
2331                    let mut inner_object_builder = inner_list_builder.new_object();
2332                    inner_object_builder.insert("a", "b");
2333                    inner_object_builder.insert("b", "c");
2334                    let _ = inner_object_builder.finish();
2335                }
2336
2337                {
2338                    // the seconde object builder here wants to cover the logic for
2339                    // list builder resue the parent buffer.
2340                    let mut inner_object_builder = inner_list_builder.new_object();
2341                    inner_object_builder.insert("c", "d");
2342                    inner_object_builder.insert("d", "e");
2343                    let _ = inner_object_builder.finish();
2344                }
2345
2346                inner_list_builder.finish();
2347            }
2348
2349            {
2350                // the list here wants to cover the logic list builder inside list builder
2351                let mut inner_list_builder = outer_list_builder.new_list();
2352
2353                {
2354                    let mut double_inner_list_builder = inner_list_builder.new_list();
2355                    double_inner_list_builder.append_value(1);
2356                    double_inner_list_builder.append_value(true);
2357
2358                    double_inner_list_builder.finish();
2359                }
2360
2361                {
2362                    let mut double_inner_list_builder = inner_list_builder.new_list();
2363                    double_inner_list_builder.append_value("tree");
2364                    double_inner_list_builder.append_value(false);
2365
2366                    double_inner_list_builder.finish();
2367                }
2368                inner_list_builder.finish();
2369            }
2370
2371            outer_list_builder.append_value(1);
2372
2373            outer_list_builder.finish();
2374        }
2375
2376        let (metadata, value) = builder.finish();
2377
2378        let variant = Variant::try_new(&metadata, &value).unwrap();
2379        let outer_list = variant.as_list().unwrap();
2380
2381        assert_eq!(5, outer_list.len());
2382
2383        // Primitive value
2384        assert_eq!(Variant::from("apple"), outer_list.get(0).unwrap());
2385        assert_eq!(Variant::from(false), outer_list.get(1).unwrap());
2386        assert_eq!(Variant::from(1), outer_list.get(4).unwrap());
2387
2388        // The first inner list [{"a": "b", "b": "c"}, {"c":"d", "d":"e"}]
2389        let list1_variant = outer_list.get(2).unwrap();
2390        let list1 = list1_variant.as_list().unwrap();
2391        assert_eq!(2, list1.len());
2392
2393        let list1_obj1_variant = list1.get(0).unwrap();
2394        let list1_obj1 = list1_obj1_variant.as_object().unwrap();
2395        assert_eq!("a", list1_obj1.field_name(0).unwrap());
2396        assert_eq!(Variant::from("b"), list1_obj1.field(0).unwrap());
2397
2398        assert_eq!("b", list1_obj1.field_name(1).unwrap());
2399        assert_eq!(Variant::from("c"), list1_obj1.field(1).unwrap());
2400
2401        // The second inner list [[1, true], ["tree", false]]
2402        let list2_variant = outer_list.get(3).unwrap();
2403        let list2 = list2_variant.as_list().unwrap();
2404        assert_eq!(2, list2.len());
2405
2406        // The list [1, true]
2407        let list2_list1_variant = list2.get(0).unwrap();
2408        let list2_list1 = list2_list1_variant.as_list().unwrap();
2409        assert_eq!(2, list2_list1.len());
2410        assert_eq!(Variant::from(1), list2_list1.get(0).unwrap());
2411        assert_eq!(Variant::from(true), list2_list1.get(1).unwrap());
2412
2413        // The list ["true", false]
2414        let list2_list2_variant = list2.get(1).unwrap();
2415        let list2_list2 = list2_list2_variant.as_list().unwrap();
2416        assert_eq!(2, list2_list2.len());
2417        assert_eq!(Variant::from("tree"), list2_list2.get(0).unwrap());
2418        assert_eq!(Variant::from(false), list2_list2.get(1).unwrap());
2419    }
2420
2421    #[test]
2422    fn test_object_without_unique_field_validation() {
2423        let mut builder = VariantBuilder::new();
2424
2425        // Root object with duplicates
2426        let mut obj = builder.new_object();
2427        obj.insert("a", 1);
2428        obj.insert("a", 2);
2429        assert!(obj.finish().is_ok());
2430
2431        // Deeply nested list structure with duplicates
2432        let mut outer_list = builder.new_list();
2433        let mut inner_list = outer_list.new_list();
2434        let mut nested_obj = inner_list.new_object();
2435        nested_obj.insert("x", 1);
2436        nested_obj.insert("x", 2);
2437        assert!(nested_obj.finish().is_ok());
2438    }
2439
2440    #[test]
2441    fn test_object_with_unique_field_validation() {
2442        let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
2443
2444        // Root-level object with duplicates
2445        let mut root_obj = builder.new_object();
2446        root_obj.insert("a", 1);
2447        root_obj.insert("b", 2);
2448        root_obj.insert("a", 3);
2449        root_obj.insert("b", 4);
2450
2451        let result = root_obj.finish();
2452        assert_eq!(
2453            result.unwrap_err().to_string(),
2454            "Invalid argument error: Duplicate field keys detected: [a, b]"
2455        );
2456
2457        // Deeply nested list -> list -> object with duplicate
2458        let mut outer_list = builder.new_list();
2459        let mut inner_list = outer_list.new_list();
2460        let mut nested_obj = inner_list.new_object();
2461        nested_obj.insert("x", 1);
2462        nested_obj.insert("x", 2);
2463
2464        let nested_result = nested_obj.finish();
2465        assert_eq!(
2466            nested_result.unwrap_err().to_string(),
2467            "Invalid argument error: Duplicate field keys detected: [x]"
2468        );
2469
2470        inner_list.finish();
2471        outer_list.finish();
2472
2473        // Valid object should succeed
2474        let mut list = builder.new_list();
2475        let mut valid_obj = list.new_object();
2476        valid_obj.insert("m", 1);
2477        valid_obj.insert("n", 2);
2478
2479        let valid_result = valid_obj.finish();
2480        assert!(valid_result.is_ok());
2481    }
2482
2483    #[test]
2484    fn test_sorted_dictionary() {
2485        // check if variant metadatabuilders are equivalent from different ways of constructing them
2486        let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"].into_iter());
2487
2488        let mut variant2 = {
2489            let mut builder = VariantBuilder::new();
2490
2491            builder.add_field_name("b");
2492            builder.add_field_name("c");
2493            builder.add_field_name("d");
2494
2495            builder
2496        };
2497
2498        assert_eq!(
2499            variant1.metadata_builder.field_names,
2500            variant2.metadata_builder.field_names
2501        );
2502
2503        // check metadata builders say it's sorted
2504        assert!(variant1.metadata_builder.is_sorted);
2505        assert!(variant2.metadata_builder.is_sorted);
2506
2507        {
2508            // test the bad case and break the sort order
2509            variant2.add_field_name("a");
2510            assert!(!variant2.metadata_builder.is_sorted);
2511
2512            // per the spec, make sure the variant will fail to build if only metadata is provided
2513            let (m, v) = variant2.finish();
2514            let res = Variant::try_new(&m, &v);
2515            assert!(res.is_err());
2516
2517            // since it is not sorted, make sure the metadata says so
2518            let header = VariantMetadata::try_new(&m).unwrap();
2519            assert!(!header.is_sorted());
2520        }
2521
2522        // write out variant1 and make sure the sorted flag is properly encoded
2523        variant1.append_value(false);
2524
2525        let (m, v) = variant1.finish();
2526        let res = Variant::try_new(&m, &v);
2527        assert!(res.is_ok());
2528
2529        let header = VariantMetadata::try_new(&m).unwrap();
2530        assert!(header.is_sorted());
2531    }
2532
2533    #[test]
2534    fn test_object_sorted_dictionary() {
2535        // predefine the list of field names
2536        let mut variant1 = VariantBuilder::new().with_field_names(["a", "b", "c"].into_iter());
2537        let mut obj = variant1.new_object();
2538
2539        obj.insert("c", true);
2540        obj.insert("a", false);
2541        obj.insert("b", ());
2542
2543        // verify the field ids are correctly
2544        let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2545        assert_eq!(field_ids_by_insert_order, vec![2, 0, 1]);
2546
2547        // add a field name that wasn't pre-defined but doesn't break the sort order
2548        obj.insert("d", 2);
2549        obj.finish().unwrap();
2550
2551        let (metadata, value) = variant1.finish();
2552        let variant = Variant::try_new(&metadata, &value).unwrap();
2553
2554        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2555        assert!(metadata.is_sorted());
2556
2557        // verify object is sorted by field name order
2558        let object = variant.as_object().unwrap();
2559        let field_names = object
2560            .iter()
2561            .map(|(field_name, _)| field_name)
2562            .collect::<Vec<_>>();
2563
2564        assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2565    }
2566
2567    #[test]
2568    fn test_object_not_sorted_dictionary() {
2569        // predefine the list of field names
2570        let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"].into_iter());
2571        let mut obj = variant1.new_object();
2572
2573        obj.insert("c", true);
2574        obj.insert("d", false);
2575        obj.insert("b", ());
2576
2577        // verify the field ids are correctly
2578        let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2579        assert_eq!(field_ids_by_insert_order, vec![1, 2, 0]);
2580
2581        // add a field name that wasn't pre-defined but breaks the sort order
2582        obj.insert("a", 2);
2583        obj.finish().unwrap();
2584
2585        let (metadata, value) = variant1.finish();
2586        let variant = Variant::try_new(&metadata, &value).unwrap();
2587
2588        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2589        assert!(!metadata.is_sorted());
2590
2591        // verify object field names are sorted by field name order
2592        let object = variant.as_object().unwrap();
2593        let field_names = object
2594            .iter()
2595            .map(|(field_name, _)| field_name)
2596            .collect::<Vec<_>>();
2597
2598        assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2599    }
2600
2601    #[test]
2602    fn test_building_sorted_dictionary() {
2603        let mut builder = VariantBuilder::new();
2604        assert!(!builder.metadata_builder.is_sorted);
2605        assert_eq!(builder.metadata_builder.num_field_names(), 0);
2606
2607        builder.add_field_name("a");
2608
2609        assert!(builder.metadata_builder.is_sorted);
2610        assert_eq!(builder.metadata_builder.num_field_names(), 1);
2611
2612        let builder = builder.with_field_names(["b", "c", "d"].into_iter());
2613
2614        assert!(builder.metadata_builder.is_sorted);
2615        assert_eq!(builder.metadata_builder.num_field_names(), 4);
2616
2617        let builder = builder.with_field_names(["z", "y"].into_iter());
2618        assert!(!builder.metadata_builder.is_sorted);
2619        assert_eq!(builder.metadata_builder.num_field_names(), 6);
2620    }
2621
2622    #[test]
2623    fn test_metadata_builder_from_iter() {
2624        let metadata = MetadataBuilder::from_iter(vec!["apple", "banana", "cherry"]);
2625        assert_eq!(metadata.num_field_names(), 3);
2626        assert_eq!(metadata.field_name(0), "apple");
2627        assert_eq!(metadata.field_name(1), "banana");
2628        assert_eq!(metadata.field_name(2), "cherry");
2629        assert!(metadata.is_sorted);
2630
2631        let metadata = MetadataBuilder::from_iter(["zebra", "apple", "banana"]);
2632        assert_eq!(metadata.num_field_names(), 3);
2633        assert_eq!(metadata.field_name(0), "zebra");
2634        assert_eq!(metadata.field_name(1), "apple");
2635        assert_eq!(metadata.field_name(2), "banana");
2636        assert!(!metadata.is_sorted);
2637
2638        let metadata = MetadataBuilder::from_iter(Vec::<&str>::new());
2639        assert_eq!(metadata.num_field_names(), 0);
2640        assert!(!metadata.is_sorted);
2641    }
2642
2643    #[test]
2644    fn test_metadata_builder_extend() {
2645        let mut metadata = MetadataBuilder::default();
2646        assert_eq!(metadata.num_field_names(), 0);
2647        assert!(!metadata.is_sorted);
2648
2649        metadata.extend(["apple", "cherry"]);
2650        assert_eq!(metadata.num_field_names(), 2);
2651        assert_eq!(metadata.field_name(0), "apple");
2652        assert_eq!(metadata.field_name(1), "cherry");
2653        assert!(metadata.is_sorted);
2654
2655        // extend with more field names that maintain sort order
2656        metadata.extend(vec!["dinosaur", "monkey"]);
2657        assert_eq!(metadata.num_field_names(), 4);
2658        assert_eq!(metadata.field_name(2), "dinosaur");
2659        assert_eq!(metadata.field_name(3), "monkey");
2660        assert!(metadata.is_sorted);
2661
2662        // test extending with duplicate field names
2663        let initial_count = metadata.num_field_names();
2664        metadata.extend(["apple", "monkey"]);
2665        assert_eq!(metadata.num_field_names(), initial_count); // No new fields added
2666    }
2667
2668    #[test]
2669    fn test_metadata_builder_extend_sort_order() {
2670        let mut metadata = MetadataBuilder::default();
2671
2672        metadata.extend(["middle"]);
2673        assert!(metadata.is_sorted);
2674
2675        metadata.extend(["zebra"]);
2676        assert!(metadata.is_sorted);
2677
2678        // add field that breaks sort order
2679        metadata.extend(["apple"]);
2680        assert!(!metadata.is_sorted);
2681    }
2682
2683    #[test]
2684    fn test_metadata_builder_from_iter_with_string_types() {
2685        // &str
2686        let metadata = MetadataBuilder::from_iter(["a", "b", "c"]);
2687        assert_eq!(metadata.num_field_names(), 3);
2688
2689        // string
2690        let metadata =
2691            MetadataBuilder::from_iter(vec!["a".to_string(), "b".to_string(), "c".to_string()]);
2692        assert_eq!(metadata.num_field_names(), 3);
2693
2694        // mixed types (anything that implements AsRef<str>)
2695        let field_names: Vec<Box<str>> = vec!["a".into(), "b".into(), "c".into()];
2696        let metadata = MetadataBuilder::from_iter(field_names);
2697        assert_eq!(metadata.num_field_names(), 3);
2698    }
2699
2700    /// Test reusing buffers with nested objects
2701    #[test]
2702    fn test_with_existing_buffers_nested() {
2703        let mut builder = VariantBuilder::new();
2704        append_test_list(&mut builder);
2705        let (m1, v1) = builder.finish();
2706        let variant1 = Variant::new(&m1, &v1);
2707
2708        let mut builder = VariantBuilder::new();
2709        append_test_object(&mut builder);
2710        let (m2, v2) = builder.finish();
2711        let variant2 = Variant::new(&m2, &v2);
2712
2713        let mut builder = VariantBuilder::new();
2714        builder.append_value("This is a string");
2715        let (m3, v3) = builder.finish();
2716        let variant3 = Variant::new(&m3, &v3);
2717
2718        // Now, append those three variants to the a new buffer that is reused
2719        let mut builder = VariantBuilder::new();
2720        append_test_list(&mut builder);
2721        let (metadata, value) = builder.finish();
2722        let (meta1_offset, meta1_end) = (0, metadata.len());
2723        let (value1_offset, value1_end) = (0, value.len());
2724
2725        // reuse same buffer
2726        let mut builder = VariantBuilder::new_with_buffers(metadata, value);
2727        append_test_object(&mut builder);
2728        let (metadata, value) = builder.finish();
2729        let (meta2_offset, meta2_end) = (meta1_end, metadata.len());
2730        let (value2_offset, value2_end) = (value1_end, value.len());
2731
2732        // Append a string
2733        let mut builder = VariantBuilder::new_with_buffers(metadata, value);
2734        builder.append_value("This is a string");
2735        let (metadata, value) = builder.finish();
2736        let (meta3_offset, meta3_end) = (meta2_end, metadata.len());
2737        let (value3_offset, value3_end) = (value2_end, value.len());
2738
2739        // verify we can read the variants back correctly
2740        let roundtrip1 = Variant::new(
2741            &metadata[meta1_offset..meta1_end],
2742            &value[value1_offset..value1_end],
2743        );
2744        assert_eq!(roundtrip1, variant1,);
2745
2746        let roundtrip2 = Variant::new(
2747            &metadata[meta2_offset..meta2_end],
2748            &value[value2_offset..value2_end],
2749        );
2750        assert_eq!(roundtrip2, variant2,);
2751
2752        let roundtrip3 = Variant::new(
2753            &metadata[meta3_offset..meta3_end],
2754            &value[value3_offset..value3_end],
2755        );
2756        assert_eq!(roundtrip3, variant3);
2757    }
2758
2759    /// append a simple List variant
2760    fn append_test_list(builder: &mut VariantBuilder) {
2761        builder
2762            .new_list()
2763            .with_value(1234)
2764            .with_value("a string value")
2765            .finish();
2766    }
2767
2768    /// append an object variant
2769    fn append_test_object(builder: &mut VariantBuilder) {
2770        let mut obj = builder.new_object();
2771        obj.insert("a", true);
2772        obj.finish().unwrap();
2773    }
2774
2775    #[test]
2776    fn test_variant_builder_to_list_builder_no_finish() {
2777        // Create a list builder but never finish it
2778        let mut builder = VariantBuilder::new();
2779        let mut list_builder = builder.new_list();
2780        list_builder.append_value("hi");
2781        drop(list_builder);
2782
2783        builder.append_value(42i8);
2784
2785        // The original builder should be unchanged
2786        let (metadata, value) = builder.finish();
2787        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2788        assert!(metadata.is_empty());
2789
2790        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2791        assert_eq!(variant, Variant::Int8(42));
2792    }
2793
2794    #[test]
2795    fn test_variant_builder_to_object_builder_no_finish() {
2796        // Create an object builder but never finish it
2797        let mut builder = VariantBuilder::new();
2798        let mut object_builder = builder.new_object();
2799        object_builder.insert("name", "unknown");
2800        drop(object_builder);
2801
2802        builder.append_value(42i8);
2803
2804        // The original builder should be unchanged
2805        let (metadata, value) = builder.finish();
2806        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2807        assert!(metadata.is_empty()); // rolled back
2808
2809        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2810        assert_eq!(variant, Variant::Int8(42));
2811    }
2812
2813    #[test]
2814    fn test_list_builder_to_list_builder_inner_no_finish() {
2815        let mut builder = VariantBuilder::new();
2816        let mut list_builder = builder.new_list();
2817        list_builder.append_value(1i8);
2818
2819        // Create a nested list builder but never finish it
2820        let mut nested_list_builder = list_builder.new_list();
2821        nested_list_builder.append_value("hi");
2822        drop(nested_list_builder);
2823
2824        list_builder.append_value(2i8);
2825
2826        // The parent list should only contain the original values
2827        list_builder.finish();
2828        let (metadata, value) = builder.finish();
2829        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2830        assert!(metadata.is_empty());
2831
2832        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2833        let list = variant.as_list().unwrap();
2834        assert_eq!(list.len(), 2);
2835        assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
2836        assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
2837    }
2838
2839    #[test]
2840    fn test_list_builder_to_list_builder_outer_no_finish() {
2841        let mut builder = VariantBuilder::new();
2842        let mut list_builder = builder.new_list();
2843        list_builder.append_value(1i8);
2844
2845        // Create a nested list builder and finish it
2846        let mut nested_list_builder = list_builder.new_list();
2847        nested_list_builder.append_value("hi");
2848        nested_list_builder.finish();
2849
2850        // Drop the outer list builder without finishing it
2851        drop(list_builder);
2852
2853        builder.append_value(2i8);
2854
2855        // Only the second attempt should appear in the final variant
2856        let (metadata, value) = builder.finish();
2857        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2858        assert!(metadata.is_empty());
2859
2860        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2861        assert_eq!(variant, Variant::Int8(2));
2862    }
2863
2864    #[test]
2865    fn test_list_builder_to_object_builder_inner_no_finish() {
2866        let mut builder = VariantBuilder::new();
2867        let mut list_builder = builder.new_list();
2868        list_builder.append_value(1i8);
2869
2870        // Create a nested object builder but never finish it
2871        let mut nested_object_builder = list_builder.new_object();
2872        nested_object_builder.insert("name", "unknown");
2873        drop(nested_object_builder);
2874
2875        list_builder.append_value(2i8);
2876
2877        // The parent list should only contain the original values
2878        list_builder.finish();
2879        let (metadata, value) = builder.finish();
2880        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2881        assert!(metadata.is_empty());
2882
2883        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2884        let list = variant.as_list().unwrap();
2885        assert_eq!(list.len(), 2);
2886        assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
2887        assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
2888    }
2889
2890    #[test]
2891    fn test_list_builder_to_object_builder_outer_no_finish() {
2892        let mut builder = VariantBuilder::new();
2893        let mut list_builder = builder.new_list();
2894        list_builder.append_value(1i8);
2895
2896        // Create a nested object builder and finish it
2897        let mut nested_object_builder = list_builder.new_object();
2898        nested_object_builder.insert("name", "unknown");
2899        nested_object_builder.finish().unwrap();
2900
2901        // Drop the outer list builder without finishing it
2902        drop(list_builder);
2903
2904        builder.append_value(2i8);
2905
2906        // Only the second attempt should appear in the final variant
2907        let (metadata, value) = builder.finish();
2908        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2909        assert!(metadata.is_empty()); // rolled back
2910
2911        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2912        assert_eq!(variant, Variant::Int8(2));
2913    }
2914
2915    #[test]
2916    fn test_object_builder_to_list_builder_inner_no_finish() {
2917        let mut builder = VariantBuilder::new();
2918        let mut object_builder = builder.new_object();
2919        object_builder.insert("first", 1i8);
2920
2921        // Create a nested list builder but never finish it
2922        let mut nested_list_builder = object_builder.new_list("nested");
2923        nested_list_builder.append_value("hi");
2924        drop(nested_list_builder);
2925
2926        object_builder.insert("second", 2i8);
2927
2928        // The parent object should only contain the original fields
2929        object_builder.finish().unwrap();
2930        let (metadata, value) = builder.finish();
2931        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2932        assert_eq!(metadata.len(), 1);
2933        assert_eq!(&metadata[0], "second");
2934
2935        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2936        let obj = variant.as_object().unwrap();
2937        assert_eq!(obj.len(), 1);
2938        assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
2939    }
2940
2941    #[test]
2942    fn test_object_builder_to_list_builder_outer_no_finish() {
2943        let mut builder = VariantBuilder::new();
2944        let mut object_builder = builder.new_object();
2945        object_builder.insert("first", 1i8);
2946
2947        // Create a nested list builder and finish it
2948        let mut nested_list_builder = object_builder.new_list("nested");
2949        nested_list_builder.append_value("hi");
2950        nested_list_builder.finish();
2951
2952        // Drop the outer object builder without finishing it
2953        drop(object_builder);
2954
2955        builder.append_value(2i8);
2956
2957        // Only the second attempt should appear in the final variant
2958        let (metadata, value) = builder.finish();
2959        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2960        assert!(metadata.is_empty()); // rolled back
2961
2962        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2963        assert_eq!(variant, Variant::Int8(2));
2964    }
2965
2966    #[test]
2967    fn test_object_builder_to_object_builder_inner_no_finish() {
2968        let mut builder = VariantBuilder::new();
2969        let mut object_builder = builder.new_object();
2970        object_builder.insert("first", 1i8);
2971
2972        // Create a nested object builder but never finish it
2973        let mut nested_object_builder = object_builder.new_object("nested");
2974        nested_object_builder.insert("name", "unknown");
2975        drop(nested_object_builder);
2976
2977        object_builder.insert("second", 2i8);
2978
2979        // The parent object should only contain the original fields
2980        object_builder.finish().unwrap();
2981        let (metadata, value) = builder.finish();
2982        let metadata = VariantMetadata::try_new(&metadata).unwrap();
2983        assert_eq!(metadata.len(), 1); // the fields of nested_object_builder has been rolled back
2984        assert_eq!(&metadata[0], "second");
2985
2986        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2987        let obj = variant.as_object().unwrap();
2988        assert_eq!(obj.len(), 1);
2989        assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
2990    }
2991
2992    #[test]
2993    fn test_object_builder_to_object_builder_outer_no_finish() {
2994        let mut builder = VariantBuilder::new();
2995        let mut object_builder = builder.new_object();
2996        object_builder.insert("first", 1i8);
2997
2998        // Create a nested object builder and finish it
2999        let mut nested_object_builder = object_builder.new_object("nested");
3000        nested_object_builder.insert("name", "unknown");
3001        nested_object_builder.finish().unwrap();
3002
3003        // Drop the outer object builder without finishing it
3004        drop(object_builder);
3005
3006        builder.append_value(2i8);
3007
3008        // Only the second attempt should appear in the final variant
3009        let (metadata, value) = builder.finish();
3010        let metadata = VariantMetadata::try_new(&metadata).unwrap();
3011        assert_eq!(metadata.len(), 0); // rolled back
3012
3013        let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3014        assert_eq!(variant, Variant::Int8(2));
3015    }
3016
3017    // matthew
3018    #[test]
3019    fn test_append_object() {
3020        let (m1, v1) = make_object();
3021        let variant = Variant::new(&m1, &v1);
3022
3023        let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3024
3025        builder.append_value(variant.clone());
3026
3027        let (metadata, value) = builder.finish();
3028        assert_eq!(variant, Variant::new(&metadata, &value));
3029    }
3030
3031    /// make an object variant with field names in reverse lexicographical order
3032    fn make_object() -> (Vec<u8>, Vec<u8>) {
3033        let mut builder = VariantBuilder::new();
3034
3035        let mut obj = builder.new_object();
3036
3037        obj.insert("b", true);
3038        obj.insert("a", false);
3039        obj.finish().unwrap();
3040        builder.finish()
3041    }
3042
3043    #[test]
3044    fn test_append_nested_object() {
3045        let (m1, v1) = make_nested_object();
3046        let variant = Variant::new(&m1, &v1);
3047
3048        // because we can guarantee metadata is validated through the builder
3049        let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3050        builder.append_value(variant.clone());
3051
3052        let (metadata, value) = builder.finish();
3053        let result_variant = Variant::new(&metadata, &value);
3054
3055        assert_eq!(variant, result_variant);
3056    }
3057
3058    /// make a nested object variant
3059    fn make_nested_object() -> (Vec<u8>, Vec<u8>) {
3060        let mut builder = VariantBuilder::new();
3061
3062        {
3063            let mut outer_obj = builder.new_object();
3064
3065            {
3066                let mut inner_obj = outer_obj.new_object("b");
3067                inner_obj.insert("a", "inner_value");
3068                inner_obj.finish().unwrap();
3069            }
3070
3071            outer_obj.finish().unwrap();
3072        }
3073
3074        builder.finish()
3075    }
3076
3077    #[test]
3078    fn test_append_list() {
3079        let (m1, v1) = make_list();
3080        let variant = Variant::new(&m1, &v1);
3081        let mut builder = VariantBuilder::new();
3082        builder.append_value(variant.clone());
3083        let (metadata, value) = builder.finish();
3084        assert_eq!(variant, Variant::new(&metadata, &value));
3085    }
3086
3087    /// make a simple List variant
3088    fn make_list() -> (Vec<u8>, Vec<u8>) {
3089        let mut builder = VariantBuilder::new();
3090
3091        builder
3092            .new_list()
3093            .with_value(1234)
3094            .with_value("a string value")
3095            .finish();
3096
3097        builder.finish()
3098    }
3099
3100    #[test]
3101    fn test_append_nested_list() {
3102        let (m1, v1) = make_nested_list();
3103        let variant = Variant::new(&m1, &v1);
3104        let mut builder = VariantBuilder::new();
3105        builder.append_value(variant.clone());
3106        let (metadata, value) = builder.finish();
3107        assert_eq!(variant, Variant::new(&metadata, &value));
3108    }
3109
3110    fn make_nested_list() -> (Vec<u8>, Vec<u8>) {
3111        let mut builder = VariantBuilder::new();
3112        let mut list = builder.new_list();
3113
3114        //create inner list
3115        list.new_list()
3116            .with_value("the dog licked the oil")
3117            .with_value(4.3)
3118            .finish();
3119
3120        list.finish();
3121
3122        builder.finish()
3123    }
3124}