1use crate::decoder::{VariantBasicType, VariantPrimitiveType};
18use crate::{
19 ShortString, Variant, VariantDecimal4, VariantDecimal8, VariantDecimal16, VariantList,
20 VariantMetadata, VariantObject,
21};
22use arrow_schema::ArrowError;
23use chrono::Timelike;
24use indexmap::{IndexMap, IndexSet};
25use uuid::Uuid;
26
27use std::collections::HashMap;
28
29const BASIC_TYPE_BITS: u8 = 2;
30const UNIX_EPOCH_DATE: chrono::NaiveDate = chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
31
32fn primitive_header(primitive_type: VariantPrimitiveType) -> u8 {
33 (primitive_type as u8) << 2 | VariantBasicType::Primitive as u8
34}
35
36fn short_string_header(len: usize) -> u8 {
37 (len as u8) << 2 | VariantBasicType::ShortString as u8
38}
39
40fn array_header(large: bool, offset_size: u8) -> u8 {
41 let large_bit = if large { 1 } else { 0 };
42 (large_bit << (BASIC_TYPE_BITS + 2))
43 | ((offset_size - 1) << BASIC_TYPE_BITS)
44 | VariantBasicType::Array as u8
45}
46
47fn object_header(large: bool, id_size: u8, offset_size: u8) -> u8 {
48 let large_bit = if large { 1 } else { 0 };
49 (large_bit << (BASIC_TYPE_BITS + 4))
50 | ((id_size - 1) << (BASIC_TYPE_BITS + 2))
51 | ((offset_size - 1) << BASIC_TYPE_BITS)
52 | VariantBasicType::Object as u8
53}
54
55fn int_size(v: usize) -> u8 {
56 match v {
57 0..=0xFF => 1,
58 0x100..=0xFFFF => 2,
59 0x10000..=0xFFFFFF => 3,
60 _ => 4,
61 }
62}
63
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<S: BuilderSpecificState>(state: ParentState<'_, S>, obj: VariantObject) {
279 let mut object_builder = ObjectBuilder::new(state, false);
280 object_builder.extend(obj.iter());
281 object_builder.finish();
282 }
283
284 fn try_append_object<S: BuilderSpecificState>(
285 state: ParentState<'_, S>,
286 obj: VariantObject,
287 ) -> Result<(), ArrowError> {
288 let mut object_builder = ObjectBuilder::new(state, false);
289
290 for res in obj.iter_try() {
291 let (field_name, value) = res?;
292 object_builder.try_insert(field_name, value)?;
293 }
294
295 object_builder.finish();
296 Ok(())
297 }
298
299 fn append_list<S: BuilderSpecificState>(state: ParentState<'_, S>, list: VariantList) {
300 let mut list_builder = ListBuilder::new(state, false);
301 list_builder.extend(list.iter());
302 list_builder.finish();
303 }
304
305 fn try_append_list<S: BuilderSpecificState>(
306 state: ParentState<'_, S>,
307 list: VariantList,
308 ) -> Result<(), ArrowError> {
309 let mut list_builder = ListBuilder::new(state, false);
310 for res in list.iter_try() {
311 let value = res?;
312 list_builder.try_append_value(value)?;
313 }
314
315 list_builder.finish();
316
317 Ok(())
318 }
319
320 pub fn offset(&self) -> usize {
322 self.0.len()
323 }
324
325 pub fn append_variant<S: BuilderSpecificState>(
332 mut state: ParentState<'_, S>,
333 variant: Variant<'_, '_>,
334 ) {
335 variant_append_value!(
336 state.value_builder(),
337 variant,
338 Variant::Object(obj) => return Self::append_object(state, obj),
339 Variant::List(list) => return Self::append_list(state, list)
340 );
341 state.finish();
342 }
343
344 pub fn try_append_variant<S: BuilderSpecificState>(
349 mut state: ParentState<'_, S>,
350 variant: Variant<'_, '_>,
351 ) -> Result<(), ArrowError> {
352 variant_append_value!(
353 state.value_builder(),
354 variant,
355 Variant::Object(obj) => return Self::try_append_object(state, obj),
356 Variant::List(list) => return Self::try_append_list(state, list)
357 );
358 state.finish();
359 Ok(())
360 }
361
362 pub fn append_variant_bytes<S: BuilderSpecificState>(
371 mut state: ParentState<'_, S>,
372 variant: Variant<'_, '_>,
373 ) {
374 let builder = state.value_builder();
375 variant_append_value!(
376 builder,
377 variant,
378 Variant::Object(obj) => builder.append_slice(obj.value),
379 Variant::List(list) => builder.append_slice(list.value)
380 );
381 state.finish();
382 }
383
384 fn append_header_start_from_buf_pos(
387 &mut self,
388 start_pos: usize, header_byte: u8,
390 is_large: bool,
391 num_fields: usize,
392 ) -> usize {
393 let buffer = self.inner_mut();
394
395 let mut header_pos = start_pos;
397
398 buffer[header_pos] = header_byte;
400 header_pos += 1;
401
402 if is_large {
404 buffer[header_pos..header_pos + 4].copy_from_slice(&(num_fields as u32).to_le_bytes());
405 header_pos += 4;
406 } else {
407 buffer[header_pos] = num_fields as u8;
408 header_pos += 1;
409 }
410
411 header_pos
412 }
413
414 fn append_offset_array_start_from_buf_pos(
417 &mut self,
418 start_pos: usize,
419 offsets: impl IntoIterator<Item = usize>,
420 data_size: Option<usize>,
421 nbytes: u8,
422 ) -> usize {
423 let buf = self.inner_mut();
424
425 let mut current_pos = start_pos;
426 for relative_offset in offsets {
427 write_offset_at_pos(buf, current_pos, relative_offset, nbytes);
428 current_pos += nbytes as usize;
429 }
430
431 if let Some(data_size) = data_size {
433 write_offset_at_pos(buf, current_pos, data_size, nbytes);
435 current_pos += nbytes as usize;
436 }
437
438 current_pos
439 }
440}
441
442pub trait MetadataBuilder: std::fmt::Debug {
446 fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError>;
450
451 fn field_name(&self, field_id: usize) -> &str;
454
455 fn num_field_names(&self) -> usize;
459
460 fn truncate_field_names(&mut self, new_size: usize);
462
463 fn finish(&mut self) -> usize;
465}
466
467impl MetadataBuilder for WritableMetadataBuilder {
468 fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError> {
469 Ok(self.upsert_field_name(field_name))
470 }
471 fn field_name(&self, field_id: usize) -> &str {
472 self.field_name(field_id)
473 }
474 fn num_field_names(&self) -> usize {
475 self.num_field_names()
476 }
477 fn truncate_field_names(&mut self, new_size: usize) {
478 self.field_names.truncate(new_size)
479 }
480 fn finish(&mut self) -> usize {
481 self.finish()
482 }
483}
484
485#[derive(Debug)]
494pub struct ReadOnlyMetadataBuilder<'m> {
495 metadata: &'m VariantMetadata<'m>,
496 known_field_names: HashMap<&'m str, u32>,
499}
500
501impl<'m> ReadOnlyMetadataBuilder<'m> {
502 pub fn new(metadata: &'m VariantMetadata<'m>) -> Self {
504 Self {
505 metadata,
506 known_field_names: HashMap::new(),
507 }
508 }
509}
510
511impl MetadataBuilder for ReadOnlyMetadataBuilder<'_> {
512 fn try_upsert_field_name(&mut self, field_name: &str) -> Result<u32, ArrowError> {
513 if let Some(field_id) = self.known_field_names.get(field_name) {
514 return Ok(*field_id);
515 }
516
517 let Some((field_id, field_name)) = self.metadata.get_entry(field_name) else {
518 return Err(ArrowError::InvalidArgumentError(format!(
519 "Field name '{field_name}' not found in metadata dictionary"
520 )));
521 };
522
523 self.known_field_names.insert(field_name, field_id);
524 Ok(field_id)
525 }
526 fn field_name(&self, field_id: usize) -> &str {
527 &self.metadata[field_id]
528 }
529 fn num_field_names(&self) -> usize {
530 self.metadata.len()
531 }
532 fn truncate_field_names(&mut self, new_size: usize) {
533 debug_assert_eq!(self.metadata.len(), new_size);
534 }
535 fn finish(&mut self) -> usize {
536 self.metadata.bytes.len()
537 }
538}
539
540#[derive(Default, Debug)]
546pub struct WritableMetadataBuilder {
547 field_names: IndexSet<String>,
549
550 is_sorted: bool,
552
553 metadata_buffer: Vec<u8>,
555}
556
557impl WritableMetadataBuilder {
558 pub fn upsert_field_name(&mut self, field_name: &str) -> u32 {
560 let (id, new_entry) = self.field_names.insert_full(field_name.to_string());
561
562 if new_entry {
563 let n = self.num_field_names();
564
565 self.is_sorted =
570 n == 1 || self.is_sorted && (self.field_names[n - 2] < self.field_names[n - 1]);
571 }
572
573 id as u32
574 }
575
576 pub fn offset(&self) -> usize {
578 self.metadata_buffer.len()
579 }
580
581 fn num_field_names(&self) -> usize {
588 let n = self.field_names.len();
589 assert!(n <= u32::MAX as usize);
590
591 n
592 }
593
594 fn field_name(&self, i: usize) -> &str {
595 &self.field_names[i]
596 }
597
598 fn metadata_size(&self) -> usize {
599 self.field_names.iter().map(|k| k.len()).sum()
600 }
601
602 pub fn finish(&mut self) -> usize {
606 let nkeys = self.num_field_names();
607
608 let total_dict_size: usize = self.metadata_size();
610
611 let metadata_buffer = &mut self.metadata_buffer;
612 let is_sorted = std::mem::take(&mut self.is_sorted);
613 let field_names = std::mem::take(&mut self.field_names);
614
615 let max_offset = std::cmp::max(total_dict_size, nkeys);
617 let offset_size = int_size(max_offset);
618
619 let offset_start = 1 + offset_size as usize;
620 let string_start = offset_start + (nkeys + 1) * offset_size as usize;
621 let metadata_size = string_start + total_dict_size;
622
623 metadata_buffer.reserve(metadata_size);
624
625 metadata_buffer.push(0x01 | (is_sorted as u8) << 4 | ((offset_size - 1) << 6));
627
628 write_offset(metadata_buffer, nkeys, offset_size);
630
631 let mut cur_offset = 0;
633 for key in field_names.iter() {
634 write_offset(metadata_buffer, cur_offset, offset_size);
635 cur_offset += key.len();
636 }
637 write_offset(metadata_buffer, cur_offset, offset_size);
639
640 for key in field_names {
642 metadata_buffer.extend_from_slice(key.as_bytes());
643 }
644
645 metadata_buffer.len()
646 }
647
648 pub fn into_inner(self) -> Vec<u8> {
650 self.metadata_buffer
651 }
652}
653
654impl<S: AsRef<str>> FromIterator<S> for WritableMetadataBuilder {
655 fn from_iter<T: IntoIterator<Item = S>>(iter: T) -> Self {
656 let mut this = Self::default();
657 this.extend(iter);
658
659 this
660 }
661}
662
663impl<S: AsRef<str>> Extend<S> for WritableMetadataBuilder {
664 fn extend<T: IntoIterator<Item = S>>(&mut self, iter: T) {
665 let iter = iter.into_iter();
666 let (min, _) = iter.size_hint();
667
668 self.field_names.reserve(min);
669
670 for field_name in iter {
671 self.upsert_field_name(field_name.as_ref());
672 }
673 }
674}
675
676pub trait BuilderSpecificState: std::fmt::Debug {
678 fn finish(
686 &mut self,
687 _metadata_builder: &mut dyn MetadataBuilder,
688 _value_builder: &mut ValueBuilder,
689 ) {
690 }
691
692 fn rollback(&mut self) {}
700}
701
702impl BuilderSpecificState for () {}
704
705#[derive(Debug)]
707pub struct ListState<'a> {
708 offsets: &'a mut Vec<usize>,
709 saved_offsets_size: usize,
710}
711
712impl BuilderSpecificState for ListState<'_> {
714 fn rollback(&mut self) {
715 self.offsets.truncate(self.saved_offsets_size);
716 }
717}
718
719#[derive(Debug)]
721pub struct ObjectState<'a> {
722 fields: &'a mut IndexMap<u32, usize>,
723 saved_fields_size: usize,
724}
725
726impl BuilderSpecificState for ObjectState<'_> {
728 fn rollback(&mut self) {
729 self.fields.truncate(self.saved_fields_size);
730 }
731}
732
733#[derive(Debug)]
745pub struct ParentState<'a, S: BuilderSpecificState> {
746 value_builder: &'a mut ValueBuilder,
747 saved_value_builder_offset: usize,
748 metadata_builder: &'a mut dyn MetadataBuilder,
749 saved_metadata_builder_dict_size: usize,
750 builder_state: S,
751 finished: bool,
752}
753
754impl<'a, S: BuilderSpecificState> ParentState<'a, S> {
755 pub fn new(
759 value_builder: &'a mut ValueBuilder,
760 metadata_builder: &'a mut dyn MetadataBuilder,
761 builder_state: S,
762 ) -> Self {
763 Self {
764 saved_value_builder_offset: value_builder.offset(),
765 value_builder,
766 saved_metadata_builder_dict_size: metadata_builder.num_field_names(),
767 metadata_builder,
768 builder_state,
769 finished: false,
770 }
771 }
772
773 pub fn finish(&mut self) {
776 self.builder_state
777 .finish(self.metadata_builder, self.value_builder);
778 self.finished = true
779 }
780
781 fn rollback(&mut self) {
783 if self.finished {
784 return;
785 }
786
787 self.value_builder
788 .inner_mut()
789 .truncate(self.saved_value_builder_offset);
790 self.metadata_builder
791 .truncate_field_names(self.saved_metadata_builder_dict_size);
792 self.builder_state.rollback();
793 }
794
795 fn value_builder(&mut self) -> &mut ValueBuilder {
797 self.value_builder
798 }
799
800 fn metadata_builder(&mut self) -> &mut dyn MetadataBuilder {
802 self.metadata_builder
803 }
804}
805
806impl<'a> ParentState<'a, ()> {
807 pub fn variant(
811 value_builder: &'a mut ValueBuilder,
812 metadata_builder: &'a mut dyn MetadataBuilder,
813 ) -> Self {
814 Self::new(value_builder, metadata_builder, ())
815 }
816}
817
818impl<'a> ParentState<'a, ListState<'a>> {
819 pub fn list(
823 value_builder: &'a mut ValueBuilder,
824 metadata_builder: &'a mut dyn MetadataBuilder,
825 offsets: &'a mut Vec<usize>,
826 saved_parent_value_builder_offset: usize,
827 ) -> Self {
828 let saved_value_builder_offset = value_builder.offset();
832 let saved_offsets_size = offsets.len();
833 offsets.push(saved_value_builder_offset - saved_parent_value_builder_offset);
834
835 let builder_state = ListState {
836 offsets,
837 saved_offsets_size,
838 };
839 Self {
840 saved_metadata_builder_dict_size: metadata_builder.num_field_names(),
841 saved_value_builder_offset,
842 metadata_builder,
843 value_builder,
844 builder_state,
845 finished: false,
846 }
847 }
848}
849
850impl<'a> ParentState<'a, ObjectState<'a>> {
851 pub fn try_object(
857 value_builder: &'a mut ValueBuilder,
858 metadata_builder: &'a mut dyn MetadataBuilder,
859 fields: &'a mut IndexMap<u32, usize>,
860 saved_parent_value_builder_offset: usize,
861 field_name: &str,
862 validate_unique_fields: bool,
863 ) -> Result<Self, ArrowError> {
864 let saved_value_builder_offset = value_builder.offset();
868 let saved_fields_size = fields.len();
869 let saved_metadata_builder_dict_size = metadata_builder.num_field_names();
870 let field_id = metadata_builder.try_upsert_field_name(field_name)?;
871 let field_start = saved_value_builder_offset - saved_parent_value_builder_offset;
872 if fields.insert(field_id, field_start).is_some() && validate_unique_fields {
873 return Err(ArrowError::InvalidArgumentError(format!(
874 "Duplicate field name: {field_name}"
875 )));
876 }
877
878 let builder_state = ObjectState {
879 fields,
880 saved_fields_size,
881 };
882 Ok(Self {
883 saved_metadata_builder_dict_size,
884 saved_value_builder_offset,
885 value_builder,
886 metadata_builder,
887 builder_state,
888 finished: false,
889 })
890 }
891}
892
893impl<S: BuilderSpecificState> Drop for ParentState<'_, S> {
895 fn drop(&mut self) {
896 self.rollback()
897 }
898}
899
900#[derive(Default, Debug)]
1136pub struct VariantBuilder {
1137 value_builder: ValueBuilder,
1138 metadata_builder: WritableMetadataBuilder,
1139 validate_unique_fields: bool,
1140}
1141
1142impl VariantBuilder {
1143 pub fn new() -> Self {
1145 Self {
1146 value_builder: ValueBuilder::new(),
1147 metadata_builder: WritableMetadataBuilder::default(),
1148 validate_unique_fields: false,
1149 }
1150 }
1151
1152 pub fn with_metadata(mut self, metadata: VariantMetadata) -> Self {
1154 self.metadata_builder.extend(metadata.iter());
1155
1156 self
1157 }
1158
1159 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1165 self.validate_unique_fields = validate_unique_fields;
1166 self
1167 }
1168
1169 pub fn with_field_names<'a>(mut self, field_names: impl IntoIterator<Item = &'a str>) -> Self {
1176 self.metadata_builder.extend(field_names);
1177
1178 self
1179 }
1180
1181 pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
1188 self.append_value(value);
1189 self
1190 }
1191
1192 pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1196 mut self,
1197 value: T,
1198 ) -> Result<Self, ArrowError> {
1199 self.try_append_value(value)?;
1200 Ok(self)
1201 }
1202
1203 pub fn reserve(&mut self, capacity: usize) {
1207 self.metadata_builder.field_names.reserve(capacity);
1208 }
1209
1210 pub fn add_field_name(&mut self, field_name: &str) {
1214 self.metadata_builder.upsert_field_name(field_name);
1215 }
1216
1217 pub fn new_list(&mut self) -> ListBuilder<'_, ()> {
1221 let parent_state =
1222 ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1223 ListBuilder::new(parent_state, self.validate_unique_fields)
1224 }
1225
1226 pub fn new_object(&mut self) -> ObjectBuilder<'_, ()> {
1230 let parent_state =
1231 ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1232 ObjectBuilder::new(parent_state, self.validate_unique_fields)
1233 }
1234
1235 pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1250 let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1251 ValueBuilder::append_variant(state, value.into())
1252 }
1253
1254 pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1256 &mut self,
1257 value: T,
1258 ) -> Result<(), ArrowError> {
1259 let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1260 ValueBuilder::try_append_variant(state, value.into())
1261 }
1262
1263 pub fn append_value_bytes<'m, 'd>(&mut self, value: impl Into<Variant<'m, 'd>>) {
1272 let state = ParentState::variant(&mut self.value_builder, &mut self.metadata_builder);
1273 ValueBuilder::append_variant_bytes(state, value.into());
1274 }
1275
1276 pub fn finish(mut self) -> (Vec<u8>, Vec<u8>) {
1278 self.metadata_builder.finish();
1279 (
1280 self.metadata_builder.into_inner(),
1281 self.value_builder.into_inner(),
1282 )
1283 }
1284}
1285
1286#[derive(Debug)]
1290pub struct ListBuilder<'a, S: BuilderSpecificState> {
1291 parent_state: ParentState<'a, S>,
1292 offsets: Vec<usize>,
1293 validate_unique_fields: bool,
1294}
1295
1296impl<'a, S: BuilderSpecificState> ListBuilder<'a, S> {
1297 pub fn new(parent_state: ParentState<'a, S>, validate_unique_fields: bool) -> Self {
1299 Self {
1300 parent_state,
1301 offsets: vec![],
1302 validate_unique_fields,
1303 }
1304 }
1305
1306 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1311 self.validate_unique_fields = validate_unique_fields;
1312 self
1313 }
1314
1315 fn parent_state(&mut self) -> (ParentState<'_, ListState<'_>>, bool) {
1317 let state = ParentState::list(
1318 self.parent_state.value_builder,
1319 self.parent_state.metadata_builder,
1320 &mut self.offsets,
1321 self.parent_state.saved_value_builder_offset,
1322 );
1323 (state, self.validate_unique_fields)
1324 }
1325
1326 pub fn new_object(&mut self) -> ObjectBuilder<'_, ListState<'_>> {
1330 let (parent_state, validate_unique_fields) = self.parent_state();
1331 ObjectBuilder::new(parent_state, validate_unique_fields)
1332 }
1333
1334 pub fn new_list(&mut self) -> ListBuilder<'_, ListState<'_>> {
1338 let (parent_state, validate_unique_fields) = self.parent_state();
1339 ListBuilder::new(parent_state, validate_unique_fields)
1340 }
1341
1342 pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1349 let (state, _) = self.parent_state();
1350 ValueBuilder::append_variant(state, value.into())
1351 }
1352
1353 pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1355 &mut self,
1356 value: T,
1357 ) -> Result<(), ArrowError> {
1358 let (state, _) = self.parent_state();
1359 ValueBuilder::try_append_variant(state, value.into())
1360 }
1361
1362 pub fn append_value_bytes<'m, 'd>(&mut self, value: impl Into<Variant<'m, 'd>>) {
1371 let (state, _) = self.parent_state();
1372 ValueBuilder::append_variant_bytes(state, value.into())
1373 }
1374
1375 pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
1382 self.append_value(value);
1383 self
1384 }
1385
1386 pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1390 mut self,
1391 value: T,
1392 ) -> Result<Self, ArrowError> {
1393 self.try_append_value(value)?;
1394 Ok(self)
1395 }
1396
1397 pub fn finish(mut self) {
1399 let starting_offset = self.parent_state.saved_value_builder_offset;
1400 let value_builder = self.parent_state.value_builder();
1401
1402 let data_size = value_builder
1403 .offset()
1404 .checked_sub(starting_offset)
1405 .expect("Data size overflowed usize");
1406
1407 let num_elements = self.offsets.len();
1408 let is_large = num_elements > u8::MAX as usize;
1409 let offset_size = int_size(data_size);
1410
1411 let num_elements_size = if is_large { 4 } else { 1 }; let num_elements = self.offsets.len();
1413 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);
1420 let header = array_header(is_large, offset_size);
1422 bytes_to_splice.push(header);
1423
1424 append_packed_u32(&mut bytes_to_splice, num_elements as u32, num_elements_size);
1425
1426 for offset in &self.offsets {
1427 append_packed_u32(&mut bytes_to_splice, *offset as u32, offset_size as usize);
1428 }
1429
1430 append_packed_u32(&mut bytes_to_splice, data_size as u32, offset_size as usize);
1431
1432 value_builder
1433 .inner_mut()
1434 .splice(starting_offset..starting_offset, bytes_to_splice);
1435
1436 self.parent_state.finish();
1437 }
1438}
1439
1440impl<'a, 'm, 'v, S, V> Extend<V> for ListBuilder<'a, S>
1441where
1442 S: BuilderSpecificState,
1443 V: Into<Variant<'m, 'v>>,
1444{
1445 fn extend<T: IntoIterator<Item = V>>(&mut self, iter: T) {
1446 for v in iter.into_iter() {
1447 self.append_value(v);
1448 }
1449 }
1450}
1451
1452#[derive(Debug)]
1456pub struct ObjectBuilder<'a, S: BuilderSpecificState> {
1457 parent_state: ParentState<'a, S>,
1458 fields: IndexMap<u32, usize>, validate_unique_fields: bool,
1460}
1461
1462impl<'a, S: BuilderSpecificState> ObjectBuilder<'a, S> {
1463 pub fn new(parent_state: ParentState<'a, S>, validate_unique_fields: bool) -> Self {
1465 Self {
1466 parent_state,
1467 fields: IndexMap::new(),
1468 validate_unique_fields,
1469 }
1470 }
1471
1472 pub fn insert<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, key: &str, value: T) {
1483 let (state, _) = self.parent_state(key).unwrap();
1484 ValueBuilder::append_variant(state, value.into())
1485 }
1486
1487 pub fn try_insert<'m, 'd, T: Into<Variant<'m, 'd>>>(
1498 &mut self,
1499 key: &str,
1500 value: T,
1501 ) -> Result<(), ArrowError> {
1502 let (state, _) = self.parent_state(key)?;
1503 ValueBuilder::try_append_variant(state, value.into())
1504 }
1505
1506 pub fn insert_bytes<'m, 'd>(&mut self, key: &str, value: impl Into<Variant<'m, 'd>>) {
1520 self.try_insert_bytes(key, value).unwrap()
1521 }
1522
1523 pub fn try_insert_bytes<'m, 'd>(
1536 &mut self,
1537 key: &str,
1538 value: impl Into<Variant<'m, 'd>>,
1539 ) -> Result<(), ArrowError> {
1540 let (state, _) = self.parent_state(key)?;
1541 ValueBuilder::append_variant_bytes(state, value.into());
1542 Ok(())
1543 }
1544
1545 pub fn with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, key: &str, value: T) -> Self {
1549 self.insert(key, value);
1550 self
1551 }
1552
1553 pub fn try_with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(
1557 mut self,
1558 key: &str,
1559 value: T,
1560 ) -> Result<Self, ArrowError> {
1561 self.try_insert(key, value)?;
1562 Ok(self)
1563 }
1564
1565 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1570 self.validate_unique_fields = validate_unique_fields;
1571 self
1572 }
1573
1574 fn parent_state<'b>(
1576 &'b mut self,
1577 field_name: &str,
1578 ) -> Result<(ParentState<'b, ObjectState<'b>>, bool), ArrowError> {
1579 let validate_unique_fields = self.validate_unique_fields;
1580 let state = ParentState::try_object(
1581 self.parent_state.value_builder,
1582 self.parent_state.metadata_builder,
1583 &mut self.fields,
1584 self.parent_state.saved_value_builder_offset,
1585 field_name,
1586 validate_unique_fields,
1587 )?;
1588 Ok((state, validate_unique_fields))
1589 }
1590
1591 pub fn new_object<'b>(&'b mut self, key: &'b str) -> ObjectBuilder<'b, ObjectState<'b>> {
1597 self.try_new_object(key).unwrap()
1598 }
1599
1600 pub fn try_new_object<'b>(
1606 &'b mut self,
1607 key: &str,
1608 ) -> Result<ObjectBuilder<'b, ObjectState<'b>>, ArrowError> {
1609 let (parent_state, validate_unique_fields) = self.parent_state(key)?;
1610 Ok(ObjectBuilder::new(parent_state, validate_unique_fields))
1611 }
1612
1613 pub fn new_list<'b>(&'b mut self, key: &str) -> ListBuilder<'b, ObjectState<'b>> {
1619 self.try_new_list(key).unwrap()
1620 }
1621
1622 pub fn try_new_list<'b>(
1628 &'b mut self,
1629 key: &str,
1630 ) -> Result<ListBuilder<'b, ObjectState<'b>>, ArrowError> {
1631 let (parent_state, validate_unique_fields) = self.parent_state(key)?;
1632 Ok(ListBuilder::new(parent_state, validate_unique_fields))
1633 }
1634
1635 pub fn finish(mut self) {
1637 let metadata_builder = self.parent_state.metadata_builder();
1638
1639 self.fields.sort_by(|&field_a_id, _, &field_b_id, _| {
1640 let field_a_name = metadata_builder.field_name(field_a_id as usize);
1641 let field_b_name = metadata_builder.field_name(field_b_id as usize);
1642 field_a_name.cmp(field_b_name)
1643 });
1644
1645 let max_id = self.fields.iter().map(|(i, _)| *i).max().unwrap_or(0);
1646 let id_size = int_size(max_id as usize);
1647
1648 let starting_offset = self.parent_state.saved_value_builder_offset;
1649 let value_builder = self.parent_state.value_builder();
1650 let current_offset = value_builder.offset();
1651 let data_size = current_offset - starting_offset;
1653 let offset_size = int_size(data_size);
1654
1655 let num_fields = self.fields.len();
1656 let is_large = num_fields > u8::MAX as usize;
1657
1658 let header_size = 1 + (if is_large { 4 } else { 1 }) + (num_fields * id_size as usize) + ((num_fields + 1) * offset_size as usize); value_builder.inner_mut().splice(
1665 starting_offset..starting_offset,
1666 std::iter::repeat_n(0u8, header_size),
1667 );
1668
1669 let mut header_pos = starting_offset;
1671
1672 let header = object_header(is_large, id_size, offset_size);
1674
1675 header_pos = self
1676 .parent_state
1677 .value_builder()
1678 .append_header_start_from_buf_pos(header_pos, header, is_large, num_fields);
1679
1680 header_pos = self
1681 .parent_state
1682 .value_builder()
1683 .append_offset_array_start_from_buf_pos(
1684 header_pos,
1685 self.fields.keys().copied().map(|id| id as usize),
1686 None,
1687 id_size,
1688 );
1689
1690 self.parent_state
1691 .value_builder()
1692 .append_offset_array_start_from_buf_pos(
1693 header_pos,
1694 self.fields.values().copied(),
1695 Some(data_size),
1696 offset_size,
1697 );
1698 self.parent_state.finish();
1699 }
1700}
1701
1702impl<'a, 'm, 'v, S, K, V> Extend<(K, V)> for ObjectBuilder<'a, S>
1703where
1704 S: BuilderSpecificState,
1705 K: AsRef<str>,
1706 V: Into<Variant<'m, 'v>>,
1707{
1708 fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
1709 for (key, value) in iter.into_iter() {
1710 self.insert(key.as_ref(), value);
1711 }
1712 }
1713}
1714
1715pub trait VariantBuilderExt {
1720 type State<'a>: BuilderSpecificState + 'a
1722 where
1723 Self: 'a;
1724
1725 fn append_null(&mut self);
1728
1729 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>);
1731
1732 fn new_list(&mut self) -> ListBuilder<'_, Self::State<'_>> {
1735 self.try_new_list().unwrap()
1736 }
1737
1738 fn new_object(&mut self) -> ObjectBuilder<'_, Self::State<'_>> {
1741 self.try_new_object().unwrap()
1742 }
1743
1744 fn try_new_list(&mut self) -> Result<ListBuilder<'_, Self::State<'_>>, ArrowError>;
1747
1748 fn try_new_object(&mut self) -> Result<ObjectBuilder<'_, Self::State<'_>>, ArrowError>;
1751}
1752
1753impl<'a, S: BuilderSpecificState> VariantBuilderExt for ListBuilder<'a, S> {
1754 type State<'s>
1755 = ListState<'s>
1756 where
1757 Self: 's;
1758
1759 fn append_null(&mut self) {
1761 self.append_value(Variant::Null);
1762 }
1763 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1764 self.append_value(value);
1765 }
1766
1767 fn try_new_list(&mut self) -> Result<ListBuilder<'_, Self::State<'_>>, ArrowError> {
1768 Ok(self.new_list())
1769 }
1770
1771 fn try_new_object(&mut self) -> Result<ObjectBuilder<'_, Self::State<'_>>, ArrowError> {
1772 Ok(self.new_object())
1773 }
1774}
1775
1776impl VariantBuilderExt for VariantBuilder {
1777 type State<'a>
1778 = ()
1779 where
1780 Self: 'a;
1781
1782 fn append_null(&mut self) {
1785 self.append_value(Variant::Null);
1786 }
1787 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1788 self.append_value(value);
1789 }
1790
1791 fn try_new_list(&mut self) -> Result<ListBuilder<'_, Self::State<'_>>, ArrowError> {
1792 Ok(self.new_list())
1793 }
1794
1795 fn try_new_object(&mut self) -> Result<ObjectBuilder<'_, Self::State<'_>>, ArrowError> {
1796 Ok(self.new_object())
1797 }
1798}
1799
1800pub struct ObjectFieldBuilder<'o, 'v, 's, S: BuilderSpecificState> {
1802 key: &'s str,
1803 builder: &'o mut ObjectBuilder<'v, S>,
1804}
1805
1806impl<'o, 'v, 's, S: BuilderSpecificState> ObjectFieldBuilder<'o, 'v, 's, S> {
1807 pub fn new(key: &'s str, builder: &'o mut ObjectBuilder<'v, S>) -> Self {
1808 Self { key, builder }
1809 }
1810}
1811
1812impl<S: BuilderSpecificState> VariantBuilderExt for ObjectFieldBuilder<'_, '_, '_, S> {
1813 type State<'a>
1814 = ObjectState<'a>
1815 where
1816 Self: 'a;
1817
1818 fn append_null(&mut self) {}
1820 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1821 self.builder.insert(self.key, value);
1822 }
1823
1824 fn try_new_list(&mut self) -> Result<ListBuilder<'_, Self::State<'_>>, ArrowError> {
1825 self.builder.try_new_list(self.key)
1826 }
1827
1828 fn try_new_object(&mut self) -> Result<ObjectBuilder<'_, Self::State<'_>>, ArrowError> {
1829 self.builder.try_new_object(self.key)
1830 }
1831}
1832
1833#[cfg(test)]
1834mod tests {
1835 use crate::VariantMetadata;
1836
1837 use super::*;
1838
1839 #[test]
1840 fn test_simple_usage() {
1841 {
1842 let mut builder = VariantBuilder::new();
1843 builder.append_value(());
1844 let (metadata, value) = builder.finish();
1845 let variant = Variant::try_new(&metadata, &value).unwrap();
1846 assert_eq!(variant, Variant::Null);
1847 }
1848
1849 {
1850 let mut builder = VariantBuilder::new();
1851 builder.append_value(true);
1852 let (metadata, value) = builder.finish();
1853 let variant = Variant::try_new(&metadata, &value).unwrap();
1854 assert_eq!(variant, Variant::BooleanTrue);
1855 }
1856
1857 {
1858 let mut builder = VariantBuilder::new();
1859 builder.append_value(false);
1860 let (metadata, value) = builder.finish();
1861 let variant = Variant::try_new(&metadata, &value).unwrap();
1862 assert_eq!(variant, Variant::BooleanFalse);
1863 }
1864
1865 {
1866 let mut builder = VariantBuilder::new();
1867 builder.append_value(42i8);
1868 let (metadata, value) = builder.finish();
1869 let variant = Variant::try_new(&metadata, &value).unwrap();
1870 assert_eq!(variant, Variant::Int8(42));
1871 }
1872
1873 {
1874 let mut builder = VariantBuilder::new();
1875 builder.append_value(1234i16);
1876 let (metadata, value) = builder.finish();
1877 let variant = Variant::try_new(&metadata, &value).unwrap();
1878 assert_eq!(variant, Variant::Int16(1234));
1879 }
1880
1881 {
1882 let mut builder = VariantBuilder::new();
1883 builder.append_value(123456i32);
1884 let (metadata, value) = builder.finish();
1885 let variant = Variant::try_new(&metadata, &value).unwrap();
1886 assert_eq!(variant, Variant::Int32(123456));
1887 }
1888
1889 {
1890 let mut builder = VariantBuilder::new();
1891 builder.append_value(123456789i64);
1892 let (metadata, value) = builder.finish();
1893 let variant = Variant::try_new(&metadata, &value).unwrap();
1894 assert_eq!(variant, Variant::Int64(123456789));
1895 }
1896
1897 {
1898 let mut builder = VariantBuilder::new();
1899 builder.append_value(1.5f32);
1900 let (metadata, value) = builder.finish();
1901 let variant = Variant::try_new(&metadata, &value).unwrap();
1902 assert_eq!(variant, Variant::Float(1.5));
1903 }
1904
1905 {
1906 let mut builder = VariantBuilder::new();
1907 builder.append_value(2.5f64);
1908 let (metadata, value) = builder.finish();
1909 let variant = Variant::try_new(&metadata, &value).unwrap();
1910 assert_eq!(variant, Variant::Double(2.5));
1911 }
1912
1913 {
1914 let mut builder = VariantBuilder::new();
1915 builder.append_value("hello");
1916 let (metadata, value) = builder.finish();
1917 let variant = Variant::try_new(&metadata, &value).unwrap();
1918 assert_eq!(variant, Variant::ShortString(ShortString("hello")));
1919 }
1920
1921 {
1922 let mut builder = VariantBuilder::new();
1923 let long_string = "This is a very long string that exceeds the short string limit of 63 bytes and should be encoded as a regular string type instead of a short string";
1924 builder.append_value(long_string);
1925 let (metadata, value) = builder.finish();
1926 let variant = Variant::try_new(&metadata, &value).unwrap();
1927 assert_eq!(variant, Variant::String(long_string));
1928 }
1929
1930 {
1931 let mut builder = VariantBuilder::new();
1932 let binary_data = b"binary data";
1933 builder.append_value(binary_data.as_slice());
1934 let (metadata, value) = builder.finish();
1935 let variant = Variant::try_new(&metadata, &value).unwrap();
1936 assert_eq!(variant, Variant::Binary(binary_data.as_slice()));
1937 }
1938 }
1939
1940 #[test]
1941 fn test_list() {
1942 let mut builder = VariantBuilder::new();
1943
1944 builder
1945 .new_list()
1946 .with_value(1i8)
1947 .with_value(2i8)
1948 .with_value("test")
1949 .finish();
1950
1951 let (metadata, value) = builder.finish();
1952 assert!(!metadata.is_empty());
1953 assert!(!value.is_empty());
1954
1955 let variant = Variant::try_new(&metadata, &value).unwrap();
1956
1957 match variant {
1958 Variant::List(list) => {
1959 let val0 = list.get(0).unwrap();
1960 assert_eq!(val0, Variant::Int8(1));
1961
1962 let val1 = list.get(1).unwrap();
1963 assert_eq!(val1, Variant::Int8(2));
1964
1965 let val2 = list.get(2).unwrap();
1966 assert_eq!(val2, Variant::ShortString(ShortString("test")));
1967 }
1968 _ => panic!("Expected an array variant, got: {variant:?}"),
1969 }
1970 }
1971
1972 #[test]
1973 fn test_object() {
1974 let mut builder = VariantBuilder::new();
1975
1976 builder
1977 .new_object()
1978 .with_field("name", "John")
1979 .with_field("age", 42i8)
1980 .finish();
1981
1982 let (metadata, value) = builder.finish();
1983 assert!(!metadata.is_empty());
1984 assert!(!value.is_empty());
1985 }
1986
1987 #[test]
1988 fn test_object_field_ordering() {
1989 let mut builder = VariantBuilder::new();
1990
1991 builder
1992 .new_object()
1993 .with_field("zebra", "stripes")
1994 .with_field("apple", "red")
1995 .with_field("banana", "yellow")
1996 .finish();
1997
1998 let (_, value) = builder.finish();
1999
2000 let header = value[0];
2001 assert_eq!(header & 0x03, VariantBasicType::Object as u8);
2002
2003 let field_count = value[1] as usize;
2004 assert_eq!(field_count, 3);
2005
2006 let field_ids: Vec<u8> = value[2..5].to_vec();
2008
2009 assert_eq!(field_ids, vec![1, 2, 0]);
2011 }
2012
2013 #[test]
2014 fn test_duplicate_fields_in_object() {
2015 let mut builder = VariantBuilder::new();
2016 builder
2017 .new_object()
2018 .with_field("name", "Ron Artest")
2019 .with_field("name", "Metta World Peace") .finish();
2021
2022 let (metadata, value) = builder.finish();
2023 let variant = Variant::try_new(&metadata, &value).unwrap();
2024
2025 let obj = variant.as_object().unwrap();
2026 assert_eq!(obj.len(), 1);
2027 assert_eq!(obj.field(0).unwrap(), Variant::from("Metta World Peace"));
2028
2029 assert_eq!(
2030 vec![("name", Variant::from("Metta World Peace"))],
2031 obj.iter().collect::<Vec<_>>()
2032 );
2033 }
2034
2035 #[test]
2036 fn test_nested_list() {
2037 let mut builder = VariantBuilder::new();
2038
2039 let mut outer_list_builder = builder.new_list();
2040
2041 outer_list_builder
2043 .new_list()
2044 .with_value("a")
2045 .with_value("b")
2046 .with_value("c")
2047 .with_value("d")
2048 .finish();
2049
2050 outer_list_builder.finish();
2051
2052 let (metadata, value) = builder.finish();
2053
2054 let variant = Variant::try_new(&metadata, &value).unwrap();
2055 let outer_list = variant.as_list().unwrap();
2056
2057 assert_eq!(outer_list.len(), 1);
2058
2059 let inner_variant = outer_list.get(0).unwrap();
2060 let inner_list = inner_variant.as_list().unwrap();
2061
2062 assert_eq!(
2063 vec![
2064 Variant::from("a"),
2065 Variant::from("b"),
2066 Variant::from("c"),
2067 Variant::from("d"),
2068 ],
2069 inner_list.iter().collect::<Vec<_>>()
2070 );
2071 }
2072
2073 #[test]
2074 fn test_super_nested_list() {
2075 let mut builder = VariantBuilder::new();
2080 {
2081 let mut list_builder1 = builder.new_list();
2082 {
2083 let mut list_builder2 = list_builder1.new_list();
2084 {
2085 let mut list_builder3 = list_builder2.new_list();
2086 {
2087 let mut list_builder4 = list_builder3.new_list();
2088 {
2089 let mut list_builder5 = list_builder4.new_list();
2090 list_builder5.append_value(1);
2091 list_builder5.finish();
2092 }
2093 list_builder4.finish();
2094 }
2095 list_builder3.finish();
2096 }
2097 list_builder2.finish();
2098 }
2099 list_builder1.finish();
2100 }
2101
2102 let (metadata, value) = builder.finish();
2103
2104 let variant = Variant::try_new(&metadata, &value).unwrap();
2105 let list1 = variant.as_list().unwrap();
2106 assert_eq!(list1.len(), 1);
2107
2108 let list2_variant = list1.get(0).unwrap();
2109 let list2 = list2_variant.as_list().unwrap();
2110 assert_eq!(list2.len(), 1);
2111
2112 let list3_variant = list2.get(0).unwrap();
2113 let list3 = list3_variant.as_list().unwrap();
2114 assert_eq!(list3.len(), 1);
2115
2116 let list4_variant = list3.get(0).unwrap();
2117 let list4 = list4_variant.as_list().unwrap();
2118 assert_eq!(list4.len(), 1);
2119
2120 let list5_variant = list4.get(0).unwrap();
2121 let list5 = list5_variant.as_list().unwrap();
2122 assert_eq!(list5.len(), 1);
2123
2124 assert_eq!(list5.len(), 1);
2125
2126 assert_eq!(list5.get(0).unwrap(), Variant::from(1));
2127 }
2128
2129 #[test]
2130 fn test_object_list() {
2131 let mut builder = VariantBuilder::new();
2132
2133 let mut list_builder = builder.new_list();
2134
2135 list_builder
2136 .new_object()
2137 .with_field("id", 1)
2138 .with_field("type", "Cauliflower")
2139 .finish();
2140
2141 list_builder
2142 .new_object()
2143 .with_field("id", 2)
2144 .with_field("type", "Beets")
2145 .finish();
2146
2147 list_builder.finish();
2148
2149 let (metadata, value) = builder.finish();
2150
2151 let variant = Variant::try_new(&metadata, &value).unwrap();
2152 let list = variant.as_list().unwrap();
2153
2154 assert_eq!(list.len(), 2);
2155
2156 let obj1_variant = list.get(0).unwrap();
2157 let obj1 = obj1_variant.as_object().unwrap();
2158
2159 assert_eq!(
2160 vec![
2161 ("id", Variant::from(1)),
2162 ("type", Variant::from("Cauliflower")),
2163 ],
2164 obj1.iter().collect::<Vec<_>>()
2165 );
2166
2167 let obj2_variant = list.get(1).unwrap();
2168 let obj2 = obj2_variant.as_object().unwrap();
2169
2170 assert_eq!(
2171 vec![("id", Variant::from(2)), ("type", Variant::from("Beets")),],
2172 obj2.iter().collect::<Vec<_>>()
2173 );
2174 }
2175
2176 #[test]
2177 fn test_object_list2() {
2178 let mut builder = VariantBuilder::new();
2179
2180 let mut list_builder = builder.new_list();
2181
2182 list_builder.new_object().with_field("a", 1).finish();
2183
2184 list_builder.new_object().with_field("b", 2).finish();
2185
2186 list_builder.finish();
2187
2188 let (metadata, value) = builder.finish();
2189
2190 let variant = Variant::try_new(&metadata, &value).unwrap();
2191 let list = variant.as_list().unwrap();
2192 assert_eq!(list.len(), 2);
2193
2194 let obj1_variant = list.get(0).unwrap();
2195 let obj1 = obj1_variant.as_object().unwrap();
2196 assert_eq!(
2197 vec![("a", Variant::from(1)),],
2198 obj1.iter().collect::<Vec<_>>()
2199 );
2200
2201 let obj2_variant = list.get(1).unwrap();
2202 let obj2 = obj2_variant.as_object().unwrap();
2203 assert_eq!(
2204 vec![("b", Variant::from(2)),],
2205 obj2.iter().collect::<Vec<_>>()
2206 );
2207 }
2208
2209 #[test]
2210 fn test_hetergenous_list() {
2211 let mut builder = VariantBuilder::new();
2222
2223 let mut list_builder = builder.new_list();
2224
2225 list_builder.append_value(1);
2226
2227 {
2228 let mut object_builder = list_builder.new_object();
2229 object_builder.insert("a", 1);
2230 object_builder.finish();
2231 }
2232
2233 list_builder.append_value(2);
2234
2235 {
2236 let mut object_builder = list_builder.new_object();
2237 object_builder.insert("b", 2);
2238 object_builder.finish();
2239 }
2240
2241 list_builder.append_value(3);
2242
2243 list_builder.finish();
2244
2245 let (metadata, value) = builder.finish();
2246
2247 let variant = Variant::try_new(&metadata, &value).unwrap();
2248 let list = variant.as_list().unwrap();
2249 assert_eq!(list.len(), 5);
2250 assert_eq!(list.get(0).unwrap(), Variant::from(1));
2251
2252 let obj1_variant = list.get(1).unwrap();
2253 let obj1 = obj1_variant.as_object().unwrap();
2254 assert_eq!(
2255 vec![("a", Variant::from(1)),],
2256 obj1.iter().collect::<Vec<_>>()
2257 );
2258
2259 assert_eq!(list.get(2).unwrap(), Variant::from(2));
2260
2261 let obj2_variant = list.get(3).unwrap();
2262 let obj2 = obj2_variant.as_object().unwrap();
2263 assert_eq!(
2264 vec![("b", Variant::from(2)),],
2265 obj2.iter().collect::<Vec<_>>()
2266 );
2267
2268 assert_eq!(list.get(4).unwrap(), Variant::from(3));
2269 }
2270
2271 #[test]
2272 fn test_nested_object() {
2273 let mut builder = VariantBuilder::new();
2283 {
2284 let mut outer_object_builder = builder.new_object();
2285 {
2286 let mut inner_object_builder = outer_object_builder.new_object("c");
2287 inner_object_builder.insert("b", "a");
2288 inner_object_builder.finish();
2289 }
2290
2291 outer_object_builder.finish();
2292 }
2293
2294 let (metadata, value) = builder.finish();
2295 let variant = Variant::try_new(&metadata, &value).unwrap();
2296 let outer_object = variant.as_object().unwrap();
2297
2298 assert_eq!(outer_object.len(), 1);
2299 assert_eq!(outer_object.field_name(0).unwrap(), "c");
2300
2301 let inner_object_variant = outer_object.field(0).unwrap();
2302 let inner_object = inner_object_variant.as_object().unwrap();
2303
2304 assert_eq!(inner_object.len(), 1);
2305 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2306 assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2307 }
2308
2309 #[test]
2310 fn test_nested_object_with_duplicate_field_names_per_object() {
2311 let mut builder = VariantBuilder::new();
2323 {
2324 let mut outer_object_builder = builder.new_object();
2325 {
2326 let mut inner_object_builder = outer_object_builder.new_object("c");
2327 inner_object_builder.insert("b", false);
2328 inner_object_builder.insert("c", "a");
2329
2330 inner_object_builder.finish();
2331 }
2332
2333 outer_object_builder.insert("b", false);
2334 outer_object_builder.finish();
2335 }
2336
2337 let (metadata, value) = builder.finish();
2338 let variant = Variant::try_new(&metadata, &value).unwrap();
2339 let outer_object = variant.as_object().unwrap();
2340
2341 assert_eq!(outer_object.len(), 2);
2342 assert_eq!(outer_object.field_name(0).unwrap(), "b");
2343
2344 let inner_object_variant = outer_object.field(1).unwrap();
2345 let inner_object = inner_object_variant.as_object().unwrap();
2346
2347 assert_eq!(inner_object.len(), 2);
2348 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2349 assert_eq!(inner_object.field(0).unwrap(), Variant::from(false));
2350 assert_eq!(inner_object.field_name(1).unwrap(), "c");
2351 assert_eq!(inner_object.field(1).unwrap(), Variant::from("a"));
2352 }
2353
2354 #[test]
2355 fn test_nested_object_with_lists() {
2356 let mut builder = VariantBuilder::new();
2366 {
2367 let mut outer_object_builder = builder.new_object();
2368 {
2369 let mut inner_object_builder = outer_object_builder.new_object("door 1");
2370
2371 inner_object_builder
2373 .new_list("items")
2374 .with_value("apple")
2375 .with_value(false)
2376 .finish();
2377
2378 inner_object_builder.finish();
2379 }
2380
2381 outer_object_builder.finish();
2382 }
2383
2384 let (metadata, value) = builder.finish();
2385 let variant = Variant::try_new(&metadata, &value).unwrap();
2386 let outer_object = variant.as_object().unwrap();
2387
2388 assert_eq!(outer_object.len(), 1);
2389 assert_eq!(outer_object.field_name(0).unwrap(), "door 1");
2390
2391 let inner_object_variant = outer_object.field(0).unwrap();
2392 let inner_object = inner_object_variant.as_object().unwrap();
2393
2394 assert_eq!(inner_object.len(), 1);
2395 assert_eq!(inner_object.field_name(0).unwrap(), "items");
2396
2397 let items_variant = inner_object.field(0).unwrap();
2398 let items_list = items_variant.as_list().unwrap();
2399
2400 assert_eq!(items_list.len(), 2);
2401 assert_eq!(items_list.get(0).unwrap(), Variant::from("apple"));
2402 assert_eq!(items_list.get(1).unwrap(), Variant::from(false));
2403 }
2404
2405 #[test]
2406 fn test_nested_object_with_heterogeneous_fields() {
2407 let mut builder = VariantBuilder::new();
2429 {
2430 let mut outer_object_builder = builder.new_object();
2431
2432 outer_object_builder.insert("a", false);
2433
2434 {
2435 let mut inner_object_builder = outer_object_builder.new_object("c");
2436 inner_object_builder.insert("b", "a");
2437
2438 {
2439 let mut inner_inner_object_builder = inner_object_builder.new_object("c");
2440 inner_inner_object_builder.insert("aa", "bb");
2441 inner_inner_object_builder.finish();
2442 }
2443
2444 {
2445 let mut inner_inner_object_builder = inner_object_builder.new_object("d");
2446 inner_inner_object_builder.insert("cc", "dd");
2447 inner_inner_object_builder.finish();
2448 }
2449 inner_object_builder.finish();
2450 }
2451
2452 outer_object_builder.insert("b", true);
2453
2454 {
2455 let mut inner_object_builder = outer_object_builder.new_object("d");
2456 inner_object_builder.insert("e", 1);
2457 {
2458 let mut inner_list_builder = inner_object_builder.new_list("f");
2459 inner_list_builder.append_value(1);
2460 inner_list_builder.append_value(true);
2461
2462 inner_list_builder.finish();
2463 }
2464
2465 {
2466 let mut inner_list_builder = inner_object_builder.new_list("g");
2467 inner_list_builder.append_value("tree");
2468 inner_list_builder.append_value(false);
2469
2470 inner_list_builder.finish();
2471 }
2472
2473 inner_object_builder.finish();
2474 }
2475
2476 outer_object_builder.finish();
2477 }
2478
2479 let (metadata, value) = builder.finish();
2480
2481 let variant = Variant::try_new(&metadata, &value).unwrap();
2504 let outer_object = variant.as_object().unwrap();
2505
2506 assert_eq!(outer_object.len(), 4);
2507
2508 assert_eq!(outer_object.field_name(0).unwrap(), "a");
2509 assert_eq!(outer_object.field(0).unwrap(), Variant::from(false));
2510
2511 assert_eq!(outer_object.field_name(2).unwrap(), "c");
2512
2513 let inner_object_variant = outer_object.field(2).unwrap();
2514 let inner_object = inner_object_variant.as_object().unwrap();
2515
2516 assert_eq!(inner_object.len(), 3);
2517 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2518 assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2519
2520 let inner_iner_object_variant_c = inner_object.field(1).unwrap();
2521 let inner_inner_object_c = inner_iner_object_variant_c.as_object().unwrap();
2522 assert_eq!(inner_inner_object_c.len(), 1);
2523 assert_eq!(inner_inner_object_c.field_name(0).unwrap(), "aa");
2524 assert_eq!(inner_inner_object_c.field(0).unwrap(), Variant::from("bb"));
2525
2526 let inner_iner_object_variant_d = inner_object.field(2).unwrap();
2527 let inner_inner_object_d = inner_iner_object_variant_d.as_object().unwrap();
2528 assert_eq!(inner_inner_object_d.len(), 1);
2529 assert_eq!(inner_inner_object_d.field_name(0).unwrap(), "cc");
2530 assert_eq!(inner_inner_object_d.field(0).unwrap(), Variant::from("dd"));
2531
2532 assert_eq!(outer_object.field_name(1).unwrap(), "b");
2533 assert_eq!(outer_object.field(1).unwrap(), Variant::from(true));
2534
2535 let out_object_variant_d = outer_object.field(3).unwrap();
2536 let out_object_d = out_object_variant_d.as_object().unwrap();
2537 assert_eq!(out_object_d.len(), 3);
2538 assert_eq!("e", out_object_d.field_name(0).unwrap());
2539 assert_eq!(Variant::from(1), out_object_d.field(0).unwrap());
2540 assert_eq!("f", out_object_d.field_name(1).unwrap());
2541
2542 let first_inner_list_variant_f = out_object_d.field(1).unwrap();
2543 let first_inner_list_f = first_inner_list_variant_f.as_list().unwrap();
2544 assert_eq!(2, first_inner_list_f.len());
2545 assert_eq!(Variant::from(1), first_inner_list_f.get(0).unwrap());
2546 assert_eq!(Variant::from(true), first_inner_list_f.get(1).unwrap());
2547
2548 let second_inner_list_variant_g = out_object_d.field(2).unwrap();
2549 let second_inner_list_g = second_inner_list_variant_g.as_list().unwrap();
2550 assert_eq!(2, second_inner_list_g.len());
2551 assert_eq!(Variant::from("tree"), second_inner_list_g.get(0).unwrap());
2552 assert_eq!(Variant::from(false), second_inner_list_g.get(1).unwrap());
2553 }
2554
2555 #[test]
2559 fn test_nested_list_with_heterogeneous_fields_for_buffer_reuse() {
2560 let mut builder = VariantBuilder::new();
2561
2562 {
2563 let mut outer_list_builder = builder.new_list();
2564
2565 outer_list_builder.append_value("apple");
2566 outer_list_builder.append_value(false);
2567
2568 {
2569 let mut inner_list_builder = outer_list_builder.new_list();
2571
2572 {
2573 let mut inner_object_builder = inner_list_builder.new_object();
2574 inner_object_builder.insert("a", "b");
2575 inner_object_builder.insert("b", "c");
2576 inner_object_builder.finish();
2577 }
2578
2579 {
2580 let mut inner_object_builder = inner_list_builder.new_object();
2583 inner_object_builder.insert("c", "d");
2584 inner_object_builder.insert("d", "e");
2585 inner_object_builder.finish();
2586 }
2587
2588 inner_list_builder.finish();
2589 }
2590
2591 {
2592 let mut inner_list_builder = outer_list_builder.new_list();
2594
2595 {
2596 let mut double_inner_list_builder = inner_list_builder.new_list();
2597 double_inner_list_builder.append_value(1);
2598 double_inner_list_builder.append_value(true);
2599
2600 double_inner_list_builder.finish();
2601 }
2602
2603 {
2604 let mut double_inner_list_builder = inner_list_builder.new_list();
2605 double_inner_list_builder.append_value("tree");
2606 double_inner_list_builder.append_value(false);
2607
2608 double_inner_list_builder.finish();
2609 }
2610 inner_list_builder.finish();
2611 }
2612
2613 outer_list_builder.append_value(1);
2614
2615 outer_list_builder.finish();
2616 }
2617
2618 let (metadata, value) = builder.finish();
2619
2620 let variant = Variant::try_new(&metadata, &value).unwrap();
2621 let outer_list = variant.as_list().unwrap();
2622
2623 assert_eq!(5, outer_list.len());
2624
2625 assert_eq!(Variant::from("apple"), outer_list.get(0).unwrap());
2627 assert_eq!(Variant::from(false), outer_list.get(1).unwrap());
2628 assert_eq!(Variant::from(1), outer_list.get(4).unwrap());
2629
2630 let list1_variant = outer_list.get(2).unwrap();
2632 let list1 = list1_variant.as_list().unwrap();
2633 assert_eq!(2, list1.len());
2634
2635 let list1_obj1_variant = list1.get(0).unwrap();
2636 let list1_obj1 = list1_obj1_variant.as_object().unwrap();
2637 assert_eq!("a", list1_obj1.field_name(0).unwrap());
2638 assert_eq!(Variant::from("b"), list1_obj1.field(0).unwrap());
2639
2640 assert_eq!("b", list1_obj1.field_name(1).unwrap());
2641 assert_eq!(Variant::from("c"), list1_obj1.field(1).unwrap());
2642
2643 let list2_variant = outer_list.get(3).unwrap();
2645 let list2 = list2_variant.as_list().unwrap();
2646 assert_eq!(2, list2.len());
2647
2648 let list2_list1_variant = list2.get(0).unwrap();
2650 let list2_list1 = list2_list1_variant.as_list().unwrap();
2651 assert_eq!(2, list2_list1.len());
2652 assert_eq!(Variant::from(1), list2_list1.get(0).unwrap());
2653 assert_eq!(Variant::from(true), list2_list1.get(1).unwrap());
2654
2655 let list2_list2_variant = list2.get(1).unwrap();
2657 let list2_list2 = list2_list2_variant.as_list().unwrap();
2658 assert_eq!(2, list2_list2.len());
2659 assert_eq!(Variant::from("tree"), list2_list2.get(0).unwrap());
2660 assert_eq!(Variant::from(false), list2_list2.get(1).unwrap());
2661 }
2662
2663 #[test]
2664 fn test_object_without_unique_field_validation() {
2665 let mut builder = VariantBuilder::new();
2666
2667 let mut obj = builder.new_object();
2669 obj.insert("a", 1);
2670 obj.insert("a", 2);
2671 obj.finish();
2672
2673 let mut builder = VariantBuilder::new();
2675 let mut outer_list = builder.new_list();
2676 let mut inner_list = outer_list.new_list();
2677 let mut nested_obj = inner_list.new_object();
2678 nested_obj.insert("x", 1);
2679 nested_obj.insert("x", 2);
2680 nested_obj.new_list("x").with_value(3).finish();
2681 nested_obj.new_object("x").with_field("y", 4).finish();
2682 nested_obj.finish();
2683 inner_list.finish();
2684 outer_list.finish();
2685
2686 let (metadata, value) = builder.finish();
2688 let variant = Variant::try_new(&metadata, &value).unwrap();
2689 let outer_element = variant.get_list_element(0).unwrap();
2690 let inner_element = outer_element.get_list_element(0).unwrap();
2691 let outer_field = inner_element.get_object_field("x").unwrap();
2692 let inner_field = outer_field.get_object_field("y").unwrap();
2693 assert_eq!(inner_field, Variant::from(4));
2694 }
2695
2696 #[test]
2697 fn test_object_with_unique_field_validation() {
2698 let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
2699
2700 let result = builder
2702 .new_object()
2703 .with_field("a", 1)
2704 .with_field("b", 2)
2705 .try_with_field("a", 3);
2706 assert_eq!(
2707 result.unwrap_err().to_string(),
2708 "Invalid argument error: Duplicate field name: a"
2709 );
2710
2711 let mut outer_list = builder.new_list();
2713 let mut inner_list = outer_list.new_list();
2714 let mut object = inner_list.new_object().with_field("x", 1);
2715 let nested_result = object.try_insert("x", 2);
2716 assert_eq!(
2717 nested_result.unwrap_err().to_string(),
2718 "Invalid argument error: Duplicate field name: x"
2719 );
2720 let nested_result = object.try_new_list("x");
2721 assert_eq!(
2722 nested_result.unwrap_err().to_string(),
2723 "Invalid argument error: Duplicate field name: x"
2724 );
2725
2726 let nested_result = object.try_new_object("x");
2727 assert_eq!(
2728 nested_result.unwrap_err().to_string(),
2729 "Invalid argument error: Duplicate field name: x"
2730 );
2731
2732 drop(object);
2733 inner_list.finish();
2734 outer_list.finish();
2735
2736 let mut list = builder.new_list();
2738 let mut valid_obj = list.new_object();
2739 valid_obj.insert("m", 1);
2740 valid_obj.insert("n", 2);
2741
2742 valid_obj.finish();
2743 list.finish();
2744 }
2745
2746 #[test]
2747 fn test_sorted_dictionary() {
2748 let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"]);
2750
2751 let mut variant2 = {
2752 let mut builder = VariantBuilder::new();
2753
2754 builder.add_field_name("b");
2755 builder.add_field_name("c");
2756 builder.add_field_name("d");
2757
2758 builder
2759 };
2760
2761 assert_eq!(
2762 variant1.metadata_builder.field_names,
2763 variant2.metadata_builder.field_names
2764 );
2765
2766 assert!(variant1.metadata_builder.is_sorted);
2768 assert!(variant2.metadata_builder.is_sorted);
2769
2770 {
2771 variant2.add_field_name("a");
2773 assert!(!variant2.metadata_builder.is_sorted);
2774
2775 let (m, v) = variant2.finish();
2777 let res = Variant::try_new(&m, &v);
2778 assert!(res.is_err());
2779
2780 let header = VariantMetadata::try_new(&m).unwrap();
2782 assert!(!header.is_sorted());
2783 }
2784
2785 variant1.append_value(false);
2787
2788 let (m, v) = variant1.finish();
2789 let res = Variant::try_new(&m, &v);
2790 assert!(res.is_ok());
2791
2792 let header = VariantMetadata::try_new(&m).unwrap();
2793 assert!(header.is_sorted());
2794 }
2795
2796 #[test]
2797 fn test_object_sorted_dictionary() {
2798 let mut variant1 = VariantBuilder::new().with_field_names(["a", "b", "c"]);
2800 let mut obj = variant1.new_object();
2801
2802 obj.insert("c", true);
2803 obj.insert("a", false);
2804 obj.insert("b", ());
2805
2806 let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2808 assert_eq!(field_ids_by_insert_order, vec![2, 0, 1]);
2809
2810 obj.insert("d", 2);
2812 obj.finish();
2813
2814 let (metadata, value) = variant1.finish();
2815 let variant = Variant::try_new(&metadata, &value).unwrap();
2816
2817 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2818 assert!(metadata.is_sorted());
2819
2820 let object = variant.as_object().unwrap();
2822 let field_names = object
2823 .iter()
2824 .map(|(field_name, _)| field_name)
2825 .collect::<Vec<_>>();
2826
2827 assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2828 }
2829
2830 #[test]
2831 fn test_object_not_sorted_dictionary() {
2832 let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"]);
2834 let mut obj = variant1.new_object();
2835
2836 obj.insert("c", true);
2837 obj.insert("d", false);
2838 obj.insert("b", ());
2839
2840 let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2842 assert_eq!(field_ids_by_insert_order, vec![1, 2, 0]);
2843
2844 obj.insert("a", 2);
2846 obj.finish();
2847
2848 let (metadata, value) = variant1.finish();
2849 let variant = Variant::try_new(&metadata, &value).unwrap();
2850
2851 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2852 assert!(!metadata.is_sorted());
2853
2854 let object = variant.as_object().unwrap();
2856 let field_names = object
2857 .iter()
2858 .map(|(field_name, _)| field_name)
2859 .collect::<Vec<_>>();
2860
2861 assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2862 }
2863
2864 #[test]
2865 fn test_building_sorted_dictionary() {
2866 let mut builder = VariantBuilder::new();
2867 assert!(!builder.metadata_builder.is_sorted);
2868 assert_eq!(builder.metadata_builder.num_field_names(), 0);
2869
2870 builder.add_field_name("a");
2871
2872 assert!(builder.metadata_builder.is_sorted);
2873 assert_eq!(builder.metadata_builder.num_field_names(), 1);
2874
2875 let builder = builder.with_field_names(["b", "c", "d"]);
2876
2877 assert!(builder.metadata_builder.is_sorted);
2878 assert_eq!(builder.metadata_builder.num_field_names(), 4);
2879
2880 let builder = builder.with_field_names(["z", "y"]);
2881 assert!(!builder.metadata_builder.is_sorted);
2882 assert_eq!(builder.metadata_builder.num_field_names(), 6);
2883 }
2884
2885 #[test]
2886 fn test_metadata_builder_from_iter() {
2887 let metadata = WritableMetadataBuilder::from_iter(vec!["apple", "banana", "cherry"]);
2888 assert_eq!(metadata.num_field_names(), 3);
2889 assert_eq!(metadata.field_name(0), "apple");
2890 assert_eq!(metadata.field_name(1), "banana");
2891 assert_eq!(metadata.field_name(2), "cherry");
2892 assert!(metadata.is_sorted);
2893
2894 let metadata = WritableMetadataBuilder::from_iter(["zebra", "apple", "banana"]);
2895 assert_eq!(metadata.num_field_names(), 3);
2896 assert_eq!(metadata.field_name(0), "zebra");
2897 assert_eq!(metadata.field_name(1), "apple");
2898 assert_eq!(metadata.field_name(2), "banana");
2899 assert!(!metadata.is_sorted);
2900
2901 let metadata = WritableMetadataBuilder::from_iter(Vec::<&str>::new());
2902 assert_eq!(metadata.num_field_names(), 0);
2903 assert!(!metadata.is_sorted);
2904 }
2905
2906 #[test]
2907 fn test_metadata_builder_extend() {
2908 let mut metadata = WritableMetadataBuilder::default();
2909 assert_eq!(metadata.num_field_names(), 0);
2910 assert!(!metadata.is_sorted);
2911
2912 metadata.extend(["apple", "cherry"]);
2913 assert_eq!(metadata.num_field_names(), 2);
2914 assert_eq!(metadata.field_name(0), "apple");
2915 assert_eq!(metadata.field_name(1), "cherry");
2916 assert!(metadata.is_sorted);
2917
2918 metadata.extend(vec!["dinosaur", "monkey"]);
2920 assert_eq!(metadata.num_field_names(), 4);
2921 assert_eq!(metadata.field_name(2), "dinosaur");
2922 assert_eq!(metadata.field_name(3), "monkey");
2923 assert!(metadata.is_sorted);
2924
2925 let initial_count = metadata.num_field_names();
2927 metadata.extend(["apple", "monkey"]);
2928 assert_eq!(metadata.num_field_names(), initial_count); }
2930
2931 #[test]
2932 fn test_metadata_builder_extend_sort_order() {
2933 let mut metadata = WritableMetadataBuilder::default();
2934
2935 metadata.extend(["middle"]);
2936 assert!(metadata.is_sorted);
2937
2938 metadata.extend(["zebra"]);
2939 assert!(metadata.is_sorted);
2940
2941 metadata.extend(["apple"]);
2943 assert!(!metadata.is_sorted);
2944 }
2945
2946 #[test]
2947 fn test_metadata_builder_from_iter_with_string_types() {
2948 let metadata = WritableMetadataBuilder::from_iter(["a", "b", "c"]);
2950 assert_eq!(metadata.num_field_names(), 3);
2951
2952 let metadata = WritableMetadataBuilder::from_iter(vec![
2954 "a".to_string(),
2955 "b".to_string(),
2956 "c".to_string(),
2957 ]);
2958 assert_eq!(metadata.num_field_names(), 3);
2959
2960 let field_names: Vec<Box<str>> = vec!["a".into(), "b".into(), "c".into()];
2962 let metadata = WritableMetadataBuilder::from_iter(field_names);
2963 assert_eq!(metadata.num_field_names(), 3);
2964 }
2965
2966 #[test]
2967 fn test_variant_builder_to_list_builder_no_finish() {
2968 let mut builder = VariantBuilder::new();
2970 let mut list_builder = builder.new_list();
2971 list_builder.append_value("hi");
2972 drop(list_builder);
2973
2974 builder.append_value(42i8);
2975
2976 let (metadata, value) = builder.finish();
2978 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2979 assert!(metadata.is_empty());
2980
2981 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2982 assert_eq!(variant, Variant::Int8(42));
2983 }
2984
2985 #[test]
2986 fn test_variant_builder_to_object_builder_no_finish() {
2987 let mut builder = VariantBuilder::new();
2989 let mut object_builder = builder.new_object();
2990 object_builder.insert("name", "unknown");
2991 drop(object_builder);
2992
2993 builder.append_value(42i8);
2994
2995 let (metadata, value) = builder.finish();
2997 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2998 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3001 assert_eq!(variant, Variant::Int8(42));
3002 }
3003
3004 #[test]
3005 fn test_list_builder_to_list_builder_inner_no_finish() {
3006 let mut builder = VariantBuilder::new();
3007 let mut list_builder = builder.new_list();
3008 list_builder.append_value(1i8);
3009
3010 let mut nested_list_builder = list_builder.new_list();
3012 nested_list_builder.append_value("hi");
3013 drop(nested_list_builder);
3014
3015 list_builder.append_value(2i8);
3016
3017 list_builder.finish();
3019 let (metadata, value) = builder.finish();
3020 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3021 assert!(metadata.is_empty());
3022
3023 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3024 let list = variant.as_list().unwrap();
3025 assert_eq!(list.len(), 2);
3026 assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
3027 assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
3028 }
3029
3030 #[test]
3031 fn test_list_builder_to_list_builder_outer_no_finish() {
3032 let mut builder = VariantBuilder::new();
3033 let mut list_builder = builder.new_list();
3034 list_builder.append_value(1i8);
3035
3036 let mut nested_list_builder = list_builder.new_list();
3038 nested_list_builder.append_value("hi");
3039 nested_list_builder.finish();
3040
3041 drop(list_builder);
3043
3044 builder.append_value(2i8);
3045
3046 let (metadata, value) = builder.finish();
3048 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3049 assert!(metadata.is_empty());
3050
3051 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3052 assert_eq!(variant, Variant::Int8(2));
3053 }
3054
3055 #[test]
3056 fn test_list_builder_to_object_builder_inner_no_finish() {
3057 let mut builder = VariantBuilder::new();
3058 let mut list_builder = builder.new_list();
3059 list_builder.append_value(1i8);
3060
3061 let mut nested_object_builder = list_builder.new_object();
3063 nested_object_builder.insert("name", "unknown");
3064 drop(nested_object_builder);
3065
3066 list_builder.append_value(2i8);
3067
3068 list_builder.finish();
3070 let (metadata, value) = builder.finish();
3071 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3072 assert!(metadata.is_empty());
3073
3074 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3075 let list = variant.as_list().unwrap();
3076 assert_eq!(list.len(), 2);
3077 assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
3078 assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
3079 }
3080
3081 #[test]
3082 fn test_list_builder_to_object_builder_outer_no_finish() {
3083 let mut builder = VariantBuilder::new();
3084 let mut list_builder = builder.new_list();
3085 list_builder.append_value(1i8);
3086
3087 let mut nested_object_builder = list_builder.new_object();
3089 nested_object_builder.insert("name", "unknown");
3090 nested_object_builder.finish();
3091
3092 drop(list_builder);
3094
3095 builder.append_value(2i8);
3096
3097 let (metadata, value) = builder.finish();
3099 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3100 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3103 assert_eq!(variant, Variant::Int8(2));
3104 }
3105
3106 #[test]
3107 fn test_object_builder_to_list_builder_inner_no_finish() {
3108 let mut builder = VariantBuilder::new();
3109 let mut object_builder = builder.new_object();
3110 object_builder.insert("first", 1i8);
3111
3112 let mut nested_list_builder = object_builder.new_list("nested");
3114 nested_list_builder.append_value("hi");
3115 drop(nested_list_builder);
3116
3117 object_builder.insert("second", 2i8);
3118
3119 object_builder.finish();
3121 let (metadata, value) = builder.finish();
3122
3123 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3124 assert_eq!(metadata.len(), 2);
3125 assert_eq!(&metadata[0], "first");
3126 assert_eq!(&metadata[1], "second");
3127
3128 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3129 let obj = variant.as_object().unwrap();
3130 assert_eq!(obj.len(), 2);
3131 assert_eq!(obj.get("first"), Some(Variant::Int8(1)));
3132 assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
3133 }
3134
3135 #[test]
3136 fn test_object_builder_to_list_builder_outer_no_finish() {
3137 let mut builder = VariantBuilder::new();
3138 let mut object_builder = builder.new_object();
3139 object_builder.insert("first", 1i8);
3140
3141 let mut nested_list_builder = object_builder.new_list("nested");
3143 nested_list_builder.append_value("hi");
3144 nested_list_builder.finish();
3145
3146 drop(object_builder);
3148
3149 builder.append_value(2i8);
3150
3151 let (metadata, value) = builder.finish();
3153 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3154 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3157 assert_eq!(variant, Variant::Int8(2));
3158 }
3159
3160 #[test]
3161 fn test_object_builder_to_object_builder_inner_no_finish() {
3162 let mut builder = VariantBuilder::new();
3163 let mut object_builder = builder.new_object();
3164 object_builder.insert("first", 1i8);
3165
3166 let mut nested_object_builder = object_builder.new_object("nested");
3168 nested_object_builder.insert("name", "unknown");
3169 drop(nested_object_builder);
3170
3171 object_builder.insert("second", 2i8);
3172
3173 object_builder.finish();
3175 let (metadata, value) = builder.finish();
3176
3177 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3178 assert_eq!(metadata.len(), 2); assert_eq!(&metadata[0], "first");
3180 assert_eq!(&metadata[1], "second");
3181
3182 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3183 let obj = variant.as_object().unwrap();
3184 assert_eq!(obj.len(), 2);
3185 assert_eq!(obj.get("first"), Some(Variant::Int8(1)));
3186 assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
3187 }
3188
3189 #[test]
3190 fn test_object_builder_to_object_builder_outer_no_finish() {
3191 let mut builder = VariantBuilder::new();
3192 let mut object_builder = builder.new_object();
3193 object_builder.insert("first", 1i8);
3194
3195 let mut nested_object_builder = object_builder.new_object("nested");
3197 nested_object_builder.insert("name", "unknown");
3198 nested_object_builder.finish();
3199
3200 drop(object_builder);
3202
3203 builder.append_value(2i8);
3204
3205 let (metadata, value) = builder.finish();
3207 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3208 assert_eq!(metadata.len(), 0); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3211 assert_eq!(variant, Variant::Int8(2));
3212 }
3213
3214 #[test]
3216 fn test_append_object() {
3217 let (m1, v1) = make_object();
3218 let variant = Variant::new(&m1, &v1);
3219
3220 let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3221
3222 builder.append_value(variant.clone());
3223
3224 let (metadata, value) = builder.finish();
3225 assert_eq!(variant, Variant::new(&metadata, &value));
3226 }
3227
3228 fn make_object() -> (Vec<u8>, Vec<u8>) {
3230 let mut builder = VariantBuilder::new();
3231
3232 let mut obj = builder.new_object();
3233
3234 obj.insert("b", true);
3235 obj.insert("a", false);
3236 obj.finish();
3237 builder.finish()
3238 }
3239
3240 #[test]
3241 fn test_append_nested_object() {
3242 let (m1, v1) = make_nested_object();
3243 let variant = Variant::new(&m1, &v1);
3244
3245 let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3247 builder.append_value(variant.clone());
3248
3249 let (metadata, value) = builder.finish();
3250 let result_variant = Variant::new(&metadata, &value);
3251
3252 assert_eq!(variant, result_variant);
3253 }
3254
3255 fn make_nested_object() -> (Vec<u8>, Vec<u8>) {
3257 let mut builder = VariantBuilder::new();
3258
3259 {
3260 let mut outer_obj = builder.new_object();
3261
3262 {
3263 let mut inner_obj = outer_obj.new_object("b");
3264 inner_obj.insert("a", "inner_value");
3265 inner_obj.finish();
3266 }
3267
3268 outer_obj.finish();
3269 }
3270
3271 builder.finish()
3272 }
3273
3274 #[test]
3275 fn test_append_list() {
3276 let (m1, v1) = make_list();
3277 let variant = Variant::new(&m1, &v1);
3278 let mut builder = VariantBuilder::new();
3279 builder.append_value(variant.clone());
3280 let (metadata, value) = builder.finish();
3281 assert_eq!(variant, Variant::new(&metadata, &value));
3282 }
3283
3284 fn make_list() -> (Vec<u8>, Vec<u8>) {
3286 let mut builder = VariantBuilder::new();
3287
3288 builder
3289 .new_list()
3290 .with_value(1234)
3291 .with_value("a string value")
3292 .finish();
3293
3294 builder.finish()
3295 }
3296
3297 #[test]
3298 fn test_append_nested_list() {
3299 let (m1, v1) = make_nested_list();
3300 let variant = Variant::new(&m1, &v1);
3301 let mut builder = VariantBuilder::new();
3302 builder.append_value(variant.clone());
3303 let (metadata, value) = builder.finish();
3304 assert_eq!(variant, Variant::new(&metadata, &value));
3305 }
3306
3307 fn make_nested_list() -> (Vec<u8>, Vec<u8>) {
3308 let mut builder = VariantBuilder::new();
3309 let mut list = builder.new_list();
3310
3311 list.new_list()
3313 .with_value("the dog licked the oil")
3314 .with_value(4.3)
3315 .finish();
3316
3317 list.finish();
3318
3319 builder.finish()
3320 }
3321
3322 #[test]
3325 fn test_append_list_object_list_object() {
3326 let mut counter = 0..;
3328 let mut take = move |i| (&mut counter).take(i).collect::<Vec<_>>();
3329 let mut builder = VariantBuilder::new();
3330 let skip = 5;
3331 {
3332 let mut list = builder.new_list();
3333 for i in take(4) {
3334 let mut object = list.new_object();
3335 for i in take(4) {
3336 let field_name = format!("field{i}");
3337 let mut list = object.new_list(&field_name);
3338 for i in take(3) {
3339 let mut object = list.new_object();
3340 for i in take(3) {
3341 if i % skip != 0 {
3342 object.insert(&format!("field{i}"), i);
3343 }
3344 }
3345 if i % skip != 0 {
3346 object.finish();
3347 }
3348 }
3349 if i % skip != 0 {
3350 list.finish();
3351 }
3352 }
3353 if i % skip != 0 {
3354 object.finish();
3355 }
3356 }
3357 list.finish();
3358 }
3359 let (metadata, value) = builder.finish();
3360 let v1 = Variant::try_new(&metadata, &value).unwrap();
3361
3362 let (metadata, value) = VariantBuilder::new().with_value(v1.clone()).finish();
3363 let v2 = Variant::try_new(&metadata, &value).unwrap();
3364
3365 assert_eq!(format!("{v1:?}"), format!("{v2:?}"));
3366 }
3367
3368 #[test]
3369 fn test_read_only_metadata_builder() {
3370 let mut default_builder = VariantBuilder::new();
3372 default_builder.add_field_name("name");
3373 default_builder.add_field_name("age");
3374 default_builder.add_field_name("active");
3375 let (metadata_bytes, _) = default_builder.finish();
3376
3377 let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
3379 let mut metadata_builder = ReadOnlyMetadataBuilder::new(&metadata);
3380 let mut value_builder = ValueBuilder::new();
3381
3382 {
3383 let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
3384 let mut obj = ObjectBuilder::new(state, false);
3385
3386 obj.insert("name", "Alice");
3388 obj.insert("age", 30i8);
3389 obj.insert("active", true);
3390 obj.finish();
3391 }
3392
3393 let value = value_builder.into_inner();
3394
3395 let variant = Variant::try_new(&metadata_bytes, &value).unwrap();
3397 let obj = variant.as_object().unwrap();
3398 assert_eq!(obj.get("name"), Some(Variant::from("Alice")));
3399 assert_eq!(obj.get("age"), Some(Variant::Int8(30)));
3400 assert_eq!(obj.get("active"), Some(Variant::from(true)));
3401 }
3402
3403 #[test]
3404 fn test_read_only_metadata_builder_fails_on_unknown_field() {
3405 let mut default_builder = VariantBuilder::new();
3407 default_builder.add_field_name("known_field");
3408 let (metadata_bytes, _) = default_builder.finish();
3409
3410 let metadata = VariantMetadata::try_new(&metadata_bytes).unwrap();
3412 let mut metadata_builder = ReadOnlyMetadataBuilder::new(&metadata);
3413 let mut value_builder = ValueBuilder::new();
3414
3415 {
3416 let state = ParentState::variant(&mut value_builder, &mut metadata_builder);
3417 let mut obj = ObjectBuilder::new(state, false);
3418
3419 obj.insert("known_field", "value");
3421
3422 let result = obj.try_insert("unknown_field", "value");
3424 assert!(result.is_err());
3425 assert!(
3426 result
3427 .unwrap_err()
3428 .to_string()
3429 .contains("Field name 'unknown_field' not found")
3430 );
3431 }
3432 }
3433
3434 #[test]
3435 fn test_append_variant_bytes_round_trip() {
3436 let mut builder = VariantBuilder::new();
3438 {
3439 let mut obj = builder.new_object();
3440 obj.insert("name", "Alice");
3441 obj.insert("age", 30i32);
3442 {
3443 let mut scores_list = obj.new_list("scores");
3444 scores_list.append_value(95i32);
3445 scores_list.append_value(87i32);
3446 scores_list.append_value(92i32);
3447 scores_list.finish();
3448 }
3449 {
3450 let mut address = obj.new_object("address");
3451 address.insert("street", "123 Main St");
3452 address.insert("city", "Anytown");
3453 address.finish();
3454 }
3455 obj.finish();
3456 }
3457 let (metadata, value1) = builder.finish();
3458 let variant1 = Variant::try_new(&metadata, &value1).unwrap();
3459
3460 let metadata = VariantMetadata::new(&metadata);
3462 let mut metadata = ReadOnlyMetadataBuilder::new(&metadata);
3463 let mut builder2 = ValueBuilder::new();
3464 let state = ParentState::variant(&mut builder2, &mut metadata);
3465 ValueBuilder::append_variant_bytes(state, variant1);
3466 let value2 = builder2.into_inner();
3467
3468 assert_eq!(value1, value2);
3470 }
3471
3472 #[test]
3473 fn test_object_insert_bytes_subset() {
3474 let mut builder = VariantBuilder::new().with_field_names(["new_field", "another_field"]);
3476 {
3477 let mut obj = builder.new_object();
3478 obj.insert("field1", "value1");
3479 obj.insert("field2", 42i32);
3480 obj.insert("field3", true);
3481 obj.insert("field4", "value4");
3482 obj.finish();
3483 }
3484 let (metadata1, value1) = builder.finish();
3485 let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3486 let original_obj = original_variant.as_object().unwrap();
3487
3488 let metadata2 = VariantMetadata::new(&metadata1);
3490 let mut metadata2 = ReadOnlyMetadataBuilder::new(&metadata2);
3491 let mut builder2 = ValueBuilder::new();
3492 let state = ParentState::variant(&mut builder2, &mut metadata2);
3493 {
3494 let mut obj = ObjectBuilder::new(state, true);
3495
3496 obj.insert_bytes("field1", original_obj.get("field1").unwrap());
3498
3499 obj.insert("new_field", "new_value");
3501
3502 obj.insert_bytes("field3", original_obj.get("field3").unwrap());
3504
3505 obj.insert("another_field", 99i32);
3507
3508 obj.insert_bytes("field2", original_obj.get("field2").unwrap());
3510
3511 obj.finish();
3512 }
3513 let value2 = builder2.into_inner();
3514 let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3515 let result_obj = result_variant.as_object().unwrap();
3516
3517 assert_eq!(result_obj.len(), 5);
3519 assert_eq!(
3520 result_obj.get("field1").unwrap().as_string().unwrap(),
3521 "value1"
3522 );
3523 assert_eq!(result_obj.get("field2").unwrap().as_int32().unwrap(), 42);
3524 assert!(result_obj.get("field3").unwrap().as_boolean().unwrap());
3525 assert_eq!(
3526 result_obj.get("new_field").unwrap().as_string().unwrap(),
3527 "new_value"
3528 );
3529 assert_eq!(
3530 result_obj.get("another_field").unwrap().as_int32().unwrap(),
3531 99
3532 );
3533 }
3534
3535 #[test]
3536 fn test_list_append_bytes_subset() {
3537 let mut builder = VariantBuilder::new();
3539 {
3540 let mut list = builder.new_list();
3541 list.append_value("item1");
3542 list.append_value(42i32);
3543 list.append_value(true);
3544 list.append_value("item4");
3545 list.append_value(1.234f64);
3546 list.finish();
3547 }
3548 let (metadata1, value1) = builder.finish();
3549 let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3550 let original_list = original_variant.as_list().unwrap();
3551
3552 let metadata2 = VariantMetadata::new(&metadata1);
3554 let mut metadata2 = ReadOnlyMetadataBuilder::new(&metadata2);
3555 let mut builder2 = ValueBuilder::new();
3556 let state = ParentState::variant(&mut builder2, &mut metadata2);
3557 {
3558 let mut list = ListBuilder::new(state, true);
3559
3560 list.append_value_bytes(original_list.get(0).unwrap());
3562
3563 list.append_value("new_item");
3565
3566 list.append_value_bytes(original_list.get(2).unwrap());
3568
3569 list.append_value(99i32);
3571
3572 list.append_value_bytes(original_list.get(4).unwrap());
3574
3575 list.finish();
3576 }
3577 let value2 = builder2.into_inner();
3578 let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3579 let result_list = result_variant.as_list().unwrap();
3580
3581 assert_eq!(result_list.len(), 5);
3583 assert_eq!(result_list.get(0).unwrap().as_string().unwrap(), "item1");
3584 assert_eq!(result_list.get(1).unwrap().as_string().unwrap(), "new_item");
3585 assert!(result_list.get(2).unwrap().as_boolean().unwrap());
3586 assert_eq!(result_list.get(3).unwrap().as_int32().unwrap(), 99);
3587 assert_eq!(result_list.get(4).unwrap().as_f64().unwrap(), 1.234);
3588 }
3589
3590 #[test]
3591 fn test_complex_nested_filtering_injection() {
3592 let mut builder = VariantBuilder::new().with_field_names([
3595 "active_count",
3596 "active_users",
3597 "computed_score",
3598 "processed_at",
3599 "status",
3600 ]);
3601
3602 {
3603 let mut root_obj = builder.new_object();
3604 root_obj.insert("metadata", "original");
3605
3606 {
3607 let mut users_list = root_obj.new_list("users");
3608
3609 {
3611 let mut user1 = users_list.new_object();
3612 user1.insert("id", 1i32);
3613 user1.insert("name", "Alice");
3614 user1.insert("active", true);
3615 user1.finish();
3616 }
3617
3618 {
3620 let mut user2 = users_list.new_object();
3621 user2.insert("id", 2i32);
3622 user2.insert("name", "Bob");
3623 user2.insert("active", false);
3624 user2.finish();
3625 }
3626
3627 {
3629 let mut user3 = users_list.new_object();
3630 user3.insert("id", 3i32);
3631 user3.insert("name", "Charlie");
3632 user3.insert("active", true);
3633 user3.finish();
3634 }
3635
3636 users_list.finish();
3637 }
3638
3639 root_obj.insert("total_count", 3i32);
3640 root_obj.finish();
3641 }
3642 let (metadata1, value1) = builder.finish();
3643 let original_variant = Variant::try_new(&metadata1, &value1).unwrap();
3644 let original_obj = original_variant.as_object().unwrap();
3645 let original_users = original_obj.get("users").unwrap();
3646 let original_users = original_users.as_list().unwrap();
3647
3648 let metadata2 = VariantMetadata::new(&metadata1);
3650 let mut metadata2 = ReadOnlyMetadataBuilder::new(&metadata2);
3651 let mut builder2 = ValueBuilder::new();
3652 let state = ParentState::variant(&mut builder2, &mut metadata2);
3653 {
3654 let mut root_obj = ObjectBuilder::new(state, true);
3655
3656 root_obj.insert_bytes("metadata", original_obj.get("metadata").unwrap());
3658
3659 root_obj.insert("processed_at", "2024-01-01T00:00:00Z");
3661
3662 {
3663 let mut filtered_users = root_obj.new_list("active_users");
3664
3665 for i in 0..original_users.len() {
3667 let user = original_users.get(i).unwrap();
3668 let user = user.as_object().unwrap();
3669 if user.get("active").unwrap().as_boolean().unwrap() {
3670 {
3671 let mut new_user = filtered_users.new_object();
3672
3673 new_user.insert_bytes("id", user.get("id").unwrap());
3675 new_user.insert_bytes("name", user.get("name").unwrap());
3676
3677 let user_id = user.get("id").unwrap().as_int32().unwrap();
3679 new_user.insert("computed_score", user_id * 10);
3680
3681 new_user.insert("status", "verified");
3683
3684 new_user.finish();
3685 }
3686 }
3687 }
3688
3689 {
3691 let mut new_user = filtered_users.new_object();
3692 new_user.insert("id", 999i32);
3693 new_user.insert("name", "System User");
3694 new_user.insert("computed_score", 0i32);
3695 new_user.insert("status", "system");
3696 new_user.finish();
3697 }
3698
3699 filtered_users.finish();
3700 }
3701
3702 root_obj.insert("active_count", 3i32); root_obj.finish();
3706 }
3707 let value2 = builder2.into_inner();
3708 let result_variant = Variant::try_new(&metadata1, &value2).unwrap();
3709 let result_obj = result_variant.as_object().unwrap();
3710
3711 assert_eq!(
3713 result_obj.get("metadata").unwrap().as_string().unwrap(),
3714 "original"
3715 );
3716 assert_eq!(
3717 result_obj.get("processed_at").unwrap().as_string().unwrap(),
3718 "2024-01-01T00:00:00Z"
3719 );
3720 assert_eq!(
3721 result_obj.get("active_count").unwrap().as_int32().unwrap(),
3722 3
3723 );
3724
3725 let active_users = result_obj.get("active_users").unwrap();
3726 let active_users = active_users.as_list().unwrap();
3727 assert_eq!(active_users.len(), 3);
3728
3729 let alice = active_users.get(0).unwrap();
3731 let alice = alice.as_object().unwrap();
3732 assert_eq!(alice.get("id").unwrap().as_int32().unwrap(), 1);
3733 assert_eq!(alice.get("name").unwrap().as_string().unwrap(), "Alice");
3734 assert_eq!(alice.get("computed_score").unwrap().as_int32().unwrap(), 10);
3735 assert_eq!(
3736 alice.get("status").unwrap().as_string().unwrap(),
3737 "verified"
3738 );
3739 assert!(alice.get("active").is_none()); let charlie = active_users.get(1).unwrap();
3743 let charlie = charlie.as_object().unwrap();
3744 assert_eq!(charlie.get("id").unwrap().as_int32().unwrap(), 3);
3745 assert_eq!(charlie.get("name").unwrap().as_string().unwrap(), "Charlie");
3746 assert_eq!(
3747 charlie.get("computed_score").unwrap().as_int32().unwrap(),
3748 30
3749 );
3750 assert_eq!(
3751 charlie.get("status").unwrap().as_string().unwrap(),
3752 "verified"
3753 );
3754
3755 let system_user = active_users.get(2).unwrap();
3757 let system_user = system_user.as_object().unwrap();
3758 assert_eq!(system_user.get("id").unwrap().as_int32().unwrap(), 999);
3759 assert_eq!(
3760 system_user.get("name").unwrap().as_string().unwrap(),
3761 "System User"
3762 );
3763 assert_eq!(
3764 system_user
3765 .get("computed_score")
3766 .unwrap()
3767 .as_int32()
3768 .unwrap(),
3769 0
3770 );
3771 assert_eq!(
3772 system_user.get("status").unwrap().as_string().unwrap(),
3773 "system"
3774 );
3775 }
3776}