parquet_variant/builder/
object.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::builder::list::ListBuilder;
18use crate::builder::metadata::MetadataBuilder;
19use crate::decoder::VariantBasicType;
20use crate::{
21    BASIC_TYPE_BITS, BuilderSpecificState, ParentState, ValueBuilder, Variant, VariantBuilderExt,
22    int_size,
23};
24use arrow_schema::ArrowError;
25use indexmap::IndexMap;
26
27fn object_header(large: bool, id_size: u8, offset_size: u8) -> u8 {
28    let large_bit = if large { 1 } else { 0 };
29    (large_bit << (BASIC_TYPE_BITS + 4))
30        | ((id_size - 1) << (BASIC_TYPE_BITS + 2))
31        | ((offset_size - 1) << BASIC_TYPE_BITS)
32        | VariantBasicType::Object as u8
33}
34
35/// A builder for creating [`Variant::Object`] values.
36///
37/// See the examples on [`VariantBuilder`] for usage.
38///
39/// [`VariantBuilder`]: crate::VariantBuilder
40#[derive(Debug)]
41pub struct ObjectBuilder<'a, S: BuilderSpecificState> {
42    parent_state: ParentState<'a, S>,
43    pub(crate) fields: IndexMap<u32, usize>, // (field_id, offset)
44    validate_unique_fields: bool,
45}
46
47impl<'a, S: BuilderSpecificState> ObjectBuilder<'a, S> {
48    /// Creates a new object builder, nested on top of the given parent state.
49    pub fn new(parent_state: ParentState<'a, S>, validate_unique_fields: bool) -> Self {
50        Self {
51            parent_state,
52            fields: IndexMap::new(),
53            validate_unique_fields,
54        }
55    }
56
57    /// Add a field with key and value to the object
58    ///
59    /// # See Also
60    /// - [`ObjectBuilder::try_insert`] for a fallible version.
61    /// - [`ObjectBuilder::with_field`] for a builder-style API.
62    ///
63    /// # Panics
64    ///
65    /// This method will panic if the variant contains duplicate field names in objects
66    /// when validation is enabled. For a fallible version, use [`ObjectBuilder::try_insert`]
67    pub fn insert<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, key: &str, value: T) {
68        let (state, _) = self.parent_state(key).unwrap();
69        ValueBuilder::append_variant(state, value.into())
70    }
71
72    /// Add a field with key and value to the object
73    ///
74    /// # See Also
75    /// - [`ObjectBuilder::insert`] for an infallible version that panics
76    /// - [`ObjectBuilder::try_with_field`] for a builder-style API.
77    ///
78    /// # Note
79    /// Attempting to insert a duplicate field name produces an error if unique field
80    /// validation is enabled. Otherwise, the new value overwrites the previous field mapping
81    /// without erasing the old value, resulting in a larger variant
82    pub fn try_insert<'m, 'd, T: Into<Variant<'m, 'd>>>(
83        &mut self,
84        key: &str,
85        value: T,
86    ) -> Result<(), ArrowError> {
87        let (state, _) = self.parent_state(key)?;
88        ValueBuilder::try_append_variant(state, value.into())
89    }
90
91    /// Add a field with key and value to the object by copying raw bytes when possible.
92    ///
93    /// For objects and lists, this directly copies their underlying byte representation instead of
94    /// performing a logical copy, and without touching the metadata builder. For other variant
95    /// types, this falls back to the standard append behavior.
96    ///
97    /// The caller must ensure that the metadata dictionary is already built and correct for
98    /// any objects or lists being appended, but the value's new field name is handled normally.
99    ///
100    /// # Panics
101    ///
102    /// This method will panic if the variant contains duplicate field names in objects
103    /// when validation is enabled. For a fallible version, use [`ObjectBuilder::try_insert_bytes`]
104    pub fn insert_bytes<'m, 'd>(&mut self, key: &str, value: impl Into<Variant<'m, 'd>>) {
105        self.try_insert_bytes(key, value).unwrap()
106    }
107
108    /// Add a field with key and value to the object by copying raw bytes when possible.
109    ///
110    /// For objects and lists, this directly copies their underlying byte representation instead of
111    /// performing a logical copy, and without touching the metadata builder. For other variant
112    /// types, this falls back to the standard append behavior.
113    ///
114    /// The caller must ensure that the metadata dictionary is already built and correct for
115    /// any objects or lists being appended, but the value's new field name is handled normally.
116    ///
117    /// # Note
118    /// When inserting duplicate keys, the new value overwrites the previous mapping,
119    /// but the old value remains in the buffer, resulting in a larger variant
120    pub fn try_insert_bytes<'m, 'd>(
121        &mut self,
122        key: &str,
123        value: impl Into<Variant<'m, 'd>>,
124    ) -> Result<(), ArrowError> {
125        let (state, _) = self.parent_state(key)?;
126        ValueBuilder::append_variant_bytes(state, value.into());
127        Ok(())
128    }
129
130    /// Builder style API for adding a field with key and value to the object
131    ///
132    /// Same as [`ObjectBuilder::insert`], but returns `self` for chaining.
133    pub fn with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, key: &str, value: T) -> Self {
134        self.insert(key, value);
135        self
136    }
137
138    /// Builder style API for adding a field with key and value to the object
139    ///
140    /// Same as [`ObjectBuilder::try_insert`], but returns `self` for chaining.
141    pub fn try_with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(
142        mut self,
143        key: &str,
144        value: T,
145    ) -> Result<Self, ArrowError> {
146        self.try_insert(key, value)?;
147        Ok(self)
148    }
149
150    /// Enables validation for unique field keys when inserting into this object.
151    ///
152    /// When this is enabled, calling [`ObjectBuilder::finish`] will return an error
153    /// if any duplicate field keys were added using [`ObjectBuilder::insert`].
154    pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
155        self.validate_unique_fields = validate_unique_fields;
156        self
157    }
158
159    // Returns validate_unique_fields because we can no longer reference self once this method returns.
160    fn parent_state<'b>(
161        &'b mut self,
162        field_name: &str,
163    ) -> Result<(ParentState<'b, ObjectState<'b>>, bool), ArrowError> {
164        let validate_unique_fields = self.validate_unique_fields;
165        let state = ParentState::try_object(
166            self.parent_state.value_builder,
167            self.parent_state.metadata_builder,
168            &mut self.fields,
169            self.parent_state.saved_value_builder_offset,
170            field_name,
171            validate_unique_fields,
172        )?;
173        Ok((state, validate_unique_fields))
174    }
175
176    /// Returns an object builder that can be used to append a new (nested) object to this object.
177    ///
178    /// Panics if the proposed key was a duplicate
179    ///
180    /// WARNING: The builder will have no effect unless/until [`ObjectBuilder::finish`] is called.
181    pub fn new_object<'b>(&'b mut self, key: &'b str) -> ObjectBuilder<'b, ObjectState<'b>> {
182        self.try_new_object(key).unwrap()
183    }
184
185    /// Returns an object builder that can be used to append a new (nested) object to this object.
186    ///
187    /// Fails if the proposed key was a duplicate
188    ///
189    /// WARNING: The builder will have no effect unless/until [`ObjectBuilder::finish`] is called.
190    pub fn try_new_object<'b>(
191        &'b mut self,
192        key: &str,
193    ) -> Result<ObjectBuilder<'b, ObjectState<'b>>, ArrowError> {
194        let (parent_state, validate_unique_fields) = self.parent_state(key)?;
195        Ok(ObjectBuilder::new(parent_state, validate_unique_fields))
196    }
197
198    /// Returns a list builder that can be used to append a new (nested) list to this object.
199    ///
200    /// Panics if the proposed key was a duplicate
201    ///
202    /// WARNING: The builder will have no effect unless/until [`ListBuilder::finish`] is called.
203    pub fn new_list<'b>(&'b mut self, key: &str) -> ListBuilder<'b, ObjectState<'b>> {
204        self.try_new_list(key).unwrap()
205    }
206
207    /// Returns a list builder that can be used to append a new (nested) list to this object.
208    ///
209    /// Fails if the proposed key was a duplicate
210    ///
211    /// WARNING: The builder will have no effect unless/until [`ListBuilder::finish`] is called.
212    pub fn try_new_list<'b>(
213        &'b mut self,
214        key: &str,
215    ) -> Result<ListBuilder<'b, ObjectState<'b>>, ArrowError> {
216        let (parent_state, validate_unique_fields) = self.parent_state(key)?;
217        Ok(ListBuilder::new(parent_state, validate_unique_fields))
218    }
219
220    /// Finalizes this object and appends it to its parent, which otherwise remains unmodified.
221    pub fn finish(mut self) {
222        let metadata_builder = self.parent_state.metadata_builder();
223
224        self.fields.sort_by(|&field_a_id, _, &field_b_id, _| {
225            let field_a_name = metadata_builder.field_name(field_a_id as usize);
226            let field_b_name = metadata_builder.field_name(field_b_id as usize);
227            field_a_name.cmp(field_b_name)
228        });
229
230        let max_id = self.fields.iter().map(|(i, _)| *i).max().unwrap_or(0);
231        let id_size = int_size(max_id as usize);
232
233        let starting_offset = self.parent_state.saved_value_builder_offset;
234        let value_builder = self.parent_state.value_builder();
235        let current_offset = value_builder.offset();
236        // Current object starts from `object_start_offset`
237        let data_size = current_offset - starting_offset;
238        let offset_size = int_size(data_size);
239
240        let num_fields = self.fields.len();
241        let is_large = num_fields > u8::MAX as usize;
242
243        let header_size = 1 + // header byte
244            (if is_large { 4 } else { 1 }) + // num_fields
245            (num_fields * id_size as usize) + // field IDs
246            ((num_fields + 1) * offset_size as usize); // field offsets + data_size
247
248        // Shift existing data to make room for the header
249        value_builder.inner_mut().splice(
250            starting_offset..starting_offset,
251            std::iter::repeat_n(0u8, header_size),
252        );
253
254        // Write header at the original start position
255        let mut header_pos = starting_offset;
256
257        // Write header byte
258        let header = object_header(is_large, id_size, offset_size);
259
260        header_pos = self
261            .parent_state
262            .value_builder()
263            .append_header_start_from_buf_pos(header_pos, header, is_large, num_fields);
264
265        header_pos = self
266            .parent_state
267            .value_builder()
268            .append_offset_array_start_from_buf_pos(
269                header_pos,
270                self.fields.keys().copied().map(|id| id as usize),
271                None,
272                id_size,
273            );
274
275        self.parent_state
276            .value_builder()
277            .append_offset_array_start_from_buf_pos(
278                header_pos,
279                self.fields.values().copied(),
280                Some(data_size),
281                offset_size,
282            );
283        self.parent_state.finish();
284    }
285}
286
287impl<'a, 'm, 'v, S, K, V> Extend<(K, V)> for ObjectBuilder<'a, S>
288where
289    S: BuilderSpecificState,
290    K: AsRef<str>,
291    V: Into<Variant<'m, 'v>>,
292{
293    fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
294        for (key, value) in iter.into_iter() {
295            self.insert(key.as_ref(), value);
296        }
297    }
298}
299
300/// Internal state for object building
301#[derive(Debug)]
302pub struct ObjectState<'a> {
303    fields: &'a mut IndexMap<u32, usize>,
304    saved_fields_size: usize,
305}
306
307// `ObjectBuilder::finish()` eagerly updates the field offsets, which we should rollback on failure.
308impl BuilderSpecificState for ObjectState<'_> {
309    fn rollback(&mut self) {
310        self.fields.truncate(self.saved_fields_size);
311    }
312}
313
314impl<'a> ParentState<'a, ObjectState<'a>> {
315    /// Creates a new instance suitable for an [`ObjectBuilder`]. The value and metadata builder state
316    /// is checkpointed and will roll back on drop, unless [`Self::finish`] is called. The new
317    /// field's name and offset are also captured eagerly and will also roll back if not finished.
318    ///
319    /// The call fails if the field name is invalid (e.g. because it duplicates an existing field).
320    pub fn try_object(
321        value_builder: &'a mut ValueBuilder,
322        metadata_builder: &'a mut dyn MetadataBuilder,
323        fields: &'a mut IndexMap<u32, usize>,
324        saved_parent_value_builder_offset: usize,
325        field_name: &str,
326        validate_unique_fields: bool,
327    ) -> Result<Self, ArrowError> {
328        // The saved_parent_buffer_offset is the buffer size as of when the parent builder was
329        // constructed. The saved_buffer_offset is the buffer size as of now (when a child builder
330        // is created). The variant field_offset entry for this field is their difference.
331        let saved_value_builder_offset = value_builder.offset();
332        let saved_fields_size = fields.len();
333        let saved_metadata_builder_dict_size = metadata_builder.num_field_names();
334        let field_id = metadata_builder.try_upsert_field_name(field_name)?;
335        let field_start = saved_value_builder_offset - saved_parent_value_builder_offset;
336        if fields.insert(field_id, field_start).is_some() && validate_unique_fields {
337            return Err(ArrowError::InvalidArgumentError(format!(
338                "Duplicate field name: {field_name}"
339            )));
340        }
341
342        let builder_state = ObjectState {
343            fields,
344            saved_fields_size,
345        };
346        Ok(Self {
347            saved_metadata_builder_dict_size,
348            saved_value_builder_offset,
349            value_builder,
350            metadata_builder,
351            builder_state,
352            finished: false,
353        })
354    }
355}
356
357/// A [`VariantBuilderExt`] that inserts a new field into a variant object.
358pub struct ObjectFieldBuilder<'o, 'v, 's, S: BuilderSpecificState> {
359    key: &'s str,
360    builder: &'o mut ObjectBuilder<'v, S>,
361}
362
363impl<'o, 'v, 's, S: BuilderSpecificState> ObjectFieldBuilder<'o, 'v, 's, S> {
364    pub fn new(key: &'s str, builder: &'o mut ObjectBuilder<'v, S>) -> Self {
365        Self { key, builder }
366    }
367}
368
369impl<S: BuilderSpecificState> VariantBuilderExt for ObjectFieldBuilder<'_, '_, '_, S> {
370    type State<'a>
371        = ObjectState<'a>
372    where
373        Self: 'a;
374
375    /// A NULL object field is interpreted as missing, so nothing gets inserted at all.
376    fn append_null(&mut self) {}
377    fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
378        self.builder.insert(self.key, value);
379    }
380
381    fn try_new_list(&mut self) -> Result<ListBuilder<'_, Self::State<'_>>, ArrowError> {
382        self.builder.try_new_list(self.key)
383    }
384
385    fn try_new_object(&mut self) -> Result<ObjectBuilder<'_, Self::State<'_>>, ArrowError> {
386        self.builder.try_new_object(self.key)
387    }
388}
389
390#[cfg(test)]
391mod tests {
392    use crate::{
393        ParentState, ValueBuilder, Variant, VariantBuilder, VariantMetadata,
394        builder::{metadata::ReadOnlyMetadataBuilder, object::ObjectBuilder},
395        decoder::VariantBasicType,
396    };
397
398    #[test]
399    fn test_object() {
400        let mut builder = VariantBuilder::new();
401
402        builder
403            .new_object()
404            .with_field("name", "John")
405            .with_field("age", 42i8)
406            .finish();
407
408        let (metadata, value) = builder.finish();
409        assert!(!metadata.is_empty());
410        assert!(!value.is_empty());
411    }
412
413    #[test]
414    fn test_object_field_ordering() {
415        let mut builder = VariantBuilder::new();
416
417        builder
418            .new_object()
419            .with_field("zebra", "stripes")
420            .with_field("apple", "red")
421            .with_field("banana", "yellow")
422            .finish();
423
424        let (_, value) = builder.finish();
425
426        let header = value[0];
427        assert_eq!(header & 0x03, VariantBasicType::Object as u8);
428
429        let field_count = value[1] as usize;
430        assert_eq!(field_count, 3);
431
432        // Get field IDs from the object header
433        let field_ids: Vec<u8> = value[2..5].to_vec();
434
435        // apple(1), banana(2), zebra(0)
436        assert_eq!(field_ids, vec![1, 2, 0]);
437    }
438
439    #[test]
440    fn test_duplicate_fields_in_object() {
441        let mut builder = VariantBuilder::new();
442        builder
443            .new_object()
444            .with_field("name", "Ron Artest")
445            .with_field("name", "Metta World Peace") // Duplicate field
446            .finish();
447
448        let (metadata, value) = builder.finish();
449        let variant = Variant::try_new(&metadata, &value).unwrap();
450
451        let obj = variant.as_object().unwrap();
452        assert_eq!(obj.len(), 1);
453        assert_eq!(obj.field(0).unwrap(), Variant::from("Metta World Peace"));
454
455        assert_eq!(
456            vec![("name", Variant::from("Metta World Peace"))],
457            obj.iter().collect::<Vec<_>>()
458        );
459    }
460
461    #[test]
462    fn test_read_only_metadata_builder() {
463        // First create some metadata with a few field names
464        let mut default_builder = VariantBuilder::new();
465        default_builder.add_field_name("name");
466        default_builder.add_field_name("age");
467        default_builder.add_field_name("active");
468        let (metadata_bytes, _) = default_builder.finish();
469
470        // Use the metadata to build new variant values
471        let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
472        let mut metadata_builder = ReadOnlyMetadataBuilder::new(&metadata);
473        let mut value_builder = ValueBuilder::new();
474
475        {
476            let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
477            let mut obj = ObjectBuilder::new(state, false);
478
479            // These should succeed because the fields exist in the metadata
480            obj.insert("name", "Alice");
481            obj.insert("age", 30i8);
482            obj.insert("active", true);
483            obj.finish();
484        }
485
486        let value = value_builder.into_inner();
487
488        // Verify the variant was built correctly
489        let variant = Variant::try_new(&metadata_bytes, &value).unwrap();
490        let obj = variant.as_object().unwrap();
491        assert_eq!(obj.get("name"), Some(Variant::from("Alice")));
492        assert_eq!(obj.get("age"), Some(Variant::Int8(30)));
493        assert_eq!(obj.get("active"), Some(Variant::from(true)));
494    }
495
496    // matthew
497    #[test]
498    fn test_append_object() {
499        let (m1, v1) = make_object();
500        let variant = Variant::new(&m1, &v1);
501
502        let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
503
504        builder.append_value(variant.clone());
505
506        let (metadata, value) = builder.finish();
507        assert_eq!(variant, Variant::new(&metadata, &value));
508    }
509
510    /// make an object variant with field names in reverse lexicographical order
511    fn make_object() -> (Vec<u8>, Vec<u8>) {
512        let mut builder = VariantBuilder::new();
513
514        let mut obj = builder.new_object();
515
516        obj.insert("b", true);
517        obj.insert("a", false);
518        obj.finish();
519        builder.finish()
520    }
521
522    #[test]
523    fn test_append_nested_object() {
524        let (m1, v1) = make_nested_object();
525        let variant = Variant::new(&m1, &v1);
526
527        // because we can guarantee metadata is validated through the builder
528        let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
529        builder.append_value(variant.clone());
530
531        let (metadata, value) = builder.finish();
532        let result_variant = Variant::new(&metadata, &value);
533
534        assert_eq!(variant, result_variant);
535    }
536
537    /// make a nested object variant
538    fn make_nested_object() -> (Vec<u8>, Vec<u8>) {
539        let mut builder = VariantBuilder::new();
540
541        {
542            let mut outer_obj = builder.new_object();
543
544            {
545                let mut inner_obj = outer_obj.new_object("b");
546                inner_obj.insert("a", "inner_value");
547                inner_obj.finish();
548            }
549
550            outer_obj.finish();
551        }
552
553        builder.finish()
554    }
555
556    #[test]
557    fn test_nested_object() {
558        /*
559        {
560            "c": {
561                "b": "a"
562            }
563        }
564
565        */
566
567        let mut builder = VariantBuilder::new();
568        {
569            let mut outer_object_builder = builder.new_object();
570            {
571                let mut inner_object_builder = outer_object_builder.new_object("c");
572                inner_object_builder.insert("b", "a");
573                inner_object_builder.finish();
574            }
575
576            outer_object_builder.finish();
577        }
578
579        let (metadata, value) = builder.finish();
580        let variant = Variant::try_new(&metadata, &value).unwrap();
581        let outer_object = variant.as_object().unwrap();
582
583        assert_eq!(outer_object.len(), 1);
584        assert_eq!(outer_object.field_name(0).unwrap(), "c");
585
586        let inner_object_variant = outer_object.field(0).unwrap();
587        let inner_object = inner_object_variant.as_object().unwrap();
588
589        assert_eq!(inner_object.len(), 1);
590        assert_eq!(inner_object.field_name(0).unwrap(), "b");
591        assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
592    }
593
594    #[test]
595    fn test_nested_object_with_duplicate_field_names_per_object() {
596        /*
597        {
598            "c": {
599                "b": false,
600                "c": "a"
601            },
602            "b": false,
603        }
604
605        */
606
607        let mut builder = VariantBuilder::new();
608        {
609            let mut outer_object_builder = builder.new_object();
610            {
611                let mut inner_object_builder = outer_object_builder.new_object("c");
612                inner_object_builder.insert("b", false);
613                inner_object_builder.insert("c", "a");
614
615                inner_object_builder.finish();
616            }
617
618            outer_object_builder.insert("b", false);
619            outer_object_builder.finish();
620        }
621
622        let (metadata, value) = builder.finish();
623        let variant = Variant::try_new(&metadata, &value).unwrap();
624        let outer_object = variant.as_object().unwrap();
625
626        assert_eq!(outer_object.len(), 2);
627        assert_eq!(outer_object.field_name(0).unwrap(), "b");
628
629        let inner_object_variant = outer_object.field(1).unwrap();
630        let inner_object = inner_object_variant.as_object().unwrap();
631
632        assert_eq!(inner_object.len(), 2);
633        assert_eq!(inner_object.field_name(0).unwrap(), "b");
634        assert_eq!(inner_object.field(0).unwrap(), Variant::from(false));
635        assert_eq!(inner_object.field_name(1).unwrap(), "c");
636        assert_eq!(inner_object.field(1).unwrap(), Variant::from("a"));
637    }
638
639    #[test]
640    fn test_nested_object_with_heterogeneous_fields() {
641        /*
642        {
643            "a": false,
644            "c": {
645                "b": "a",
646                "c": {
647                   "aa": "bb",
648                },
649                "d": {
650                    "cc": "dd"
651                }
652            },
653            "b": true,
654            "d": {
655               "e": 1,
656               "f": [1, true],
657               "g": ["tree", false],
658            }
659        }
660        */
661
662        let mut builder = VariantBuilder::new();
663        {
664            let mut outer_object_builder = builder.new_object();
665
666            outer_object_builder.insert("a", false);
667
668            {
669                let mut inner_object_builder = outer_object_builder.new_object("c");
670                inner_object_builder.insert("b", "a");
671
672                {
673                    let mut inner_inner_object_builder = inner_object_builder.new_object("c");
674                    inner_inner_object_builder.insert("aa", "bb");
675                    inner_inner_object_builder.finish();
676                }
677
678                {
679                    let mut inner_inner_object_builder = inner_object_builder.new_object("d");
680                    inner_inner_object_builder.insert("cc", "dd");
681                    inner_inner_object_builder.finish();
682                }
683                inner_object_builder.finish();
684            }
685
686            outer_object_builder.insert("b", true);
687
688            {
689                let mut inner_object_builder = outer_object_builder.new_object("d");
690                inner_object_builder.insert("e", 1);
691                {
692                    let mut inner_list_builder = inner_object_builder.new_list("f");
693                    inner_list_builder.append_value(1);
694                    inner_list_builder.append_value(true);
695
696                    inner_list_builder.finish();
697                }
698
699                {
700                    let mut inner_list_builder = inner_object_builder.new_list("g");
701                    inner_list_builder.append_value("tree");
702                    inner_list_builder.append_value(false);
703
704                    inner_list_builder.finish();
705                }
706
707                inner_object_builder.finish();
708            }
709
710            outer_object_builder.finish();
711        }
712
713        let (metadata, value) = builder.finish();
714
715        // note, object fields are now sorted lexigraphically by field name
716        /*
717         {
718            "a": false,
719            "b": true,
720            "c": {
721                "b": "a",
722                "c": {
723                   "aa": "bb",
724                },
725                "d": {
726                    "cc": "dd"
727                }
728            },
729            "d": {
730               "e": 1,
731               "f": [1, true],
732               "g": ["tree", false],
733            }
734        }
735        */
736
737        let variant = Variant::try_new(&metadata, &value).unwrap();
738        let outer_object = variant.as_object().unwrap();
739
740        assert_eq!(outer_object.len(), 4);
741
742        assert_eq!(outer_object.field_name(0).unwrap(), "a");
743        assert_eq!(outer_object.field(0).unwrap(), Variant::from(false));
744
745        assert_eq!(outer_object.field_name(2).unwrap(), "c");
746
747        let inner_object_variant = outer_object.field(2).unwrap();
748        let inner_object = inner_object_variant.as_object().unwrap();
749
750        assert_eq!(inner_object.len(), 3);
751        assert_eq!(inner_object.field_name(0).unwrap(), "b");
752        assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
753
754        let inner_iner_object_variant_c = inner_object.field(1).unwrap();
755        let inner_inner_object_c = inner_iner_object_variant_c.as_object().unwrap();
756        assert_eq!(inner_inner_object_c.len(), 1);
757        assert_eq!(inner_inner_object_c.field_name(0).unwrap(), "aa");
758        assert_eq!(inner_inner_object_c.field(0).unwrap(), Variant::from("bb"));
759
760        let inner_iner_object_variant_d = inner_object.field(2).unwrap();
761        let inner_inner_object_d = inner_iner_object_variant_d.as_object().unwrap();
762        assert_eq!(inner_inner_object_d.len(), 1);
763        assert_eq!(inner_inner_object_d.field_name(0).unwrap(), "cc");
764        assert_eq!(inner_inner_object_d.field(0).unwrap(), Variant::from("dd"));
765
766        assert_eq!(outer_object.field_name(1).unwrap(), "b");
767        assert_eq!(outer_object.field(1).unwrap(), Variant::from(true));
768
769        let out_object_variant_d = outer_object.field(3).unwrap();
770        let out_object_d = out_object_variant_d.as_object().unwrap();
771        assert_eq!(out_object_d.len(), 3);
772        assert_eq!("e", out_object_d.field_name(0).unwrap());
773        assert_eq!(Variant::from(1), out_object_d.field(0).unwrap());
774        assert_eq!("f", out_object_d.field_name(1).unwrap());
775
776        let first_inner_list_variant_f = out_object_d.field(1).unwrap();
777        let first_inner_list_f = first_inner_list_variant_f.as_list().unwrap();
778        assert_eq!(2, first_inner_list_f.len());
779        assert_eq!(Variant::from(1), first_inner_list_f.get(0).unwrap());
780        assert_eq!(Variant::from(true), first_inner_list_f.get(1).unwrap());
781
782        let second_inner_list_variant_g = out_object_d.field(2).unwrap();
783        let second_inner_list_g = second_inner_list_variant_g.as_list().unwrap();
784        assert_eq!(2, second_inner_list_g.len());
785        assert_eq!(Variant::from("tree"), second_inner_list_g.get(0).unwrap());
786        assert_eq!(Variant::from(false), second_inner_list_g.get(1).unwrap());
787    }
788
789    #[test]
790    fn test_object_without_unique_field_validation() {
791        let mut builder = VariantBuilder::new();
792
793        // Root object with duplicates
794        let mut obj = builder.new_object();
795        obj.insert("a", 1);
796        obj.insert("a", 2);
797        obj.finish();
798
799        // Deeply nested list structure with duplicates
800        let mut builder = VariantBuilder::new();
801        let mut outer_list = builder.new_list();
802        let mut inner_list = outer_list.new_list();
803        let mut nested_obj = inner_list.new_object();
804        nested_obj.insert("x", 1);
805        nested_obj.insert("x", 2);
806        nested_obj.new_list("x").with_value(3).finish();
807        nested_obj.new_object("x").with_field("y", 4).finish();
808        nested_obj.finish();
809        inner_list.finish();
810        outer_list.finish();
811
812        // Verify the nested object is built correctly -- the nested object "x" should have "won"
813        let (metadata, value) = builder.finish();
814        let variant = Variant::try_new(&metadata, &value).unwrap();
815        let outer_element = variant.get_list_element(0).unwrap();
816        let inner_element = outer_element.get_list_element(0).unwrap();
817        let outer_field = inner_element.get_object_field("x").unwrap();
818        let inner_field = outer_field.get_object_field("y").unwrap();
819        assert_eq!(inner_field, Variant::from(4));
820    }
821
822    #[test]
823    fn test_object_with_unique_field_validation() {
824        let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
825
826        // Root-level object with duplicates
827        let result = builder
828            .new_object()
829            .with_field("a", 1)
830            .with_field("b", 2)
831            .try_with_field("a", 3);
832        assert_eq!(
833            result.unwrap_err().to_string(),
834            "Invalid argument error: Duplicate field name: a"
835        );
836
837        // Deeply nested list -> list -> object with duplicate
838        let mut outer_list = builder.new_list();
839        let mut inner_list = outer_list.new_list();
840        let mut object = inner_list.new_object().with_field("x", 1);
841        let nested_result = object.try_insert("x", 2);
842        assert_eq!(
843            nested_result.unwrap_err().to_string(),
844            "Invalid argument error: Duplicate field name: x"
845        );
846        let nested_result = object.try_new_list("x");
847        assert_eq!(
848            nested_result.unwrap_err().to_string(),
849            "Invalid argument error: Duplicate field name: x"
850        );
851
852        let nested_result = object.try_new_object("x");
853        assert_eq!(
854            nested_result.unwrap_err().to_string(),
855            "Invalid argument error: Duplicate field name: x"
856        );
857
858        drop(object);
859        inner_list.finish();
860        outer_list.finish();
861
862        // Valid object should succeed
863        let mut list = builder.new_list();
864        let mut valid_obj = list.new_object();
865        valid_obj.insert("m", 1);
866        valid_obj.insert("n", 2);
867
868        valid_obj.finish();
869        list.finish();
870    }
871}