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