1use crate::decoder::{VariantBasicType, VariantPrimitiveType};
18use crate::{
19 ShortString, Variant, VariantDecimal16, VariantDecimal4, VariantDecimal8, VariantList,
20 VariantMetadata, VariantObject,
21};
22use arrow_schema::ArrowError;
23use chrono::Timelike;
24use indexmap::{IndexMap, IndexSet};
25use uuid::Uuid;
26
27use std::collections::HashMap;
28
29const BASIC_TYPE_BITS: u8 = 2;
30const UNIX_EPOCH_DATE: chrono::NaiveDate = chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
31
32fn primitive_header(primitive_type: VariantPrimitiveType) -> u8 {
33 (primitive_type as u8) << 2 | VariantBasicType::Primitive as u8
34}
35
36fn short_string_header(len: usize) -> u8 {
37 (len as u8) << 2 | VariantBasicType::ShortString as u8
38}
39
40fn array_header(large: bool, offset_size: u8) -> u8 {
41 let large_bit = if large { 1 } else { 0 };
42 (large_bit << (BASIC_TYPE_BITS + 2))
43 | ((offset_size - 1) << BASIC_TYPE_BITS)
44 | VariantBasicType::Array as u8
45}
46
47fn object_header(large: bool, id_size: u8, offset_size: u8) -> u8 {
48 let large_bit = if large { 1 } else { 0 };
49 (large_bit << (BASIC_TYPE_BITS + 4))
50 | ((id_size - 1) << (BASIC_TYPE_BITS + 2))
51 | ((offset_size - 1) << BASIC_TYPE_BITS)
52 | VariantBasicType::Object as u8
53}
54
55fn int_size(v: usize) -> u8 {
56 match v {
57 0..=0xFF => 1,
58 0x100..=0xFFFF => 2,
59 0x10000..=0xFFFFFF => 3,
60 _ => 4,
61 }
62}
63
64fn 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
70fn 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
76fn 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#[derive(Debug, Default)]
91pub struct ValueBuilder(Vec<u8>);
92
93impl ValueBuilder {
94 pub fn new() -> Self {
96 Default::default()
97 }
98}
99
100macro_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 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 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(µs.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(µs.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(µs_from_midnight.to_le_bytes());
223 }
224
225 fn append_timestamp_nanos(&mut self, value: chrono::DateTime<chrono::Utc>) {
226 self.append_primitive_header(VariantPrimitiveType::TimestampNanos);
227 let nanos = value.timestamp_nanos_opt().unwrap();
228 self.append_slice(&nanos.to_le_bytes());
229 }
230
231 fn append_timestamp_ntz_nanos(&mut self, value: chrono::NaiveDateTime) {
232 self.append_primitive_header(VariantPrimitiveType::TimestampNtzNanos);
233 let nanos = value.and_utc().timestamp_nanos_opt().unwrap();
234 self.append_slice(&nanos.to_le_bytes());
235 }
236
237 fn append_uuid(&mut self, value: Uuid) {
238 self.append_primitive_header(VariantPrimitiveType::Uuid);
239 self.append_slice(&value.into_bytes());
240 }
241
242 fn append_decimal4(&mut self, decimal4: VariantDecimal4) {
243 self.append_primitive_header(VariantPrimitiveType::Decimal4);
244 self.append_u8(decimal4.scale());
245 self.append_slice(&decimal4.integer().to_le_bytes());
246 }
247
248 fn append_decimal8(&mut self, decimal8: VariantDecimal8) {
249 self.append_primitive_header(VariantPrimitiveType::Decimal8);
250 self.append_u8(decimal8.scale());
251 self.append_slice(&decimal8.integer().to_le_bytes());
252 }
253
254 fn append_decimal16(&mut self, decimal16: VariantDecimal16) {
255 self.append_primitive_header(VariantPrimitiveType::Decimal16);
256 self.append_u8(decimal16.scale());
257 self.append_slice(&decimal16.integer().to_le_bytes());
258 }
259
260 fn append_binary(&mut self, value: &[u8]) {
261 self.append_primitive_header(VariantPrimitiveType::Binary);
262 self.append_slice(&(value.len() as u32).to_le_bytes());
263 self.append_slice(value);
264 }
265
266 fn append_short_string(&mut self, value: ShortString) {
267 let inner = value.0;
268 self.append_u8(short_string_header(inner.len()));
269 self.append_slice(inner.as_bytes());
270 }
271
272 fn append_string(&mut self, value: &str) {
273 self.append_primitive_header(VariantPrimitiveType::String);
274 self.append_slice(&(value.len() as u32).to_le_bytes());
275 self.append_slice(value.as_bytes());
276 }
277
278 fn append_object(state: ParentState<'_>, obj: VariantObject) {
279 let mut object_builder = ObjectBuilder::new(state, false);
280
281 for (field_name, value) in obj.iter() {
282 object_builder.insert(field_name, value);
283 }
284
285 object_builder.finish();
286 }
287
288 fn try_append_object(state: ParentState<'_>, obj: VariantObject) -> Result<(), ArrowError> {
289 let mut object_builder = ObjectBuilder::new(state, false);
290
291 for res in obj.iter_try() {
292 let (field_name, value) = res?;
293 object_builder.try_insert(field_name, value)?;
294 }
295
296 object_builder.finish();
297 Ok(())
298 }
299
300 fn append_list(state: ParentState<'_>, list: VariantList) {
301 let mut list_builder = ListBuilder::new(state, false);
302 for value in list.iter() {
303 list_builder.append_value(value);
304 }
305 list_builder.finish();
306 }
307
308 fn try_append_list(state: ParentState<'_>, list: VariantList) -> Result<(), ArrowError> {
309 let mut list_builder = ListBuilder::new(state, false);
310 for res in list.iter_try() {
311 let value = res?;
312 list_builder.try_append_value(value)?;
313 }
314
315 list_builder.finish();
316
317 Ok(())
318 }
319
320 pub fn offset(&self) -> usize {
322 self.0.len()
323 }
324
325 pub fn append_variant(mut state: ParentState<'_>, variant: Variant<'_, '_>) {
332 let builder = state.value_builder();
333 variant_append_value!(
334 builder,
335 variant,
336 Variant::Object(obj) => return Self::append_object(state, obj),
337 Variant::List(list) => return Self::append_list(state, list)
338 );
339 state.finish();
340 }
341
342 pub fn try_append_variant(
347 mut state: ParentState<'_>,
348 variant: Variant<'_, '_>,
349 ) -> Result<(), ArrowError> {
350 let builder = state.value_builder();
351 variant_append_value!(
352 builder,
353 variant,
354 Variant::Object(obj) => return Self::try_append_object(state, obj),
355 Variant::List(list) => return Self::try_append_list(state, list)
356 );
357 state.finish();
358 Ok(())
359 }
360
361 pub fn append_variant_bytes(mut state: ParentState<'_>, variant: Variant<'_, '_>) {
370 let builder = state.value_builder();
371 variant_append_value!(
372 builder,
373 variant,
374 Variant::Object(obj) => builder.append_slice(obj.value),
375 Variant::List(list) => builder.append_slice(list.value)
376 );
377 state.finish();
378 }
379
380 fn append_header_start_from_buf_pos(
383 &mut self,
384 start_pos: usize, header_byte: u8,
386 is_large: bool,
387 num_fields: usize,
388 ) -> usize {
389 let buffer = self.inner_mut();
390
391 let mut header_pos = start_pos;
393
394 buffer[header_pos] = header_byte;
396 header_pos += 1;
397
398 if is_large {
400 buffer[header_pos..header_pos + 4].copy_from_slice(&(num_fields as u32).to_le_bytes());
401 header_pos += 4;
402 } else {
403 buffer[header_pos] = num_fields as u8;
404 header_pos += 1;
405 }
406
407 header_pos
408 }
409
410 fn append_offset_array_start_from_buf_pos(
413 &mut self,
414 start_pos: usize,
415 offsets: impl IntoIterator<Item = usize>,
416 data_size: Option<usize>,
417 nbytes: u8,
418 ) -> usize {
419 let buf = self.inner_mut();
420
421 let mut current_pos = start_pos;
422 for relative_offset in offsets {
423 write_offset_at_pos(buf, current_pos, relative_offset, nbytes);
424 current_pos += nbytes as usize;
425 }
426
427 if let Some(data_size) = data_size {
429 write_offset_at_pos(buf, current_pos, data_size, nbytes);
431 current_pos += nbytes as usize;
432 }
433
434 current_pos
435 }
436}
437
438pub trait MetadataBuilder: std::fmt::Debug {
442 fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError>;
446
447 fn field_name(&self, field_id: usize) -> &str;
450
451 fn num_field_names(&self) -> usize;
455
456 fn truncate_field_names(&mut self, new_size: usize);
458
459 fn finish(&mut self) -> usize;
461}
462
463impl MetadataBuilder for WritableMetadataBuilder {
464 fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError> {
465 Ok(self.upsert_field_name(field_name))
466 }
467 fn field_name(&self, field_id: usize) -> &str {
468 self.field_name(field_id)
469 }
470 fn num_field_names(&self) -> usize {
471 self.num_field_names()
472 }
473 fn truncate_field_names(&mut self, new_size: usize) {
474 self.field_names.truncate(new_size)
475 }
476 fn finish(&mut self) -> usize {
477 self.finish()
478 }
479}
480
481#[derive(Debug)]
490pub struct ReadOnlyMetadataBuilder<'m> {
491 metadata: VariantMetadata<'m>,
492 known_field_names: HashMap<&'m str, u32>,
495}
496
497impl<'m> ReadOnlyMetadataBuilder<'m> {
498 pub fn new(metadata: VariantMetadata<'m>) -> Self {
500 Self {
501 metadata,
502 known_field_names: HashMap::new(),
503 }
504 }
505}
506
507impl MetadataBuilder for ReadOnlyMetadataBuilder<'_> {
508 fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError> {
509 if let Some(field_id) = self.known_field_names.get(field_name) {
510 return Ok(*field_id);
511 }
512
513 let Some((field_id, field_name)) = self.metadata.get_entry(field_name) else {
514 return Err(ArrowError::InvalidArgumentError(format!(
515 "Field name '{field_name}' not found in metadata dictionary"
516 )));
517 };
518
519 self.known_field_names.insert(field_name, field_id);
520 Ok(field_id)
521 }
522 fn field_name(&self, field_id: usize) -> &str {
523 &self.metadata[field_id]
524 }
525 fn num_field_names(&self) -> usize {
526 self.metadata.len()
527 }
528 fn truncate_field_names(&mut self, new_size: usize) {
529 debug_assert_eq!(self.metadata.len(), new_size);
530 }
531 fn finish(&mut self) -> usize {
532 self.metadata.bytes.len()
533 }
534}
535
536#[derive(Default, Debug)]
542pub struct WritableMetadataBuilder {
543 field_names: IndexSet<String>,
545
546 is_sorted: bool,
548
549 metadata_buffer: Vec<u8>,
551}
552
553impl WritableMetadataBuilder {
554 fn upsert_field_name(&mut self, field_name: &str) -> u32 {
556 let (id, new_entry) = self.field_names.insert_full(field_name.to_string());
557
558 if new_entry {
559 let n = self.num_field_names();
560
561 self.is_sorted =
566 n == 1 || self.is_sorted && (self.field_names[n - 2] < self.field_names[n - 1]);
567 }
568
569 id as u32
570 }
571
572 pub fn offset(&self) -> usize {
574 self.metadata_buffer.len()
575 }
576
577 fn num_field_names(&self) -> usize {
584 let n = self.field_names.len();
585 assert!(n <= u32::MAX as usize);
586
587 n
588 }
589
590 fn field_name(&self, i: usize) -> &str {
591 &self.field_names[i]
592 }
593
594 fn metadata_size(&self) -> usize {
595 self.field_names.iter().map(|k| k.len()).sum()
596 }
597
598 pub fn finish(&mut self) -> usize {
602 let nkeys = self.num_field_names();
603
604 let total_dict_size: usize = self.metadata_size();
606
607 let metadata_buffer = &mut self.metadata_buffer;
608 let is_sorted = std::mem::take(&mut self.is_sorted);
609 let field_names = std::mem::take(&mut self.field_names);
610
611 let max_offset = std::cmp::max(total_dict_size, nkeys);
613 let offset_size = int_size(max_offset);
614
615 let offset_start = 1 + offset_size as usize;
616 let string_start = offset_start + (nkeys + 1) * offset_size as usize;
617 let metadata_size = string_start + total_dict_size;
618
619 metadata_buffer.reserve(metadata_size);
620
621 metadata_buffer.push(0x01 | (is_sorted as u8) << 4 | ((offset_size - 1) << 6));
623
624 write_offset(metadata_buffer, nkeys, offset_size);
626
627 let mut cur_offset = 0;
629 for key in field_names.iter() {
630 write_offset(metadata_buffer, cur_offset, offset_size);
631 cur_offset += key.len();
632 }
633 write_offset(metadata_buffer, cur_offset, offset_size);
635
636 for key in field_names {
638 metadata_buffer.extend_from_slice(key.as_bytes());
639 }
640
641 metadata_buffer.len()
642 }
643
644 pub fn into_inner(self) -> Vec<u8> {
646 self.metadata_buffer
647 }
648}
649
650impl<S: AsRef<str>> FromIterator<S> for WritableMetadataBuilder {
651 fn from_iter<T: IntoIterator<Item = S>>(iter: T) -> Self {
652 let mut this = Self::default();
653 this.extend(iter);
654
655 this
656 }
657}
658
659impl<S: AsRef<str>> Extend<S> for WritableMetadataBuilder {
660 fn extend<T: IntoIterator<Item = S>>(&mut self, iter: T) {
661 let iter = iter.into_iter();
662 let (min, _) = iter.size_hint();
663
664 self.field_names.reserve(min);
665
666 for field_name in iter {
667 self.upsert_field_name(field_name.as_ref());
668 }
669 }
670}
671
672#[derive(Debug)]
686pub enum ParentState<'a> {
687 Variant {
688 value_builder: &'a mut ValueBuilder,
689 saved_value_builder_offset: usize,
690 metadata_builder: &'a mut dyn MetadataBuilder,
691 saved_metadata_builder_dict_size: usize,
692 finished: bool,
693 },
694 List {
695 value_builder: &'a mut ValueBuilder,
696 saved_value_builder_offset: usize,
697 metadata_builder: &'a mut dyn MetadataBuilder,
698 saved_metadata_builder_dict_size: usize,
699 offsets: &'a mut Vec<usize>,
700 saved_offsets_size: usize,
701 finished: bool,
702 },
703 Object {
704 value_builder: &'a mut ValueBuilder,
705 saved_value_builder_offset: usize,
706 metadata_builder: &'a mut dyn MetadataBuilder,
707 saved_metadata_builder_dict_size: usize,
708 fields: &'a mut IndexMap<u32, usize>,
709 saved_fields_size: usize,
710 finished: bool,
711 },
712}
713
714impl<'a> ParentState<'a> {
715 pub fn variant(
719 value_builder: &'a mut ValueBuilder,
720 metadata_builder: &'a mut dyn MetadataBuilder,
721 ) -> Self {
722 ParentState::Variant {
723 saved_value_builder_offset: value_builder.offset(),
724 saved_metadata_builder_dict_size: metadata_builder.num_field_names(),
725 value_builder,
726 metadata_builder,
727 finished: false,
728 }
729 }
730
731 pub fn list(
735 value_builder: &'a mut ValueBuilder,
736 metadata_builder: &'a mut dyn MetadataBuilder,
737 offsets: &'a mut Vec<usize>,
738 saved_parent_value_builder_offset: usize,
739 ) -> Self {
740 let saved_value_builder_offset = value_builder.offset();
744 let saved_offsets_size = offsets.len();
745 offsets.push(saved_value_builder_offset - saved_parent_value_builder_offset);
746
747 ParentState::List {
748 saved_metadata_builder_dict_size: metadata_builder.num_field_names(),
749 saved_value_builder_offset,
750 saved_offsets_size,
751 metadata_builder,
752 value_builder,
753 offsets,
754 finished: false,
755 }
756 }
757
758 pub fn try_object(
764 value_builder: &'a mut ValueBuilder,
765 metadata_builder: &'a mut dyn MetadataBuilder,
766 fields: &'a mut IndexMap<u32, usize>,
767 saved_parent_value_builder_offset: usize,
768 field_name: &str,
769 validate_unique_fields: bool,
770 ) -> Result<Self, ArrowError> {
771 let saved_value_builder_offset = value_builder.offset();
775 let saved_fields_size = fields.len();
776 let saved_metadata_builder_dict_size = metadata_builder.num_field_names();
777 let field_id = metadata_builder.try_upsert_field_name(field_name)?;
778 let field_start = saved_value_builder_offset - saved_parent_value_builder_offset;
779 if fields.insert(field_id, field_start).is_some() && validate_unique_fields {
780 return Err(ArrowError::InvalidArgumentError(format!(
781 "Duplicate field name: {field_name}"
782 )));
783 }
784
785 Ok(ParentState::Object {
786 saved_metadata_builder_dict_size,
787 saved_value_builder_offset,
788 saved_fields_size,
789 value_builder,
790 metadata_builder,
791 fields,
792 finished: false,
793 })
794 }
795
796 fn value_builder(&mut self) -> &mut ValueBuilder {
797 self.value_and_metadata_builders().0
798 }
799
800 fn metadata_builder(&mut self) -> &mut dyn MetadataBuilder {
801 self.value_and_metadata_builders().1
802 }
803
804 fn saved_value_builder_offset(&mut self) -> usize {
805 match self {
806 ParentState::Variant {
807 saved_value_builder_offset,
808 ..
809 }
810 | ParentState::List {
811 saved_value_builder_offset,
812 ..
813 }
814 | ParentState::Object {
815 saved_value_builder_offset,
816 ..
817 } => *saved_value_builder_offset,
818 }
819 }
820
821 fn is_finished(&mut self) -> &mut bool {
822 match self {
823 ParentState::Variant { finished, .. }
824 | ParentState::List { finished, .. }
825 | ParentState::Object { finished, .. } => finished,
826 }
827 }
828
829 pub fn finish(&mut self) {
831 *self.is_finished() = true
832 }
833
834 fn rollback(&mut self) {
836 if *self.is_finished() {
837 return;
838 }
839
840 match self {
842 ParentState::Variant {
843 value_builder,
844 saved_value_builder_offset,
845 metadata_builder,
846 saved_metadata_builder_dict_size,
847 ..
848 }
849 | ParentState::List {
850 value_builder,
851 saved_value_builder_offset,
852 metadata_builder,
853 saved_metadata_builder_dict_size,
854 ..
855 }
856 | ParentState::Object {
857 value_builder,
858 saved_value_builder_offset,
859 metadata_builder,
860 saved_metadata_builder_dict_size,
861 ..
862 } => {
863 value_builder
864 .inner_mut()
865 .truncate(*saved_value_builder_offset);
866 metadata_builder.truncate_field_names(*saved_metadata_builder_dict_size);
867 }
868 };
869
870 match self {
872 ParentState::Variant { .. } => (),
873 ParentState::List {
874 offsets,
875 saved_offsets_size,
876 ..
877 } => offsets.truncate(*saved_offsets_size),
878 ParentState::Object {
879 fields,
880 saved_fields_size,
881 ..
882 } => fields.truncate(*saved_fields_size),
883 }
884 }
885
886 pub fn value_and_metadata_builders(&mut self) -> (&mut ValueBuilder, &mut dyn MetadataBuilder) {
889 match self {
890 ParentState::Variant {
891 value_builder,
892 metadata_builder,
893 ..
894 }
895 | ParentState::List {
896 value_builder,
897 metadata_builder,
898 ..
899 }
900 | ParentState::Object {
901 value_builder,
902 metadata_builder,
903 ..
904 } => (value_builder, *metadata_builder),
905 }
906 }
907}
908
909impl Drop for ParentState<'_> {
911 fn drop(&mut self) {
912 self.rollback()
913 }
914}
915
916#[derive(Default, Debug)]
1152pub struct VariantBuilder {
1153 value_builder: ValueBuilder,
1154 metadata_builder: WritableMetadataBuilder,
1155 validate_unique_fields: bool,
1156}
1157
1158impl VariantBuilder {
1159 pub fn new() -> Self {
1161 Self {
1162 value_builder: ValueBuilder::new(),
1163 metadata_builder: WritableMetadataBuilder::default(),
1164 validate_unique_fields: false,
1165 }
1166 }
1167
1168 pub fn with_metadata(mut self, metadata: VariantMetadata) -> Self {
1170 self.metadata_builder.extend(metadata.iter());
1171
1172 self
1173 }
1174
1175 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1181 self.validate_unique_fields = validate_unique_fields;
1182 self
1183 }
1184
1185 pub fn with_field_names<'a>(mut self, field_names: impl IntoIterator<Item = &'a str>) -> Self {
1192 self.metadata_builder.extend(field_names);
1193
1194 self
1195 }
1196
1197 pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
1204 self.append_value(value);
1205 self
1206 }
1207
1208 pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1212 mut self,
1213 value: T,
1214 ) -> Result<Self, ArrowError> {
1215 self.try_append_value(value)?;
1216 Ok(self)
1217 }
1218
1219 pub fn reserve(&mut self, capacity: usize) {
1223 self.metadata_builder.field_names.reserve(capacity);
1224 }
1225
1226 pub fn add_field_name(&mut self, field_name: &str) {
1230 self.metadata_builder.upsert_field_name(field_name);
1231 }
1232
1233 pub fn new_list(&mut self) -> ListBuilder<'_> {
1237 let parent_state =
1238 ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1239 ListBuilder::new(parent_state, self.validate_unique_fields)
1240 }
1241
1242 pub fn new_object(&mut self) -> ObjectBuilder<'_> {
1246 let parent_state =
1247 ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1248 ObjectBuilder::new(parent_state, self.validate_unique_fields)
1249 }
1250
1251 pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1266 let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1267 ValueBuilder::append_variant(state, value.into())
1268 }
1269
1270 pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1272 &mut self,
1273 value: T,
1274 ) -> Result<(), ArrowError> {
1275 let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1276 ValueBuilder::try_append_variant(state, value.into())
1277 }
1278
1279 pub fn append_value_bytes<'m, 'd>(&mut self, value: impl Into<Variant<'m, 'd>>) {
1288 let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1289 ValueBuilder::append_variant_bytes(state, value.into());
1290 }
1291
1292 pub fn finish(mut self) -> (Vec<u8>, Vec<u8>) {
1294 self.metadata_builder.finish();
1295 (
1296 self.metadata_builder.into_inner(),
1297 self.value_builder.into_inner(),
1298 )
1299 }
1300}
1301
1302#[derive(Debug)]
1306pub struct ListBuilder<'a> {
1307 parent_state: ParentState<'a>,
1308 offsets: Vec<usize>,
1309 validate_unique_fields: bool,
1310}
1311
1312impl<'a> ListBuilder<'a> {
1313 pub fn new(parent_state: ParentState<'a>, validate_unique_fields: bool) -> Self {
1315 Self {
1316 parent_state,
1317 offsets: vec![],
1318 validate_unique_fields,
1319 }
1320 }
1321
1322 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1327 self.validate_unique_fields = validate_unique_fields;
1328 self
1329 }
1330
1331 fn parent_state(&mut self) -> (ParentState<'_>, bool) {
1333 let saved_parent_value_builder_offset = self.parent_state.saved_value_builder_offset();
1334 let (value_builder, metadata_builder) = self.parent_state.value_and_metadata_builders();
1335 let state = ParentState::list(
1336 value_builder,
1337 metadata_builder,
1338 &mut self.offsets,
1339 saved_parent_value_builder_offset,
1340 );
1341 (state, self.validate_unique_fields)
1342 }
1343
1344 pub fn new_object(&mut self) -> ObjectBuilder<'_> {
1348 let (parent_state, validate_unique_fields) = self.parent_state();
1349 ObjectBuilder::new(parent_state, validate_unique_fields)
1350 }
1351
1352 pub fn new_list(&mut self) -> ListBuilder<'_> {
1356 let (parent_state, validate_unique_fields) = self.parent_state();
1357 ListBuilder::new(parent_state, validate_unique_fields)
1358 }
1359
1360 pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1367 let (state, _) = self.parent_state();
1368 ValueBuilder::append_variant(state, value.into())
1369 }
1370
1371 pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1373 &mut self,
1374 value: T,
1375 ) -> Result<(), ArrowError> {
1376 let (state, _) = self.parent_state();
1377 ValueBuilder::try_append_variant(state, value.into())
1378 }
1379
1380 pub fn append_value_bytes<'m, 'd>(&mut self, value: impl Into<Variant<'m, 'd>>) {
1389 let (state, _) = self.parent_state();
1390 ValueBuilder::append_variant_bytes(state, value.into())
1391 }
1392
1393 pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
1400 self.append_value(value);
1401 self
1402 }
1403
1404 pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1408 mut self,
1409 value: T,
1410 ) -> Result<Self, ArrowError> {
1411 self.try_append_value(value)?;
1412 Ok(self)
1413 }
1414
1415 pub fn finish(mut self) {
1417 let starting_offset = self.parent_state.saved_value_builder_offset();
1418 let value_builder = self.parent_state.value_builder();
1419
1420 let data_size = value_builder
1421 .offset()
1422 .checked_sub(starting_offset)
1423 .expect("Data size overflowed usize");
1424
1425 let num_elements = self.offsets.len();
1426 let is_large = num_elements > u8::MAX as usize;
1427 let offset_size = int_size(data_size);
1428
1429 let num_elements_size = if is_large { 4 } else { 1 }; let num_elements = self.offsets.len();
1431 let header_size = 1 + num_elements_size + (num_elements + 1) * offset_size as usize; let mut bytes_to_splice = Vec::with_capacity(header_size + 3);
1438 let header = array_header(is_large, offset_size);
1440 bytes_to_splice.push(header);
1441
1442 append_packed_u32(&mut bytes_to_splice, num_elements as u32, num_elements_size);
1443
1444 for offset in &self.offsets {
1445 append_packed_u32(&mut bytes_to_splice, *offset as u32, offset_size as usize);
1446 }
1447
1448 append_packed_u32(&mut bytes_to_splice, data_size as u32, offset_size as usize);
1449
1450 value_builder
1451 .inner_mut()
1452 .splice(starting_offset..starting_offset, bytes_to_splice);
1453
1454 self.parent_state.finish();
1455 }
1456}
1457
1458#[derive(Debug)]
1462pub struct ObjectBuilder<'a> {
1463 parent_state: ParentState<'a>,
1464 fields: IndexMap<u32, usize>, validate_unique_fields: bool,
1466}
1467
1468impl<'a> ObjectBuilder<'a> {
1469 pub fn new(parent_state: ParentState<'a>, validate_unique_fields: bool) -> Self {
1471 Self {
1472 parent_state,
1473 fields: IndexMap::new(),
1474 validate_unique_fields,
1475 }
1476 }
1477
1478 pub fn insert<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, key: &str, value: T) {
1489 let (state, _) = self.parent_state(key).unwrap();
1490 ValueBuilder::append_variant(state, value.into())
1491 }
1492
1493 pub fn try_insert<'m, 'd, T: Into<Variant<'m, 'd>>>(
1504 &mut self,
1505 key: &str,
1506 value: T,
1507 ) -> Result<(), ArrowError> {
1508 let (state, _) = self.parent_state(key)?;
1509 ValueBuilder::try_append_variant(state, value.into())
1510 }
1511
1512 pub fn insert_bytes<'m, 'd>(&mut self, key: &str, value: impl Into<Variant<'m, 'd>>) {
1526 self.try_insert_bytes(key, value).unwrap()
1527 }
1528
1529 pub fn try_insert_bytes<'m, 'd>(
1542 &mut self,
1543 key: &str,
1544 value: impl Into<Variant<'m, 'd>>,
1545 ) -> Result<(), ArrowError> {
1546 let (state, _) = self.parent_state(key)?;
1547 ValueBuilder::append_variant_bytes(state, value.into());
1548 Ok(())
1549 }
1550
1551 pub fn with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, key: &str, value: T) -> Self {
1555 self.insert(key, value);
1556 self
1557 }
1558
1559 pub fn try_with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(
1563 mut self,
1564 key: &str,
1565 value: T,
1566 ) -> Result<Self, ArrowError> {
1567 self.try_insert(key, value)?;
1568 Ok(self)
1569 }
1570
1571 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1576 self.validate_unique_fields = validate_unique_fields;
1577 self
1578 }
1579
1580 fn parent_state<'b>(
1582 &'b mut self,
1583 field_name: &'b str,
1584 ) -> Result<(ParentState<'b>, bool), ArrowError> {
1585 let saved_parent_value_builder_offset = self.parent_state.saved_value_builder_offset();
1586 let validate_unique_fields = self.validate_unique_fields;
1587 let (value_builder, metadata_builder) = self.parent_state.value_and_metadata_builders();
1588 let state = ParentState::try_object(
1589 value_builder,
1590 metadata_builder,
1591 &mut self.fields,
1592 saved_parent_value_builder_offset,
1593 field_name,
1594 validate_unique_fields,
1595 )?;
1596 Ok((state, validate_unique_fields))
1597 }
1598
1599 pub fn new_object<'b>(&'b mut self, key: &'b str) -> ObjectBuilder<'b> {
1605 self.try_new_object(key).unwrap()
1606 }
1607
1608 pub fn try_new_object<'b>(&'b mut self, key: &'b str) -> Result<ObjectBuilder<'b>, ArrowError> {
1614 let (parent_state, validate_unique_fields) = self.parent_state(key)?;
1615 Ok(ObjectBuilder::new(parent_state, validate_unique_fields))
1616 }
1617
1618 pub fn new_list<'b>(&'b mut self, key: &'b str) -> ListBuilder<'b> {
1624 self.try_new_list(key).unwrap()
1625 }
1626
1627 pub fn try_new_list<'b>(&'b mut self, key: &'b str) -> Result<ListBuilder<'b>, ArrowError> {
1633 let (parent_state, validate_unique_fields) = self.parent_state(key)?;
1634 Ok(ListBuilder::new(parent_state, validate_unique_fields))
1635 }
1636
1637 pub fn finish(mut self) {
1639 let metadata_builder = self.parent_state.metadata_builder();
1640
1641 self.fields.sort_by(|&field_a_id, _, &field_b_id, _| {
1642 let field_a_name = metadata_builder.field_name(field_a_id as usize);
1643 let field_b_name = metadata_builder.field_name(field_b_id as usize);
1644 field_a_name.cmp(field_b_name)
1645 });
1646
1647 let max_id = self.fields.iter().map(|(i, _)| *i).max().unwrap_or(0);
1648 let id_size = int_size(max_id as usize);
1649
1650 let starting_offset = self.parent_state.saved_value_builder_offset();
1651 let value_builder = self.parent_state.value_builder();
1652 let current_offset = value_builder.offset();
1653 let data_size = current_offset - starting_offset;
1655 let offset_size = int_size(data_size);
1656
1657 let num_fields = self.fields.len();
1658 let is_large = num_fields > u8::MAX as usize;
1659
1660 let header_size = 1 + (if is_large { 4 } else { 1 }) + (num_fields * id_size as usize) + ((num_fields + 1) * offset_size as usize); value_builder.inner_mut().splice(
1667 starting_offset..starting_offset,
1668 std::iter::repeat_n(0u8, header_size),
1669 );
1670
1671 let mut header_pos = starting_offset;
1673
1674 let header = object_header(is_large, id_size, offset_size);
1676
1677 header_pos = self
1678 .parent_state
1679 .value_builder()
1680 .append_header_start_from_buf_pos(header_pos, header, is_large, num_fields);
1681
1682 header_pos = self
1683 .parent_state
1684 .value_builder()
1685 .append_offset_array_start_from_buf_pos(
1686 header_pos,
1687 self.fields.keys().copied().map(|id| id as usize),
1688 None,
1689 id_size,
1690 );
1691
1692 self.parent_state
1693 .value_builder()
1694 .append_offset_array_start_from_buf_pos(
1695 header_pos,
1696 self.fields.values().copied(),
1697 Some(data_size),
1698 offset_size,
1699 );
1700 self.parent_state.finish();
1701 }
1702}
1703
1704pub trait VariantBuilderExt {
1709 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>);
1711
1712 fn new_list(&mut self) -> ListBuilder<'_> {
1715 self.try_new_list().unwrap()
1716 }
1717
1718 fn new_object(&mut self) -> ObjectBuilder<'_> {
1721 self.try_new_object().unwrap()
1722 }
1723
1724 fn try_new_list(&mut self) -> Result<ListBuilder<'_>, ArrowError>;
1727
1728 fn try_new_object(&mut self) -> Result<ObjectBuilder<'_>, ArrowError>;
1731}
1732
1733impl VariantBuilderExt for ListBuilder<'_> {
1734 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1735 self.append_value(value);
1736 }
1737
1738 fn try_new_list(&mut self) -> Result<ListBuilder<'_>, ArrowError> {
1739 Ok(self.new_list())
1740 }
1741
1742 fn try_new_object(&mut self) -> Result<ObjectBuilder<'_>, ArrowError> {
1743 Ok(self.new_object())
1744 }
1745}
1746
1747impl VariantBuilderExt for VariantBuilder {
1748 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1749 self.append_value(value);
1750 }
1751
1752 fn try_new_list(&mut self) -> Result<ListBuilder<'_>, ArrowError> {
1753 Ok(self.new_list())
1754 }
1755
1756 fn try_new_object(&mut self) -> Result<ObjectBuilder<'_>, ArrowError> {
1757 Ok(self.new_object())
1758 }
1759}
1760
1761#[cfg(test)]
1762mod tests {
1763 use crate::VariantMetadata;
1764
1765 use super::*;
1766
1767 #[test]
1768 fn test_simple_usage() {
1769 {
1770 let mut builder = VariantBuilder::new();
1771 builder.append_value(());
1772 let (metadata, value) = builder.finish();
1773 let variant = Variant::try_new(&metadata, &value).unwrap();
1774 assert_eq!(variant, Variant::Null);
1775 }
1776
1777 {
1778 let mut builder = VariantBuilder::new();
1779 builder.append_value(true);
1780 let (metadata, value) = builder.finish();
1781 let variant = Variant::try_new(&metadata, &value).unwrap();
1782 assert_eq!(variant, Variant::BooleanTrue);
1783 }
1784
1785 {
1786 let mut builder = VariantBuilder::new();
1787 builder.append_value(false);
1788 let (metadata, value) = builder.finish();
1789 let variant = Variant::try_new(&metadata, &value).unwrap();
1790 assert_eq!(variant, Variant::BooleanFalse);
1791 }
1792
1793 {
1794 let mut builder = VariantBuilder::new();
1795 builder.append_value(42i8);
1796 let (metadata, value) = builder.finish();
1797 let variant = Variant::try_new(&metadata, &value).unwrap();
1798 assert_eq!(variant, Variant::Int8(42));
1799 }
1800
1801 {
1802 let mut builder = VariantBuilder::new();
1803 builder.append_value(1234i16);
1804 let (metadata, value) = builder.finish();
1805 let variant = Variant::try_new(&metadata, &value).unwrap();
1806 assert_eq!(variant, Variant::Int16(1234));
1807 }
1808
1809 {
1810 let mut builder = VariantBuilder::new();
1811 builder.append_value(123456i32);
1812 let (metadata, value) = builder.finish();
1813 let variant = Variant::try_new(&metadata, &value).unwrap();
1814 assert_eq!(variant, Variant::Int32(123456));
1815 }
1816
1817 {
1818 let mut builder = VariantBuilder::new();
1819 builder.append_value(123456789i64);
1820 let (metadata, value) = builder.finish();
1821 let variant = Variant::try_new(&metadata, &value).unwrap();
1822 assert_eq!(variant, Variant::Int64(123456789));
1823 }
1824
1825 {
1826 let mut builder = VariantBuilder::new();
1827 builder.append_value(1.5f32);
1828 let (metadata, value) = builder.finish();
1829 let variant = Variant::try_new(&metadata, &value).unwrap();
1830 assert_eq!(variant, Variant::Float(1.5));
1831 }
1832
1833 {
1834 let mut builder = VariantBuilder::new();
1835 builder.append_value(2.5f64);
1836 let (metadata, value) = builder.finish();
1837 let variant = Variant::try_new(&metadata, &value).unwrap();
1838 assert_eq!(variant, Variant::Double(2.5));
1839 }
1840
1841 {
1842 let mut builder = VariantBuilder::new();
1843 builder.append_value("hello");
1844 let (metadata, value) = builder.finish();
1845 let variant = Variant::try_new(&metadata, &value).unwrap();
1846 assert_eq!(variant, Variant::ShortString(ShortString("hello")));
1847 }
1848
1849 {
1850 let mut builder = VariantBuilder::new();
1851 let long_string = "This is a very long string that exceeds the short string limit of 63 bytes and should be encoded as a regular string type instead of a short string";
1852 builder.append_value(long_string);
1853 let (metadata, value) = builder.finish();
1854 let variant = Variant::try_new(&metadata, &value).unwrap();
1855 assert_eq!(variant, Variant::String(long_string));
1856 }
1857
1858 {
1859 let mut builder = VariantBuilder::new();
1860 let binary_data = b"binary data";
1861 builder.append_value(binary_data.as_slice());
1862 let (metadata, value) = builder.finish();
1863 let variant = Variant::try_new(&metadata, &value).unwrap();
1864 assert_eq!(variant, Variant::Binary(binary_data.as_slice()));
1865 }
1866 }
1867
1868 #[test]
1869 fn test_list() {
1870 let mut builder = VariantBuilder::new();
1871
1872 builder
1873 .new_list()
1874 .with_value(1i8)
1875 .with_value(2i8)
1876 .with_value("test")
1877 .finish();
1878
1879 let (metadata, value) = builder.finish();
1880 assert!(!metadata.is_empty());
1881 assert!(!value.is_empty());
1882
1883 let variant = Variant::try_new(&metadata, &value).unwrap();
1884
1885 match variant {
1886 Variant::List(list) => {
1887 let val0 = list.get(0).unwrap();
1888 assert_eq!(val0, Variant::Int8(1));
1889
1890 let val1 = list.get(1).unwrap();
1891 assert_eq!(val1, Variant::Int8(2));
1892
1893 let val2 = list.get(2).unwrap();
1894 assert_eq!(val2, Variant::ShortString(ShortString("test")));
1895 }
1896 _ => panic!("Expected an array variant, got: {variant:?}"),
1897 }
1898 }
1899
1900 #[test]
1901 fn test_object() {
1902 let mut builder = VariantBuilder::new();
1903
1904 builder
1905 .new_object()
1906 .with_field("name", "John")
1907 .with_field("age", 42i8)
1908 .finish();
1909
1910 let (metadata, value) = builder.finish();
1911 assert!(!metadata.is_empty());
1912 assert!(!value.is_empty());
1913 }
1914
1915 #[test]
1916 fn test_object_field_ordering() {
1917 let mut builder = VariantBuilder::new();
1918
1919 builder
1920 .new_object()
1921 .with_field("zebra", "stripes")
1922 .with_field("apple", "red")
1923 .with_field("banana", "yellow")
1924 .finish();
1925
1926 let (_, value) = builder.finish();
1927
1928 let header = value[0];
1929 assert_eq!(header & 0x03, VariantBasicType::Object as u8);
1930
1931 let field_count = value[1] as usize;
1932 assert_eq!(field_count, 3);
1933
1934 let field_ids: Vec<u8> = value[2..5].to_vec();
1936
1937 assert_eq!(field_ids, vec![1, 2, 0]);
1939 }
1940
1941 #[test]
1942 fn test_duplicate_fields_in_object() {
1943 let mut builder = VariantBuilder::new();
1944 builder
1945 .new_object()
1946 .with_field("name", "Ron Artest")
1947 .with_field("name", "Metta World Peace") .finish();
1949
1950 let (metadata, value) = builder.finish();
1951 let variant = Variant::try_new(&metadata, &value).unwrap();
1952
1953 let obj = variant.as_object().unwrap();
1954 assert_eq!(obj.len(), 1);
1955 assert_eq!(obj.field(0).unwrap(), Variant::from("Metta World Peace"));
1956
1957 assert_eq!(
1958 vec![("name", Variant::from("Metta World Peace"))],
1959 obj.iter().collect::<Vec<_>>()
1960 );
1961 }
1962
1963 #[test]
1964 fn test_nested_list() {
1965 let mut builder = VariantBuilder::new();
1966
1967 let mut outer_list_builder = builder.new_list();
1968
1969 outer_list_builder
1971 .new_list()
1972 .with_value("a")
1973 .with_value("b")
1974 .with_value("c")
1975 .with_value("d")
1976 .finish();
1977
1978 outer_list_builder.finish();
1979
1980 let (metadata, value) = builder.finish();
1981
1982 let variant = Variant::try_new(&metadata, &value).unwrap();
1983 let outer_list = variant.as_list().unwrap();
1984
1985 assert_eq!(outer_list.len(), 1);
1986
1987 let inner_variant = outer_list.get(0).unwrap();
1988 let inner_list = inner_variant.as_list().unwrap();
1989
1990 assert_eq!(
1991 vec![
1992 Variant::from("a"),
1993 Variant::from("b"),
1994 Variant::from("c"),
1995 Variant::from("d"),
1996 ],
1997 inner_list.iter().collect::<Vec<_>>()
1998 );
1999 }
2000
2001 #[test]
2002 fn test_super_nested_list() {
2003 let mut builder = VariantBuilder::new();
2008 {
2009 let mut list_builder1 = builder.new_list();
2010 {
2011 let mut list_builder2 = list_builder1.new_list();
2012 {
2013 let mut list_builder3 = list_builder2.new_list();
2014 {
2015 let mut list_builder4 = list_builder3.new_list();
2016 {
2017 let mut list_builder5 = list_builder4.new_list();
2018 list_builder5.append_value(1);
2019 list_builder5.finish();
2020 }
2021 list_builder4.finish();
2022 }
2023 list_builder3.finish();
2024 }
2025 list_builder2.finish();
2026 }
2027 list_builder1.finish();
2028 }
2029
2030 let (metadata, value) = builder.finish();
2031
2032 let variant = Variant::try_new(&metadata, &value).unwrap();
2033 let list1 = variant.as_list().unwrap();
2034 assert_eq!(list1.len(), 1);
2035
2036 let list2_variant = list1.get(0).unwrap();
2037 let list2 = list2_variant.as_list().unwrap();
2038 assert_eq!(list2.len(), 1);
2039
2040 let list3_variant = list2.get(0).unwrap();
2041 let list3 = list3_variant.as_list().unwrap();
2042 assert_eq!(list3.len(), 1);
2043
2044 let list4_variant = list3.get(0).unwrap();
2045 let list4 = list4_variant.as_list().unwrap();
2046 assert_eq!(list4.len(), 1);
2047
2048 let list5_variant = list4.get(0).unwrap();
2049 let list5 = list5_variant.as_list().unwrap();
2050 assert_eq!(list5.len(), 1);
2051
2052 assert_eq!(list5.len(), 1);
2053
2054 assert_eq!(list5.get(0).unwrap(), Variant::from(1));
2055 }
2056
2057 #[test]
2058 fn test_object_list() {
2059 let mut builder = VariantBuilder::new();
2060
2061 let mut list_builder = builder.new_list();
2062
2063 list_builder
2064 .new_object()
2065 .with_field("id", 1)
2066 .with_field("type", "Cauliflower")
2067 .finish();
2068
2069 list_builder
2070 .new_object()
2071 .with_field("id", 2)
2072 .with_field("type", "Beets")
2073 .finish();
2074
2075 list_builder.finish();
2076
2077 let (metadata, value) = builder.finish();
2078
2079 let variant = Variant::try_new(&metadata, &value).unwrap();
2080 let list = variant.as_list().unwrap();
2081
2082 assert_eq!(list.len(), 2);
2083
2084 let obj1_variant = list.get(0).unwrap();
2085 let obj1 = obj1_variant.as_object().unwrap();
2086
2087 assert_eq!(
2088 vec![
2089 ("id", Variant::from(1)),
2090 ("type", Variant::from("Cauliflower")),
2091 ],
2092 obj1.iter().collect::<Vec<_>>()
2093 );
2094
2095 let obj2_variant = list.get(1).unwrap();
2096 let obj2 = obj2_variant.as_object().unwrap();
2097
2098 assert_eq!(
2099 vec![("id", Variant::from(2)), ("type", Variant::from("Beets")),],
2100 obj2.iter().collect::<Vec<_>>()
2101 );
2102 }
2103
2104 #[test]
2105 fn test_object_list2() {
2106 let mut builder = VariantBuilder::new();
2107
2108 let mut list_builder = builder.new_list();
2109
2110 list_builder.new_object().with_field("a", 1).finish();
2111
2112 list_builder.new_object().with_field("b", 2).finish();
2113
2114 list_builder.finish();
2115
2116 let (metadata, value) = builder.finish();
2117
2118 let variant = Variant::try_new(&metadata, &value).unwrap();
2119 let list = variant.as_list().unwrap();
2120 assert_eq!(list.len(), 2);
2121
2122 let obj1_variant = list.get(0).unwrap();
2123 let obj1 = obj1_variant.as_object().unwrap();
2124 assert_eq!(
2125 vec![("a", Variant::from(1)),],
2126 obj1.iter().collect::<Vec<_>>()
2127 );
2128
2129 let obj2_variant = list.get(1).unwrap();
2130 let obj2 = obj2_variant.as_object().unwrap();
2131 assert_eq!(
2132 vec![("b", Variant::from(2)),],
2133 obj2.iter().collect::<Vec<_>>()
2134 );
2135 }
2136
2137 #[test]
2138 fn test_hetergenous_list() {
2139 let mut builder = VariantBuilder::new();
2150
2151 let mut list_builder = builder.new_list();
2152
2153 list_builder.append_value(1);
2154
2155 {
2156 let mut object_builder = list_builder.new_object();
2157 object_builder.insert("a", 1);
2158 object_builder.finish();
2159 }
2160
2161 list_builder.append_value(2);
2162
2163 {
2164 let mut object_builder = list_builder.new_object();
2165 object_builder.insert("b", 2);
2166 object_builder.finish();
2167 }
2168
2169 list_builder.append_value(3);
2170
2171 list_builder.finish();
2172
2173 let (metadata, value) = builder.finish();
2174
2175 let variant = Variant::try_new(&metadata, &value).unwrap();
2176 let list = variant.as_list().unwrap();
2177 assert_eq!(list.len(), 5);
2178 assert_eq!(list.get(0).unwrap(), Variant::from(1));
2179
2180 let obj1_variant = list.get(1).unwrap();
2181 let obj1 = obj1_variant.as_object().unwrap();
2182 assert_eq!(
2183 vec![("a", Variant::from(1)),],
2184 obj1.iter().collect::<Vec<_>>()
2185 );
2186
2187 assert_eq!(list.get(2).unwrap(), Variant::from(2));
2188
2189 let obj2_variant = list.get(3).unwrap();
2190 let obj2 = obj2_variant.as_object().unwrap();
2191 assert_eq!(
2192 vec![("b", Variant::from(2)),],
2193 obj2.iter().collect::<Vec<_>>()
2194 );
2195
2196 assert_eq!(list.get(4).unwrap(), Variant::from(3));
2197 }
2198
2199 #[test]
2200 fn test_nested_object() {
2201 let mut builder = VariantBuilder::new();
2211 {
2212 let mut outer_object_builder = builder.new_object();
2213 {
2214 let mut inner_object_builder = outer_object_builder.new_object("c");
2215 inner_object_builder.insert("b", "a");
2216 inner_object_builder.finish();
2217 }
2218
2219 outer_object_builder.finish();
2220 }
2221
2222 let (metadata, value) = builder.finish();
2223 let variant = Variant::try_new(&metadata, &value).unwrap();
2224 let outer_object = variant.as_object().unwrap();
2225
2226 assert_eq!(outer_object.len(), 1);
2227 assert_eq!(outer_object.field_name(0).unwrap(), "c");
2228
2229 let inner_object_variant = outer_object.field(0).unwrap();
2230 let inner_object = inner_object_variant.as_object().unwrap();
2231
2232 assert_eq!(inner_object.len(), 1);
2233 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2234 assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2235 }
2236
2237 #[test]
2238 fn test_nested_object_with_duplicate_field_names_per_object() {
2239 let mut builder = VariantBuilder::new();
2251 {
2252 let mut outer_object_builder = builder.new_object();
2253 {
2254 let mut inner_object_builder = outer_object_builder.new_object("c");
2255 inner_object_builder.insert("b", false);
2256 inner_object_builder.insert("c", "a");
2257
2258 inner_object_builder.finish();
2259 }
2260
2261 outer_object_builder.insert("b", false);
2262 outer_object_builder.finish();
2263 }
2264
2265 let (metadata, value) = builder.finish();
2266 let variant = Variant::try_new(&metadata, &value).unwrap();
2267 let outer_object = variant.as_object().unwrap();
2268
2269 assert_eq!(outer_object.len(), 2);
2270 assert_eq!(outer_object.field_name(0).unwrap(), "b");
2271
2272 let inner_object_variant = outer_object.field(1).unwrap();
2273 let inner_object = inner_object_variant.as_object().unwrap();
2274
2275 assert_eq!(inner_object.len(), 2);
2276 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2277 assert_eq!(inner_object.field(0).unwrap(), Variant::from(false));
2278 assert_eq!(inner_object.field_name(1).unwrap(), "c");
2279 assert_eq!(inner_object.field(1).unwrap(), Variant::from("a"));
2280 }
2281
2282 #[test]
2283 fn test_nested_object_with_lists() {
2284 let mut builder = VariantBuilder::new();
2294 {
2295 let mut outer_object_builder = builder.new_object();
2296 {
2297 let mut inner_object_builder = outer_object_builder.new_object("door 1");
2298
2299 inner_object_builder
2301 .new_list("items")
2302 .with_value("apple")
2303 .with_value(false)
2304 .finish();
2305
2306 inner_object_builder.finish();
2307 }
2308
2309 outer_object_builder.finish();
2310 }
2311
2312 let (metadata, value) = builder.finish();
2313 let variant = Variant::try_new(&metadata, &value).unwrap();
2314 let outer_object = variant.as_object().unwrap();
2315
2316 assert_eq!(outer_object.len(), 1);
2317 assert_eq!(outer_object.field_name(0).unwrap(), "door 1");
2318
2319 let inner_object_variant = outer_object.field(0).unwrap();
2320 let inner_object = inner_object_variant.as_object().unwrap();
2321
2322 assert_eq!(inner_object.len(), 1);
2323 assert_eq!(inner_object.field_name(0).unwrap(), "items");
2324
2325 let items_variant = inner_object.field(0).unwrap();
2326 let items_list = items_variant.as_list().unwrap();
2327
2328 assert_eq!(items_list.len(), 2);
2329 assert_eq!(items_list.get(0).unwrap(), Variant::from("apple"));
2330 assert_eq!(items_list.get(1).unwrap(), Variant::from(false));
2331 }
2332
2333 #[test]
2334 fn test_nested_object_with_heterogeneous_fields() {
2335 let mut builder = VariantBuilder::new();
2357 {
2358 let mut outer_object_builder = builder.new_object();
2359
2360 outer_object_builder.insert("a", false);
2361
2362 {
2363 let mut inner_object_builder = outer_object_builder.new_object("c");
2364 inner_object_builder.insert("b", "a");
2365
2366 {
2367 let mut inner_inner_object_builder = inner_object_builder.new_object("c");
2368 inner_inner_object_builder.insert("aa", "bb");
2369 inner_inner_object_builder.finish();
2370 }
2371
2372 {
2373 let mut inner_inner_object_builder = inner_object_builder.new_object("d");
2374 inner_inner_object_builder.insert("cc", "dd");
2375 inner_inner_object_builder.finish();
2376 }
2377 inner_object_builder.finish();
2378 }
2379
2380 outer_object_builder.insert("b", true);
2381
2382 {
2383 let mut inner_object_builder = outer_object_builder.new_object("d");
2384 inner_object_builder.insert("e", 1);
2385 {
2386 let mut inner_list_builder = inner_object_builder.new_list("f");
2387 inner_list_builder.append_value(1);
2388 inner_list_builder.append_value(true);
2389
2390 inner_list_builder.finish();
2391 }
2392
2393 {
2394 let mut inner_list_builder = inner_object_builder.new_list("g");
2395 inner_list_builder.append_value("tree");
2396 inner_list_builder.append_value(false);
2397
2398 inner_list_builder.finish();
2399 }
2400
2401 inner_object_builder.finish();
2402 }
2403
2404 outer_object_builder.finish();
2405 }
2406
2407 let (metadata, value) = builder.finish();
2408
2409 let variant = Variant::try_new(&metadata, &value).unwrap();
2432 let outer_object = variant.as_object().unwrap();
2433
2434 assert_eq!(outer_object.len(), 4);
2435
2436 assert_eq!(outer_object.field_name(0).unwrap(), "a");
2437 assert_eq!(outer_object.field(0).unwrap(), Variant::from(false));
2438
2439 assert_eq!(outer_object.field_name(2).unwrap(), "c");
2440
2441 let inner_object_variant = outer_object.field(2).unwrap();
2442 let inner_object = inner_object_variant.as_object().unwrap();
2443
2444 assert_eq!(inner_object.len(), 3);
2445 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2446 assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2447
2448 let inner_iner_object_variant_c = inner_object.field(1).unwrap();
2449 let inner_inner_object_c = inner_iner_object_variant_c.as_object().unwrap();
2450 assert_eq!(inner_inner_object_c.len(), 1);
2451 assert_eq!(inner_inner_object_c.field_name(0).unwrap(), "aa");
2452 assert_eq!(inner_inner_object_c.field(0).unwrap(), Variant::from("bb"));
2453
2454 let inner_iner_object_variant_d = inner_object.field(2).unwrap();
2455 let inner_inner_object_d = inner_iner_object_variant_d.as_object().unwrap();
2456 assert_eq!(inner_inner_object_d.len(), 1);
2457 assert_eq!(inner_inner_object_d.field_name(0).unwrap(), "cc");
2458 assert_eq!(inner_inner_object_d.field(0).unwrap(), Variant::from("dd"));
2459
2460 assert_eq!(outer_object.field_name(1).unwrap(), "b");
2461 assert_eq!(outer_object.field(1).unwrap(), Variant::from(true));
2462
2463 let out_object_variant_d = outer_object.field(3).unwrap();
2464 let out_object_d = out_object_variant_d.as_object().unwrap();
2465 assert_eq!(out_object_d.len(), 3);
2466 assert_eq!("e", out_object_d.field_name(0).unwrap());
2467 assert_eq!(Variant::from(1), out_object_d.field(0).unwrap());
2468 assert_eq!("f", out_object_d.field_name(1).unwrap());
2469
2470 let first_inner_list_variant_f = out_object_d.field(1).unwrap();
2471 let first_inner_list_f = first_inner_list_variant_f.as_list().unwrap();
2472 assert_eq!(2, first_inner_list_f.len());
2473 assert_eq!(Variant::from(1), first_inner_list_f.get(0).unwrap());
2474 assert_eq!(Variant::from(true), first_inner_list_f.get(1).unwrap());
2475
2476 let second_inner_list_variant_g = out_object_d.field(2).unwrap();
2477 let second_inner_list_g = second_inner_list_variant_g.as_list().unwrap();
2478 assert_eq!(2, second_inner_list_g.len());
2479 assert_eq!(Variant::from("tree"), second_inner_list_g.get(0).unwrap());
2480 assert_eq!(Variant::from(false), second_inner_list_g.get(1).unwrap());
2481 }
2482
2483 #[test]
2487 fn test_nested_list_with_heterogeneous_fields_for_buffer_reuse() {
2488 let mut builder = VariantBuilder::new();
2489
2490 {
2491 let mut outer_list_builder = builder.new_list();
2492
2493 outer_list_builder.append_value("apple");
2494 outer_list_builder.append_value(false);
2495
2496 {
2497 let mut inner_list_builder = outer_list_builder.new_list();
2499
2500 {
2501 let mut inner_object_builder = inner_list_builder.new_object();
2502 inner_object_builder.insert("a", "b");
2503 inner_object_builder.insert("b", "c");
2504 inner_object_builder.finish();
2505 }
2506
2507 {
2508 let mut inner_object_builder = inner_list_builder.new_object();
2511 inner_object_builder.insert("c", "d");
2512 inner_object_builder.insert("d", "e");
2513 inner_object_builder.finish();
2514 }
2515
2516 inner_list_builder.finish();
2517 }
2518
2519 {
2520 let mut inner_list_builder = outer_list_builder.new_list();
2522
2523 {
2524 let mut double_inner_list_builder = inner_list_builder.new_list();
2525 double_inner_list_builder.append_value(1);
2526 double_inner_list_builder.append_value(true);
2527
2528 double_inner_list_builder.finish();
2529 }
2530
2531 {
2532 let mut double_inner_list_builder = inner_list_builder.new_list();
2533 double_inner_list_builder.append_value("tree");
2534 double_inner_list_builder.append_value(false);
2535
2536 double_inner_list_builder.finish();
2537 }
2538 inner_list_builder.finish();
2539 }
2540
2541 outer_list_builder.append_value(1);
2542
2543 outer_list_builder.finish();
2544 }
2545
2546 let (metadata, value) = builder.finish();
2547
2548 let variant = Variant::try_new(&metadata, &value).unwrap();
2549 let outer_list = variant.as_list().unwrap();
2550
2551 assert_eq!(5, outer_list.len());
2552
2553 assert_eq!(Variant::from("apple"), outer_list.get(0).unwrap());
2555 assert_eq!(Variant::from(false), outer_list.get(1).unwrap());
2556 assert_eq!(Variant::from(1), outer_list.get(4).unwrap());
2557
2558 let list1_variant = outer_list.get(2).unwrap();
2560 let list1 = list1_variant.as_list().unwrap();
2561 assert_eq!(2, list1.len());
2562
2563 let list1_obj1_variant = list1.get(0).unwrap();
2564 let list1_obj1 = list1_obj1_variant.as_object().unwrap();
2565 assert_eq!("a", list1_obj1.field_name(0).unwrap());
2566 assert_eq!(Variant::from("b"), list1_obj1.field(0).unwrap());
2567
2568 assert_eq!("b", list1_obj1.field_name(1).unwrap());
2569 assert_eq!(Variant::from("c"), list1_obj1.field(1).unwrap());
2570
2571 let list2_variant = outer_list.get(3).unwrap();
2573 let list2 = list2_variant.as_list().unwrap();
2574 assert_eq!(2, list2.len());
2575
2576 let list2_list1_variant = list2.get(0).unwrap();
2578 let list2_list1 = list2_list1_variant.as_list().unwrap();
2579 assert_eq!(2, list2_list1.len());
2580 assert_eq!(Variant::from(1), list2_list1.get(0).unwrap());
2581 assert_eq!(Variant::from(true), list2_list1.get(1).unwrap());
2582
2583 let list2_list2_variant = list2.get(1).unwrap();
2585 let list2_list2 = list2_list2_variant.as_list().unwrap();
2586 assert_eq!(2, list2_list2.len());
2587 assert_eq!(Variant::from("tree"), list2_list2.get(0).unwrap());
2588 assert_eq!(Variant::from(false), list2_list2.get(1).unwrap());
2589 }
2590
2591 #[test]
2592 fn test_object_without_unique_field_validation() {
2593 let mut builder = VariantBuilder::new();
2594
2595 let mut obj = builder.new_object();
2597 obj.insert("a", 1);
2598 obj.insert("a", 2);
2599 obj.finish();
2600
2601 let mut builder = VariantBuilder::new();
2603 let mut outer_list = builder.new_list();
2604 let mut inner_list = outer_list.new_list();
2605 let mut nested_obj = inner_list.new_object();
2606 nested_obj.insert("x", 1);
2607 nested_obj.insert("x", 2);
2608 nested_obj.new_list("x").with_value(3).finish();
2609 nested_obj.new_object("x").with_field("y", 4).finish();
2610 nested_obj.finish();
2611 inner_list.finish();
2612 outer_list.finish();
2613
2614 let (metadata, value) = builder.finish();
2616 let variant = Variant::try_new(&metadata, &value).unwrap();
2617 let outer_element = variant.get_list_element(0).unwrap();
2618 let inner_element = outer_element.get_list_element(0).unwrap();
2619 let outer_field = inner_element.get_object_field("x").unwrap();
2620 let inner_field = outer_field.get_object_field("y").unwrap();
2621 assert_eq!(inner_field, Variant::from(4));
2622 }
2623
2624 #[test]
2625 fn test_object_with_unique_field_validation() {
2626 let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
2627
2628 let result = builder
2630 .new_object()
2631 .with_field("a", 1)
2632 .with_field("b", 2)
2633 .try_with_field("a", 3);
2634 assert_eq!(
2635 result.unwrap_err().to_string(),
2636 "Invalid argument error: Duplicate field name: a"
2637 );
2638
2639 let mut outer_list = builder.new_list();
2641 let mut inner_list = outer_list.new_list();
2642 let mut object = inner_list.new_object().with_field("x", 1);
2643 let nested_result = object.try_insert("x", 2);
2644 assert_eq!(
2645 nested_result.unwrap_err().to_string(),
2646 "Invalid argument error: Duplicate field name: x"
2647 );
2648 let nested_result = object.try_new_list("x");
2649 assert_eq!(
2650 nested_result.unwrap_err().to_string(),
2651 "Invalid argument error: Duplicate field name: x"
2652 );
2653
2654 let nested_result = object.try_new_object("x");
2655 assert_eq!(
2656 nested_result.unwrap_err().to_string(),
2657 "Invalid argument error: Duplicate field name: x"
2658 );
2659
2660 drop(object);
2661 inner_list.finish();
2662 outer_list.finish();
2663
2664 let mut list = builder.new_list();
2666 let mut valid_obj = list.new_object();
2667 valid_obj.insert("m", 1);
2668 valid_obj.insert("n", 2);
2669
2670 valid_obj.finish();
2671 list.finish();
2672 }
2673
2674 #[test]
2675 fn test_sorted_dictionary() {
2676 let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"]);
2678
2679 let mut variant2 = {
2680 let mut builder = VariantBuilder::new();
2681
2682 builder.add_field_name("b");
2683 builder.add_field_name("c");
2684 builder.add_field_name("d");
2685
2686 builder
2687 };
2688
2689 assert_eq!(
2690 variant1.metadata_builder.field_names,
2691 variant2.metadata_builder.field_names
2692 );
2693
2694 assert!(variant1.metadata_builder.is_sorted);
2696 assert!(variant2.metadata_builder.is_sorted);
2697
2698 {
2699 variant2.add_field_name("a");
2701 assert!(!variant2.metadata_builder.is_sorted);
2702
2703 let (m, v) = variant2.finish();
2705 let res = Variant::try_new(&m, &v);
2706 assert!(res.is_err());
2707
2708 let header = VariantMetadata::try_new(&m).unwrap();
2710 assert!(!header.is_sorted());
2711 }
2712
2713 variant1.append_value(false);
2715
2716 let (m, v) = variant1.finish();
2717 let res = Variant::try_new(&m, &v);
2718 assert!(res.is_ok());
2719
2720 let header = VariantMetadata::try_new(&m).unwrap();
2721 assert!(header.is_sorted());
2722 }
2723
2724 #[test]
2725 fn test_object_sorted_dictionary() {
2726 let mut variant1 = VariantBuilder::new().with_field_names(["a", "b", "c"]);
2728 let mut obj = variant1.new_object();
2729
2730 obj.insert("c", true);
2731 obj.insert("a", false);
2732 obj.insert("b", ());
2733
2734 let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2736 assert_eq!(field_ids_by_insert_order, vec![2, 0, 1]);
2737
2738 obj.insert("d", 2);
2740 obj.finish();
2741
2742 let (metadata, value) = variant1.finish();
2743 let variant = Variant::try_new(&metadata, &value).unwrap();
2744
2745 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2746 assert!(metadata.is_sorted());
2747
2748 let object = variant.as_object().unwrap();
2750 let field_names = object
2751 .iter()
2752 .map(|(field_name, _)| field_name)
2753 .collect::<Vec<_>>();
2754
2755 assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2756 }
2757
2758 #[test]
2759 fn test_object_not_sorted_dictionary() {
2760 let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"]);
2762 let mut obj = variant1.new_object();
2763
2764 obj.insert("c", true);
2765 obj.insert("d", false);
2766 obj.insert("b", ());
2767
2768 let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2770 assert_eq!(field_ids_by_insert_order, vec![1, 2, 0]);
2771
2772 obj.insert("a", 2);
2774 obj.finish();
2775
2776 let (metadata, value) = variant1.finish();
2777 let variant = Variant::try_new(&metadata, &value).unwrap();
2778
2779 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2780 assert!(!metadata.is_sorted());
2781
2782 let object = variant.as_object().unwrap();
2784 let field_names = object
2785 .iter()
2786 .map(|(field_name, _)| field_name)
2787 .collect::<Vec<_>>();
2788
2789 assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2790 }
2791
2792 #[test]
2793 fn test_building_sorted_dictionary() {
2794 let mut builder = VariantBuilder::new();
2795 assert!(!builder.metadata_builder.is_sorted);
2796 assert_eq!(builder.metadata_builder.num_field_names(), 0);
2797
2798 builder.add_field_name("a");
2799
2800 assert!(builder.metadata_builder.is_sorted);
2801 assert_eq!(builder.metadata_builder.num_field_names(), 1);
2802
2803 let builder = builder.with_field_names(["b", "c", "d"]);
2804
2805 assert!(builder.metadata_builder.is_sorted);
2806 assert_eq!(builder.metadata_builder.num_field_names(), 4);
2807
2808 let builder = builder.with_field_names(["z", "y"]);
2809 assert!(!builder.metadata_builder.is_sorted);
2810 assert_eq!(builder.metadata_builder.num_field_names(), 6);
2811 }
2812
2813 #[test]
2814 fn test_metadata_builder_from_iter() {
2815 let metadata = WritableMetadataBuilder::from_iter(vec!["apple", "banana", "cherry"]);
2816 assert_eq!(metadata.num_field_names(), 3);
2817 assert_eq!(metadata.field_name(0), "apple");
2818 assert_eq!(metadata.field_name(1), "banana");
2819 assert_eq!(metadata.field_name(2), "cherry");
2820 assert!(metadata.is_sorted);
2821
2822 let metadata = WritableMetadataBuilder::from_iter(["zebra", "apple", "banana"]);
2823 assert_eq!(metadata.num_field_names(), 3);
2824 assert_eq!(metadata.field_name(0), "zebra");
2825 assert_eq!(metadata.field_name(1), "apple");
2826 assert_eq!(metadata.field_name(2), "banana");
2827 assert!(!metadata.is_sorted);
2828
2829 let metadata = WritableMetadataBuilder::from_iter(Vec::<&str>::new());
2830 assert_eq!(metadata.num_field_names(), 0);
2831 assert!(!metadata.is_sorted);
2832 }
2833
2834 #[test]
2835 fn test_metadata_builder_extend() {
2836 let mut metadata = WritableMetadataBuilder::default();
2837 assert_eq!(metadata.num_field_names(), 0);
2838 assert!(!metadata.is_sorted);
2839
2840 metadata.extend(["apple", "cherry"]);
2841 assert_eq!(metadata.num_field_names(), 2);
2842 assert_eq!(metadata.field_name(0), "apple");
2843 assert_eq!(metadata.field_name(1), "cherry");
2844 assert!(metadata.is_sorted);
2845
2846 metadata.extend(vec!["dinosaur", "monkey"]);
2848 assert_eq!(metadata.num_field_names(), 4);
2849 assert_eq!(metadata.field_name(2), "dinosaur");
2850 assert_eq!(metadata.field_name(3), "monkey");
2851 assert!(metadata.is_sorted);
2852
2853 let initial_count = metadata.num_field_names();
2855 metadata.extend(["apple", "monkey"]);
2856 assert_eq!(metadata.num_field_names(), initial_count); }
2858
2859 #[test]
2860 fn test_metadata_builder_extend_sort_order() {
2861 let mut metadata = WritableMetadataBuilder::default();
2862
2863 metadata.extend(["middle"]);
2864 assert!(metadata.is_sorted);
2865
2866 metadata.extend(["zebra"]);
2867 assert!(metadata.is_sorted);
2868
2869 metadata.extend(["apple"]);
2871 assert!(!metadata.is_sorted);
2872 }
2873
2874 #[test]
2875 fn test_metadata_builder_from_iter_with_string_types() {
2876 let metadata = WritableMetadataBuilder::from_iter(["a", "b", "c"]);
2878 assert_eq!(metadata.num_field_names(), 3);
2879
2880 let metadata = WritableMetadataBuilder::from_iter(vec![
2882 "a".to_string(),
2883 "b".to_string(),
2884 "c".to_string(),
2885 ]);
2886 assert_eq!(metadata.num_field_names(), 3);
2887
2888 let field_names: Vec<Box<str>> = vec!["a".into(), "b".into(), "c".into()];
2890 let metadata = WritableMetadataBuilder::from_iter(field_names);
2891 assert_eq!(metadata.num_field_names(), 3);
2892 }
2893
2894 #[test]
2895 fn test_variant_builder_to_list_builder_no_finish() {
2896 let mut builder = VariantBuilder::new();
2898 let mut list_builder = builder.new_list();
2899 list_builder.append_value("hi");
2900 drop(list_builder);
2901
2902 builder.append_value(42i8);
2903
2904 let (metadata, value) = builder.finish();
2906 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2907 assert!(metadata.is_empty());
2908
2909 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2910 assert_eq!(variant, Variant::Int8(42));
2911 }
2912
2913 #[test]
2914 fn test_variant_builder_to_object_builder_no_finish() {
2915 let mut builder = VariantBuilder::new();
2917 let mut object_builder = builder.new_object();
2918 object_builder.insert("name", "unknown");
2919 drop(object_builder);
2920
2921 builder.append_value(42i8);
2922
2923 let (metadata, value) = builder.finish();
2925 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2926 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2929 assert_eq!(variant, Variant::Int8(42));
2930 }
2931
2932 #[test]
2933 fn test_list_builder_to_list_builder_inner_no_finish() {
2934 let mut builder = VariantBuilder::new();
2935 let mut list_builder = builder.new_list();
2936 list_builder.append_value(1i8);
2937
2938 let mut nested_list_builder = list_builder.new_list();
2940 nested_list_builder.append_value("hi");
2941 drop(nested_list_builder);
2942
2943 list_builder.append_value(2i8);
2944
2945 list_builder.finish();
2947 let (metadata, value) = builder.finish();
2948 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2949 assert!(metadata.is_empty());
2950
2951 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2952 let list = variant.as_list().unwrap();
2953 assert_eq!(list.len(), 2);
2954 assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
2955 assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
2956 }
2957
2958 #[test]
2959 fn test_list_builder_to_list_builder_outer_no_finish() {
2960 let mut builder = VariantBuilder::new();
2961 let mut list_builder = builder.new_list();
2962 list_builder.append_value(1i8);
2963
2964 let mut nested_list_builder = list_builder.new_list();
2966 nested_list_builder.append_value("hi");
2967 nested_list_builder.finish();
2968
2969 drop(list_builder);
2971
2972 builder.append_value(2i8);
2973
2974 let (metadata, value) = builder.finish();
2976 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2977 assert!(metadata.is_empty());
2978
2979 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2980 assert_eq!(variant, Variant::Int8(2));
2981 }
2982
2983 #[test]
2984 fn test_list_builder_to_object_builder_inner_no_finish() {
2985 let mut builder = VariantBuilder::new();
2986 let mut list_builder = builder.new_list();
2987 list_builder.append_value(1i8);
2988
2989 let mut nested_object_builder = list_builder.new_object();
2991 nested_object_builder.insert("name", "unknown");
2992 drop(nested_object_builder);
2993
2994 list_builder.append_value(2i8);
2995
2996 list_builder.finish();
2998 let (metadata, value) = builder.finish();
2999 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3000 assert!(metadata.is_empty());
3001
3002 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3003 let list = variant.as_list().unwrap();
3004 assert_eq!(list.len(), 2);
3005 assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
3006 assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
3007 }
3008
3009 #[test]
3010 fn test_list_builder_to_object_builder_outer_no_finish() {
3011 let mut builder = VariantBuilder::new();
3012 let mut list_builder = builder.new_list();
3013 list_builder.append_value(1i8);
3014
3015 let mut nested_object_builder = list_builder.new_object();
3017 nested_object_builder.insert("name", "unknown");
3018 nested_object_builder.finish();
3019
3020 drop(list_builder);
3022
3023 builder.append_value(2i8);
3024
3025 let (metadata, value) = builder.finish();
3027 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3028 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3031 assert_eq!(variant, Variant::Int8(2));
3032 }
3033
3034 #[test]
3035 fn test_object_builder_to_list_builder_inner_no_finish() {
3036 let mut builder = VariantBuilder::new();
3037 let mut object_builder = builder.new_object();
3038 object_builder.insert("first", 1i8);
3039
3040 let mut nested_list_builder = object_builder.new_list("nested");
3042 nested_list_builder.append_value("hi");
3043 drop(nested_list_builder);
3044
3045 object_builder.insert("second", 2i8);
3046
3047 object_builder.finish();
3049 let (metadata, value) = builder.finish();
3050
3051 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3052 assert_eq!(metadata.len(), 2);
3053 assert_eq!(&metadata[0], "first");
3054 assert_eq!(&metadata[1], "second");
3055
3056 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3057 let obj = variant.as_object().unwrap();
3058 assert_eq!(obj.len(), 2);
3059 assert_eq!(obj.get("first"), Some(Variant::Int8(1)));
3060 assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
3061 }
3062
3063 #[test]
3064 fn test_object_builder_to_list_builder_outer_no_finish() {
3065 let mut builder = VariantBuilder::new();
3066 let mut object_builder = builder.new_object();
3067 object_builder.insert("first", 1i8);
3068
3069 let mut nested_list_builder = object_builder.new_list("nested");
3071 nested_list_builder.append_value("hi");
3072 nested_list_builder.finish();
3073
3074 drop(object_builder);
3076
3077 builder.append_value(2i8);
3078
3079 let (metadata, value) = builder.finish();
3081 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3082 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3085 assert_eq!(variant, Variant::Int8(2));
3086 }
3087
3088 #[test]
3089 fn test_object_builder_to_object_builder_inner_no_finish() {
3090 let mut builder = VariantBuilder::new();
3091 let mut object_builder = builder.new_object();
3092 object_builder.insert("first", 1i8);
3093
3094 let mut nested_object_builder = object_builder.new_object("nested");
3096 nested_object_builder.insert("name", "unknown");
3097 drop(nested_object_builder);
3098
3099 object_builder.insert("second", 2i8);
3100
3101 object_builder.finish();
3103 let (metadata, value) = builder.finish();
3104
3105 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3106 assert_eq!(metadata.len(), 2); assert_eq!(&metadata[0], "first");
3108 assert_eq!(&metadata[1], "second");
3109
3110 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3111 let obj = variant.as_object().unwrap();
3112 assert_eq!(obj.len(), 2);
3113 assert_eq!(obj.get("first"), Some(Variant::Int8(1)));
3114 assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
3115 }
3116
3117 #[test]
3118 fn test_object_builder_to_object_builder_outer_no_finish() {
3119 let mut builder = VariantBuilder::new();
3120 let mut object_builder = builder.new_object();
3121 object_builder.insert("first", 1i8);
3122
3123 let mut nested_object_builder = object_builder.new_object("nested");
3125 nested_object_builder.insert("name", "unknown");
3126 nested_object_builder.finish();
3127
3128 drop(object_builder);
3130
3131 builder.append_value(2i8);
3132
3133 let (metadata, value) = builder.finish();
3135 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3136 assert_eq!(metadata.len(), 0); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3139 assert_eq!(variant, Variant::Int8(2));
3140 }
3141
3142 #[test]
3144 fn test_append_object() {
3145 let (m1, v1) = make_object();
3146 let variant = Variant::new(&m1, &v1);
3147
3148 let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3149
3150 builder.append_value(variant.clone());
3151
3152 let (metadata, value) = builder.finish();
3153 assert_eq!(variant, Variant::new(&metadata, &value));
3154 }
3155
3156 fn make_object() -> (Vec<u8>, Vec<u8>) {
3158 let mut builder = VariantBuilder::new();
3159
3160 let mut obj = builder.new_object();
3161
3162 obj.insert("b", true);
3163 obj.insert("a", false);
3164 obj.finish();
3165 builder.finish()
3166 }
3167
3168 #[test]
3169 fn test_append_nested_object() {
3170 let (m1, v1) = make_nested_object();
3171 let variant = Variant::new(&m1, &v1);
3172
3173 let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3175 builder.append_value(variant.clone());
3176
3177 let (metadata, value) = builder.finish();
3178 let result_variant = Variant::new(&metadata, &value);
3179
3180 assert_eq!(variant, result_variant);
3181 }
3182
3183 fn make_nested_object() -> (Vec<u8>, Vec<u8>) {
3185 let mut builder = VariantBuilder::new();
3186
3187 {
3188 let mut outer_obj = builder.new_object();
3189
3190 {
3191 let mut inner_obj = outer_obj.new_object("b");
3192 inner_obj.insert("a", "inner_value");
3193 inner_obj.finish();
3194 }
3195
3196 outer_obj.finish();
3197 }
3198
3199 builder.finish()
3200 }
3201
3202 #[test]
3203 fn test_append_list() {
3204 let (m1, v1) = make_list();
3205 let variant = Variant::new(&m1, &v1);
3206 let mut builder = VariantBuilder::new();
3207 builder.append_value(variant.clone());
3208 let (metadata, value) = builder.finish();
3209 assert_eq!(variant, Variant::new(&metadata, &value));
3210 }
3211
3212 fn make_list() -> (Vec<u8>, Vec<u8>) {
3214 let mut builder = VariantBuilder::new();
3215
3216 builder
3217 .new_list()
3218 .with_value(1234)
3219 .with_value("a string value")
3220 .finish();
3221
3222 builder.finish()
3223 }
3224
3225 #[test]
3226 fn test_append_nested_list() {
3227 let (m1, v1) = make_nested_list();
3228 let variant = Variant::new(&m1, &v1);
3229 let mut builder = VariantBuilder::new();
3230 builder.append_value(variant.clone());
3231 let (metadata, value) = builder.finish();
3232 assert_eq!(variant, Variant::new(&metadata, &value));
3233 }
3234
3235 fn make_nested_list() -> (Vec<u8>, Vec<u8>) {
3236 let mut builder = VariantBuilder::new();
3237 let mut list = builder.new_list();
3238
3239 list.new_list()
3241 .with_value("the dog licked the oil")
3242 .with_value(4.3)
3243 .finish();
3244
3245 list.finish();
3246
3247 builder.finish()
3248 }
3249
3250 #[test]
3253 fn test_append_list_object_list_object() {
3254 let mut counter = 0..;
3256 let mut take = move |i| (&mut counter).take(i).collect::<Vec<_>>();
3257 let mut builder = VariantBuilder::new();
3258 let skip = 5;
3259 {
3260 let mut list = builder.new_list();
3261 for i in take(4) {
3262 let mut object = list.new_object();
3263 for i in take(4) {
3264 let field_name = format!("field{i}");
3265 let mut list = object.new_list(&field_name);
3266 for i in take(3) {
3267 let mut object = list.new_object();
3268 for i in take(3) {
3269 if i % skip != 0 {
3270 object.insert(&format!("field{i}"), i);
3271 }
3272 }
3273 if i % skip != 0 {
3274 object.finish();
3275 }
3276 }
3277 if i % skip != 0 {
3278 list.finish();
3279 }
3280 }
3281 if i % skip != 0 {
3282 object.finish();
3283 }
3284 }
3285 list.finish();
3286 }
3287 let (metadata, value) = builder.finish();
3288 let v1 = Variant::try_new(&metadata, &value).unwrap();
3289
3290 let (metadata, value) = VariantBuilder::new().with_value(v1.clone()).finish();
3291 let v2 = Variant::try_new(&metadata, &value).unwrap();
3292
3293 assert_eq!(format!("{v1:?}"), format!("{v2:?}"));
3294 }
3295
3296 #[test]
3297 fn test_read_only_metadata_builder() {
3298 let mut default_builder = VariantBuilder::new();
3300 default_builder.add_field_name("name");
3301 default_builder.add_field_name("age");
3302 default_builder.add_field_name("active");
3303 let (metadata_bytes, _) = default_builder.finish();
3304
3305 let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
3307 let mut metadata_builder = ReadOnlyMetadataBuilder::new(metadata);
3308 let mut value_builder = ValueBuilder::new();
3309
3310 {
3311 let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
3312 let mut obj = ObjectBuilder::new(state, false);
3313
3314 obj.insert("name", "Alice");
3316 obj.insert("age", 30i8);
3317 obj.insert("active", true);
3318 obj.finish();
3319 }
3320
3321 let value = value_builder.into_inner();
3322
3323 let variant = Variant::try_new(&metadata_bytes, &value).unwrap();
3325 let obj = variant.as_object().unwrap();
3326 assert_eq!(obj.get("name"), Some(Variant::from("Alice")));
3327 assert_eq!(obj.get("age"), Some(Variant::Int8(30)));
3328 assert_eq!(obj.get("active"), Some(Variant::from(true)));
3329 }
3330
3331 #[test]
3332 fn test_read_only_metadata_builder_fails_on_unknown_field() {
3333 let mut default_builder = VariantBuilder::new();
3335 default_builder.add_field_name("known_field");
3336 let (metadata_bytes, _) = default_builder.finish();
3337
3338 let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
3340 let mut metadata_builder = ReadOnlyMetadataBuilder::new(metadata);
3341 let mut value_builder = ValueBuilder::new();
3342
3343 {
3344 let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
3345 let mut obj = ObjectBuilder::new(state, false);
3346
3347 obj.insert("known_field", "value");
3349
3350 let result = obj.try_insert("unknown_field", "value");
3352 assert!(result.is_err());
3353 assert!(result
3354 .unwrap_err()
3355 .to_string()
3356 .contains("Field name 'unknown_field' not found"));
3357 }
3358 }
3359
3360 #[test]
3361 fn test_append_variant_bytes_round_trip() {
3362 let mut builder = VariantBuilder::new();
3364 {
3365 let mut obj = builder.new_object();
3366 obj.insert("name", "Alice");
3367 obj.insert("age", 30i32);
3368 {
3369 let mut scores_list = obj.new_list("scores");
3370 scores_list.append_value(95i32);
3371 scores_list.append_value(87i32);
3372 scores_list.append_value(92i32);
3373 scores_list.finish();
3374 }
3375 {
3376 let mut address = obj.new_object("address");
3377 address.insert("street", "123 Main St");
3378 address.insert("city", "Anytown");
3379 address.finish();
3380 }
3381 obj.finish();
3382 }
3383 let (metadata, value1) = builder.finish();
3384 let variant1 = Variant::try_new(&metadata, &value1).unwrap();
3385
3386 let metadata = VariantMetadata::new(&metadata);
3388 let mut metadata = ReadOnlyMetadataBuilder::new(metadata);
3389 let mut builder2 = ValueBuilder::new();
3390 let state = ParentState::variant(&mut builder2, &mut metadata);
3391 ValueBuilder::append_variant_bytes(state, variant1.clone());
3392 let value2 = builder2.into_inner();
3393
3394 assert_eq!(value1, value2);
3396 }
3397
3398 #[test]
3399 fn test_object_insert_bytes_subset() {
3400 let mut builder = VariantBuilder::new().with_field_names(["new_field", "another_field"]);
3402 {
3403 let mut obj = builder.new_object();
3404 obj.insert("field1", "value1");
3405 obj.insert("field2", 42i32);
3406 obj.insert("field3", true);
3407 obj.insert("field4", "value4");
3408 obj.finish();
3409 }
3410 let (metadata1, value1) = builder.finish();
3411 let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3412 let original_obj = original_variant.as_object().unwrap();
3413
3414 let metadata2 = VariantMetadata::new(&metadata1);
3416 let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
3417 let mut builder2 = ValueBuilder::new();
3418 let state = ParentState::variant(&mut builder2, &mut metadata2);
3419 {
3420 let mut obj = ObjectBuilder::new(state, true);
3421
3422 obj.insert_bytes("field1", original_obj.get("field1").unwrap());
3424
3425 obj.insert("new_field", "new_value");
3427
3428 obj.insert_bytes("field3", original_obj.get("field3").unwrap());
3430
3431 obj.insert("another_field", 99i32);
3433
3434 obj.insert_bytes("field2", original_obj.get("field2").unwrap());
3436
3437 obj.finish();
3438 }
3439 let value2 = builder2.into_inner();
3440 let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3441 let result_obj = result_variant.as_object().unwrap();
3442
3443 assert_eq!(result_obj.len(), 5);
3445 assert_eq!(
3446 result_obj.get("field1").unwrap().as_string().unwrap(),
3447 "value1"
3448 );
3449 assert_eq!(result_obj.get("field2").unwrap().as_int32().unwrap(), 42);
3450 assert!(result_obj.get("field3").unwrap().as_boolean().unwrap());
3451 assert_eq!(
3452 result_obj.get("new_field").unwrap().as_string().unwrap(),
3453 "new_value"
3454 );
3455 assert_eq!(
3456 result_obj.get("another_field").unwrap().as_int32().unwrap(),
3457 99
3458 );
3459 }
3460
3461 #[test]
3462 fn test_list_append_bytes_subset() {
3463 let mut builder = VariantBuilder::new();
3465 {
3466 let mut list = builder.new_list();
3467 list.append_value("item1");
3468 list.append_value(42i32);
3469 list.append_value(true);
3470 list.append_value("item4");
3471 list.append_value(1.234f64);
3472 list.finish();
3473 }
3474 let (metadata1, value1) = builder.finish();
3475 let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3476 let original_list = original_variant.as_list().unwrap();
3477
3478 let metadata2 = VariantMetadata::new(&metadata1);
3480 let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
3481 let mut builder2 = ValueBuilder::new();
3482 let state = ParentState::variant(&mut builder2, &mut metadata2);
3483 {
3484 let mut list = ListBuilder::new(state, true);
3485
3486 list.append_value_bytes(original_list.get(0).unwrap());
3488
3489 list.append_value("new_item");
3491
3492 list.append_value_bytes(original_list.get(2).unwrap());
3494
3495 list.append_value(99i32);
3497
3498 list.append_value_bytes(original_list.get(4).unwrap());
3500
3501 list.finish();
3502 }
3503 let value2 = builder2.into_inner();
3504 let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3505 let result_list = result_variant.as_list().unwrap();
3506
3507 assert_eq!(result_list.len(), 5);
3509 assert_eq!(result_list.get(0).unwrap().as_string().unwrap(), "item1");
3510 assert_eq!(result_list.get(1).unwrap().as_string().unwrap(), "new_item");
3511 assert!(result_list.get(2).unwrap().as_boolean().unwrap());
3512 assert_eq!(result_list.get(3).unwrap().as_int32().unwrap(), 99);
3513 assert_eq!(result_list.get(4).unwrap().as_f64().unwrap(), 1.234);
3514 }
3515
3516 #[test]
3517 fn test_complex_nested_filtering_injection() {
3518 let mut builder = VariantBuilder::new().with_field_names([
3521 "active_count",
3522 "active_users",
3523 "computed_score",
3524 "processed_at",
3525 "status",
3526 ]);
3527
3528 {
3529 let mut root_obj = builder.new_object();
3530 root_obj.insert("metadata", "original");
3531
3532 {
3533 let mut users_list = root_obj.new_list("users");
3534
3535 {
3537 let mut user1 = users_list.new_object();
3538 user1.insert("id", 1i32);
3539 user1.insert("name", "Alice");
3540 user1.insert("active", true);
3541 user1.finish();
3542 }
3543
3544 {
3546 let mut user2 = users_list.new_object();
3547 user2.insert("id", 2i32);
3548 user2.insert("name", "Bob");
3549 user2.insert("active", false);
3550 user2.finish();
3551 }
3552
3553 {
3555 let mut user3 = users_list.new_object();
3556 user3.insert("id", 3i32);
3557 user3.insert("name", "Charlie");
3558 user3.insert("active", true);
3559 user3.finish();
3560 }
3561
3562 users_list.finish();
3563 }
3564
3565 root_obj.insert("total_count", 3i32);
3566 root_obj.finish();
3567 }
3568 let (metadata1, value1) = builder.finish();
3569 let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3570 let original_obj = original_variant.as_object().unwrap();
3571 let original_users = original_obj.get("users").unwrap();
3572 let original_users = original_users.as_list().unwrap();
3573
3574 let metadata2 = VariantMetadata::new(&metadata1);
3576 let mut metadata2 = ReadOnlyMetadataBuilder::new(metadata2);
3577 let mut builder2 = ValueBuilder::new();
3578 let state = ParentState::variant(&mut builder2, &mut metadata2);
3579 {
3580 let mut root_obj = ObjectBuilder::new(state, true);
3581
3582 root_obj.insert_bytes("metadata", original_obj.get("metadata").unwrap());
3584
3585 root_obj.insert("processed_at", "2024-01-01T00:00:00Z");
3587
3588 {
3589 let mut filtered_users = root_obj.new_list("active_users");
3590
3591 for i in 0..original_users.len() {
3593 let user = original_users.get(i).unwrap();
3594 let user = user.as_object().unwrap();
3595 if user.get("active").unwrap().as_boolean().unwrap() {
3596 {
3597 let mut new_user = filtered_users.new_object();
3598
3599 new_user.insert_bytes("id", user.get("id").unwrap());
3601 new_user.insert_bytes("name", user.get("name").unwrap());
3602
3603 let user_id = user.get("id").unwrap().as_int32().unwrap();
3605 new_user.insert("computed_score", user_id * 10);
3606
3607 new_user.insert("status", "verified");
3609
3610 new_user.finish();
3611 }
3612 }
3613 }
3614
3615 {
3617 let mut new_user = filtered_users.new_object();
3618 new_user.insert("id", 999i32);
3619 new_user.insert("name", "System User");
3620 new_user.insert("computed_score", 0i32);
3621 new_user.insert("status", "system");
3622 new_user.finish();
3623 }
3624
3625 filtered_users.finish();
3626 }
3627
3628 root_obj.insert("active_count", 3i32); root_obj.finish();
3632 }
3633 let value2 = builder2.into_inner();
3634 let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3635 let result_obj = result_variant.as_object().unwrap();
3636
3637 assert_eq!(
3639 result_obj.get("metadata").unwrap().as_string().unwrap(),
3640 "original"
3641 );
3642 assert_eq!(
3643 result_obj.get("processed_at").unwrap().as_string().unwrap(),
3644 "2024-01-01T00:00:00Z"
3645 );
3646 assert_eq!(
3647 result_obj.get("active_count").unwrap().as_int32().unwrap(),
3648 3
3649 );
3650
3651 let active_users = result_obj.get("active_users").unwrap();
3652 let active_users = active_users.as_list().unwrap();
3653 assert_eq!(active_users.len(), 3);
3654
3655 let alice = active_users.get(0).unwrap();
3657 let alice = alice.as_object().unwrap();
3658 assert_eq!(alice.get("id").unwrap().as_int32().unwrap(), 1);
3659 assert_eq!(alice.get("name").unwrap().as_string().unwrap(), "Alice");
3660 assert_eq!(alice.get("computed_score").unwrap().as_int32().unwrap(), 10);
3661 assert_eq!(
3662 alice.get("status").unwrap().as_string().unwrap(),
3663 "verified"
3664 );
3665 assert!(alice.get("active").is_none()); let charlie = active_users.get(1).unwrap();
3669 let charlie = charlie.as_object().unwrap();
3670 assert_eq!(charlie.get("id").unwrap().as_int32().unwrap(), 3);
3671 assert_eq!(charlie.get("name").unwrap().as_string().unwrap(), "Charlie");
3672 assert_eq!(
3673 charlie.get("computed_score").unwrap().as_int32().unwrap(),
3674 30
3675 );
3676 assert_eq!(
3677 charlie.get("status").unwrap().as_string().unwrap(),
3678 "verified"
3679 );
3680
3681 let system_user = active_users.get(2).unwrap();
3683 let system_user = system_user.as_object().unwrap();
3684 assert_eq!(system_user.get("id").unwrap().as_int32().unwrap(), 999);
3685 assert_eq!(
3686 system_user.get("name").unwrap().as_string().unwrap(),
3687 "System User"
3688 );
3689 assert_eq!(
3690 system_user
3691 .get("computed_score")
3692 .unwrap()
3693 .as_int32()
3694 .unwrap(),
3695 0
3696 );
3697 assert_eq!(
3698 system_user.get("status").unwrap().as_string().unwrap(),
3699 "system"
3700 );
3701 }
3702}