1use crate::decoder::{VariantBasicType, VariantPrimitiveType};
18use crate::{
19 ShortString, Variant, VariantDecimal16, VariantDecimal4, VariantDecimal8, VariantList,
20 VariantMetadata, VariantObject,
21};
22use arrow_schema::ArrowError;
23use indexmap::{IndexMap, IndexSet};
24use std::collections::HashSet;
25
26const BASIC_TYPE_BITS: u8 = 2;
27const UNIX_EPOCH_DATE: chrono::NaiveDate = chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap();
28
29fn primitive_header(primitive_type: VariantPrimitiveType) -> u8 {
30 (primitive_type as u8) << 2 | VariantBasicType::Primitive as u8
31}
32
33fn short_string_header(len: usize) -> u8 {
34 (len as u8) << 2 | VariantBasicType::ShortString as u8
35}
36
37fn array_header(large: bool, offset_size: u8) -> u8 {
38 let large_bit = if large { 1 } else { 0 };
39 (large_bit << (BASIC_TYPE_BITS + 2))
40 | ((offset_size - 1) << BASIC_TYPE_BITS)
41 | VariantBasicType::Array as u8
42}
43
44fn object_header(large: bool, id_size: u8, offset_size: u8) -> u8 {
45 let large_bit = if large { 1 } else { 0 };
46 (large_bit << (BASIC_TYPE_BITS + 4))
47 | ((id_size - 1) << (BASIC_TYPE_BITS + 2))
48 | ((offset_size - 1) << BASIC_TYPE_BITS)
49 | VariantBasicType::Object as u8
50}
51
52fn int_size(v: usize) -> u8 {
53 match v {
54 0..=0xFF => 1,
55 0x100..=0xFFFF => 2,
56 0x10000..=0xFFFFFF => 3,
57 _ => 4,
58 }
59}
60
61fn write_offset(buf: &mut Vec<u8>, value: usize, nbytes: u8) {
63 let bytes = value.to_le_bytes();
64 buf.extend_from_slice(&bytes[..nbytes as usize]);
65}
66
67fn write_offset_at_pos(buf: &mut [u8], start_pos: usize, value: usize, nbytes: u8) {
69 let bytes = value.to_le_bytes();
70 buf[start_pos..start_pos + nbytes as usize].copy_from_slice(&bytes[..nbytes as usize]);
71}
72
73fn append_packed_u32(dest: &mut Vec<u8>, value: u32, value_size: usize) {
75 let n = dest.len() + value_size;
76 dest.extend(value.to_le_bytes());
77 dest.truncate(n);
78}
79
80#[derive(Debug, Default)]
88struct ValueBuffer(Vec<u8>);
89
90impl ValueBuffer {
91 fn new() -> Self {
93 Default::default()
94 }
95}
96
97impl From<Vec<u8>> for ValueBuffer {
98 fn from(value: Vec<u8>) -> Self {
99 Self(value)
100 }
101}
102
103impl From<ValueBuffer> for Vec<u8> {
104 fn from(value_buffer: ValueBuffer) -> Self {
105 value_buffer.0
106 }
107}
108
109impl ValueBuffer {
110 fn append_u8(&mut self, term: u8) {
111 self.0.push(term);
112 }
113
114 fn append_slice(&mut self, other: &[u8]) {
115 self.0.extend_from_slice(other);
116 }
117
118 fn append_primitive_header(&mut self, primitive_type: VariantPrimitiveType) {
119 self.0.push(primitive_header(primitive_type));
120 }
121
122 fn into_inner(self) -> Vec<u8> {
123 self.into()
124 }
125
126 fn inner_mut(&mut self) -> &mut Vec<u8> {
127 &mut self.0
128 }
129
130 fn append_null(&mut self) {
133 self.append_primitive_header(VariantPrimitiveType::Null);
134 }
135
136 fn append_bool(&mut self, value: bool) {
137 let primitive_type = if value {
138 VariantPrimitiveType::BooleanTrue
139 } else {
140 VariantPrimitiveType::BooleanFalse
141 };
142 self.append_primitive_header(primitive_type);
143 }
144
145 fn append_int8(&mut self, value: i8) {
146 self.append_primitive_header(VariantPrimitiveType::Int8);
147 self.append_u8(value as u8);
148 }
149
150 fn append_int16(&mut self, value: i16) {
151 self.append_primitive_header(VariantPrimitiveType::Int16);
152 self.append_slice(&value.to_le_bytes());
153 }
154
155 fn append_int32(&mut self, value: i32) {
156 self.append_primitive_header(VariantPrimitiveType::Int32);
157 self.append_slice(&value.to_le_bytes());
158 }
159
160 fn append_int64(&mut self, value: i64) {
161 self.append_primitive_header(VariantPrimitiveType::Int64);
162 self.append_slice(&value.to_le_bytes());
163 }
164
165 fn append_float(&mut self, value: f32) {
166 self.append_primitive_header(VariantPrimitiveType::Float);
167 self.append_slice(&value.to_le_bytes());
168 }
169
170 fn append_double(&mut self, value: f64) {
171 self.append_primitive_header(VariantPrimitiveType::Double);
172 self.append_slice(&value.to_le_bytes());
173 }
174
175 fn append_date(&mut self, value: chrono::NaiveDate) {
176 self.append_primitive_header(VariantPrimitiveType::Date);
177 let days_since_epoch = value.signed_duration_since(UNIX_EPOCH_DATE).num_days() as i32;
178 self.append_slice(&days_since_epoch.to_le_bytes());
179 }
180
181 fn append_timestamp_micros(&mut self, value: chrono::DateTime<chrono::Utc>) {
182 self.append_primitive_header(VariantPrimitiveType::TimestampMicros);
183 let micros = value.timestamp_micros();
184 self.append_slice(µs.to_le_bytes());
185 }
186
187 fn append_timestamp_ntz_micros(&mut self, value: chrono::NaiveDateTime) {
188 self.append_primitive_header(VariantPrimitiveType::TimestampNtzMicros);
189 let micros = value.and_utc().timestamp_micros();
190 self.append_slice(µs.to_le_bytes());
191 }
192
193 fn append_decimal4(&mut self, decimal4: VariantDecimal4) {
194 self.append_primitive_header(VariantPrimitiveType::Decimal4);
195 self.append_u8(decimal4.scale());
196 self.append_slice(&decimal4.integer().to_le_bytes());
197 }
198
199 fn append_decimal8(&mut self, decimal8: VariantDecimal8) {
200 self.append_primitive_header(VariantPrimitiveType::Decimal8);
201 self.append_u8(decimal8.scale());
202 self.append_slice(&decimal8.integer().to_le_bytes());
203 }
204
205 fn append_decimal16(&mut self, decimal16: VariantDecimal16) {
206 self.append_primitive_header(VariantPrimitiveType::Decimal16);
207 self.append_u8(decimal16.scale());
208 self.append_slice(&decimal16.integer().to_le_bytes());
209 }
210
211 fn append_binary(&mut self, value: &[u8]) {
212 self.append_primitive_header(VariantPrimitiveType::Binary);
213 self.append_slice(&(value.len() as u32).to_le_bytes());
214 self.append_slice(value);
215 }
216
217 fn append_short_string(&mut self, value: ShortString) {
218 let inner = value.0;
219 self.append_u8(short_string_header(inner.len()));
220 self.append_slice(inner.as_bytes());
221 }
222
223 fn append_string(&mut self, value: &str) {
224 self.append_primitive_header(VariantPrimitiveType::String);
225 self.append_slice(&(value.len() as u32).to_le_bytes());
226 self.append_slice(value.as_bytes());
227 }
228
229 fn append_object(&mut self, metadata_builder: &mut MetadataBuilder, obj: VariantObject) {
230 let mut object_builder = self.new_object(metadata_builder);
231
232 for (field_name, value) in obj.iter() {
233 object_builder.insert(field_name, value);
234 }
235
236 object_builder.finish().unwrap();
237 }
238
239 fn try_append_object(
240 &mut self,
241 metadata_builder: &mut MetadataBuilder,
242 obj: VariantObject,
243 ) -> Result<(), ArrowError> {
244 let mut object_builder = self.new_object(metadata_builder);
245
246 for res in obj.iter_try() {
247 let (field_name, value) = res?;
248 object_builder.try_insert(field_name, value)?;
249 }
250
251 object_builder.finish()?;
252
253 Ok(())
254 }
255
256 fn append_list(&mut self, metadata_builder: &mut MetadataBuilder, list: VariantList) {
257 let mut list_builder = self.new_list(metadata_builder);
258 for value in list.iter() {
259 list_builder.append_value(value);
260 }
261 list_builder.finish();
262 }
263
264 fn try_append_list(
265 &mut self,
266 metadata_builder: &mut MetadataBuilder,
267 list: VariantList,
268 ) -> Result<(), ArrowError> {
269 let mut list_builder = self.new_list(metadata_builder);
270 for res in list.iter_try() {
271 let value = res?;
272 list_builder.try_append_value(value)?;
273 }
274
275 list_builder.finish();
276
277 Ok(())
278 }
279
280 fn offset(&self) -> usize {
281 self.0.len()
282 }
283
284 fn new_object<'a>(
285 &'a mut self,
286 metadata_builder: &'a mut MetadataBuilder,
287 ) -> ObjectBuilder<'a> {
288 let parent_state = ParentState::Variant {
289 buffer: self,
290 metadata_builder,
291 };
292 let validate_unique_fields = false;
293 ObjectBuilder::new(parent_state, validate_unique_fields)
294 }
295
296 fn new_list<'a>(&'a mut self, metadata_builder: &'a mut MetadataBuilder) -> ListBuilder<'a> {
297 let parent_state = ParentState::Variant {
298 buffer: self,
299 metadata_builder,
300 };
301 let validate_unique_fields = false;
302 ListBuilder::new(parent_state, validate_unique_fields)
303 }
304
305 fn append_variant<'m, 'd>(
312 &mut self,
313 variant: Variant<'m, 'd>,
314 metadata_builder: &mut MetadataBuilder,
315 ) {
316 match variant {
317 Variant::Null => self.append_null(),
318 Variant::BooleanTrue => self.append_bool(true),
319 Variant::BooleanFalse => self.append_bool(false),
320 Variant::Int8(v) => self.append_int8(v),
321 Variant::Int16(v) => self.append_int16(v),
322 Variant::Int32(v) => self.append_int32(v),
323 Variant::Int64(v) => self.append_int64(v),
324 Variant::Date(v) => self.append_date(v),
325 Variant::TimestampMicros(v) => self.append_timestamp_micros(v),
326 Variant::TimestampNtzMicros(v) => self.append_timestamp_ntz_micros(v),
327 Variant::Decimal4(decimal4) => self.append_decimal4(decimal4),
328 Variant::Decimal8(decimal8) => self.append_decimal8(decimal8),
329 Variant::Decimal16(decimal16) => self.append_decimal16(decimal16),
330 Variant::Float(v) => self.append_float(v),
331 Variant::Double(v) => self.append_double(v),
332 Variant::Binary(v) => self.append_binary(v),
333 Variant::String(s) => self.append_string(s),
334 Variant::ShortString(s) => self.append_short_string(s),
335 Variant::Object(obj) => self.append_object(metadata_builder, obj),
336 Variant::List(list) => self.append_list(metadata_builder, list),
337 }
338 }
339
340 fn try_append_variant<'m, 'd>(
342 &mut self,
343 variant: Variant<'m, 'd>,
344 metadata_builder: &mut MetadataBuilder,
345 ) -> Result<(), ArrowError> {
346 match variant {
347 Variant::Null => self.append_null(),
348 Variant::BooleanTrue => self.append_bool(true),
349 Variant::BooleanFalse => self.append_bool(false),
350 Variant::Int8(v) => self.append_int8(v),
351 Variant::Int16(v) => self.append_int16(v),
352 Variant::Int32(v) => self.append_int32(v),
353 Variant::Int64(v) => self.append_int64(v),
354 Variant::Date(v) => self.append_date(v),
355 Variant::TimestampMicros(v) => self.append_timestamp_micros(v),
356 Variant::TimestampNtzMicros(v) => self.append_timestamp_ntz_micros(v),
357 Variant::Decimal4(decimal4) => self.append_decimal4(decimal4),
358 Variant::Decimal8(decimal8) => self.append_decimal8(decimal8),
359 Variant::Decimal16(decimal16) => self.append_decimal16(decimal16),
360 Variant::Float(v) => self.append_float(v),
361 Variant::Double(v) => self.append_double(v),
362 Variant::Binary(v) => self.append_binary(v),
363 Variant::String(s) => self.append_string(s),
364 Variant::ShortString(s) => self.append_short_string(s),
365 Variant::Object(obj) => self.try_append_object(metadata_builder, obj)?,
366 Variant::List(list) => self.try_append_list(metadata_builder, list)?,
367 }
368
369 Ok(())
370 }
371
372 fn append_header_start_from_buf_pos(
375 &mut self,
376 start_pos: usize, header_byte: u8,
378 is_large: bool,
379 num_fields: usize,
380 ) -> usize {
381 let buffer = self.inner_mut();
382
383 let mut header_pos = start_pos;
385
386 buffer[header_pos] = header_byte;
388 header_pos += 1;
389
390 if is_large {
392 buffer[header_pos..header_pos + 4].copy_from_slice(&(num_fields as u32).to_le_bytes());
393 header_pos += 4;
394 } else {
395 buffer[header_pos] = num_fields as u8;
396 header_pos += 1;
397 }
398
399 header_pos
400 }
401
402 fn append_offset_array_start_from_buf_pos(
405 &mut self,
406 start_pos: usize,
407 offsets: impl IntoIterator<Item = usize>,
408 data_size: Option<usize>,
409 nbytes: u8,
410 ) -> usize {
411 let buf = self.inner_mut();
412
413 let mut current_pos = start_pos;
414 for relative_offset in offsets {
415 write_offset_at_pos(buf, current_pos, relative_offset, nbytes);
416 current_pos += nbytes as usize;
417 }
418
419 if let Some(data_size) = data_size {
421 write_offset_at_pos(buf, current_pos, data_size, nbytes);
423 current_pos += nbytes as usize;
424 }
425
426 current_pos
427 }
428}
429
430#[derive(Default, Debug)]
436struct MetadataBuilder {
437 field_names: IndexSet<String>,
439
440 is_sorted: bool,
442
443 metadata_buffer: Vec<u8>,
445}
446
447impl From<Vec<u8>> for MetadataBuilder {
449 fn from(metadata_buffer: Vec<u8>) -> Self {
450 Self {
451 metadata_buffer,
452 ..Default::default()
453 }
454 }
455}
456
457impl MetadataBuilder {
458 fn upsert_field_name(&mut self, field_name: &str) -> u32 {
460 let (id, new_entry) = self.field_names.insert_full(field_name.to_string());
461
462 if new_entry {
463 let n = self.num_field_names();
464
465 self.is_sorted =
470 n == 1 || self.is_sorted && (self.field_names[n - 2] < self.field_names[n - 1]);
471 }
472
473 id as u32
474 }
475
476 fn num_field_names(&self) -> usize {
483 let n = self.field_names.len();
484 assert!(n <= u32::MAX as usize);
485
486 n
487 }
488
489 fn field_name(&self, i: usize) -> &str {
490 &self.field_names[i]
491 }
492
493 fn metadata_size(&self) -> usize {
494 self.field_names.iter().map(|k| k.len()).sum()
495 }
496
497 fn finish(self) -> Vec<u8> {
498 let nkeys = self.num_field_names();
499
500 let total_dict_size: usize = self.metadata_size();
502
503 let Self {
504 field_names,
505 is_sorted,
506 mut metadata_buffer,
507 } = self;
508
509 let max_offset = std::cmp::max(total_dict_size, nkeys);
511 let offset_size = int_size(max_offset);
512
513 let offset_start = 1 + offset_size as usize;
514 let string_start = offset_start + (nkeys + 1) * offset_size as usize;
515 let metadata_size = string_start + total_dict_size;
516
517 metadata_buffer.reserve(metadata_size);
518
519 metadata_buffer.push(0x01 | (is_sorted as u8) << 4 | ((offset_size - 1) << 6));
521
522 write_offset(&mut metadata_buffer, nkeys, offset_size);
524
525 let mut cur_offset = 0;
527 for key in field_names.iter() {
528 write_offset(&mut metadata_buffer, cur_offset, offset_size);
529 cur_offset += key.len();
530 }
531 write_offset(&mut metadata_buffer, cur_offset, offset_size);
533
534 for key in field_names {
536 metadata_buffer.extend_from_slice(key.as_bytes());
537 }
538
539 metadata_buffer
540 }
541
542 pub(crate) fn take_buffer(self) -> Vec<u8> {
544 self.metadata_buffer
545 }
546}
547
548impl<S: AsRef<str>> FromIterator<S> for MetadataBuilder {
549 fn from_iter<T: IntoIterator<Item = S>>(iter: T) -> Self {
550 let mut this = Self::default();
551 this.extend(iter);
552
553 this
554 }
555}
556
557impl<S: AsRef<str>> Extend<S> for MetadataBuilder {
558 fn extend<T: IntoIterator<Item = S>>(&mut self, iter: T) {
559 let iter = iter.into_iter();
560 let (min, _) = iter.size_hint();
561
562 self.field_names.reserve(min);
563
564 for field_name in iter {
565 self.upsert_field_name(field_name.as_ref());
566 }
567 }
568}
569
570enum ParentState<'a> {
583 Variant {
584 buffer: &'a mut ValueBuffer,
585 metadata_builder: &'a mut MetadataBuilder,
586 },
587 List {
588 buffer: &'a mut ValueBuffer,
589 metadata_builder: &'a mut MetadataBuilder,
590 parent_value_offset_base: usize,
591 offsets: &'a mut Vec<usize>,
592 },
593 Object {
594 buffer: &'a mut ValueBuffer,
595 metadata_builder: &'a mut MetadataBuilder,
596 fields: &'a mut IndexMap<u32, usize>,
597 field_name: &'a str,
598 parent_value_offset_base: usize,
599 },
600}
601
602impl ParentState<'_> {
603 fn buffer(&mut self) -> &mut ValueBuffer {
604 match self {
605 ParentState::Variant { buffer, .. } => buffer,
606 ParentState::List { buffer, .. } => buffer,
607 ParentState::Object { buffer, .. } => buffer,
608 }
609 }
610
611 fn metadata_builder(&mut self) -> &mut MetadataBuilder {
612 match self {
613 ParentState::Variant {
614 metadata_builder, ..
615 } => metadata_builder,
616 ParentState::List {
617 metadata_builder, ..
618 } => metadata_builder,
619 ParentState::Object {
620 metadata_builder, ..
621 } => metadata_builder,
622 }
623 }
624
625 fn finish(&mut self, starting_offset: usize) {
630 match self {
631 ParentState::Variant { .. } => (),
632 ParentState::List {
633 offsets,
634 parent_value_offset_base,
635 ..
636 } => offsets.push(starting_offset - *parent_value_offset_base),
637 ParentState::Object {
638 metadata_builder,
639 fields,
640 field_name,
641 parent_value_offset_base,
642 ..
643 } => {
644 let field_id = metadata_builder.upsert_field_name(field_name);
645 let shifted_start_offset = starting_offset - *parent_value_offset_base;
646 fields.insert(field_id, shifted_start_offset);
647 }
648 }
649 }
650
651 fn buffer_and_metadata_builder(&mut self) -> (&mut ValueBuffer, &mut MetadataBuilder) {
654 match self {
655 ParentState::Variant {
656 buffer,
657 metadata_builder,
658 }
659 | ParentState::List {
660 buffer,
661 metadata_builder,
662 ..
663 }
664 | ParentState::Object {
665 buffer,
666 metadata_builder,
667 ..
668 } => (buffer, metadata_builder),
669 }
670 }
671
672 fn buffer_current_offset(&self) -> usize {
674 match self {
675 ParentState::Variant { buffer, .. }
676 | ParentState::Object { buffer, .. }
677 | ParentState::List { buffer, .. } => buffer.offset(),
678 }
679 }
680
681 fn metadata_current_offset(&self) -> usize {
683 match self {
684 ParentState::Variant {
685 metadata_builder, ..
686 }
687 | ParentState::Object {
688 metadata_builder, ..
689 }
690 | ParentState::List {
691 metadata_builder, ..
692 } => metadata_builder.metadata_buffer.len(),
693 }
694 }
695}
696
697#[derive(Default, Debug)]
969pub struct VariantBuilder {
970 buffer: ValueBuffer,
971 metadata_builder: MetadataBuilder,
972 validate_unique_fields: bool,
973}
974
975impl VariantBuilder {
976 pub fn new() -> Self {
978 Self {
979 buffer: ValueBuffer::new(),
980 metadata_builder: MetadataBuilder::default(),
981 validate_unique_fields: false,
982 }
983 }
984
985 pub fn with_metadata(mut self, metadata: VariantMetadata) -> Self {
987 self.metadata_builder.extend(metadata.iter());
988
989 self
990 }
991
992 pub fn new_with_buffers(metadata_buffer: Vec<u8>, value_buffer: Vec<u8>) -> Self {
995 Self {
996 buffer: ValueBuffer::from(value_buffer),
997 metadata_builder: MetadataBuilder::from(metadata_buffer),
998 validate_unique_fields: false,
999 }
1000 }
1001
1002 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1008 self.validate_unique_fields = validate_unique_fields;
1009 self
1010 }
1011
1012 pub fn with_field_names<'a>(mut self, field_names: impl Iterator<Item = &'a str>) -> Self {
1019 self.metadata_builder.extend(field_names);
1020
1021 self
1022 }
1023
1024 pub fn reserve(&mut self, capacity: usize) {
1028 self.metadata_builder.field_names.reserve(capacity);
1029 }
1030
1031 pub fn add_field_name(&mut self, field_name: &str) {
1035 self.metadata_builder.upsert_field_name(field_name);
1036 }
1037
1038 fn parent_state(&mut self) -> (ParentState<'_>, bool) {
1040 let state = ParentState::Variant {
1041 buffer: &mut self.buffer,
1042 metadata_builder: &mut self.metadata_builder,
1043 };
1044 (state, self.validate_unique_fields)
1045 }
1046
1047 pub fn new_list(&mut self) -> ListBuilder<'_> {
1051 let (parent_state, validate_unique_fields) = self.parent_state();
1052 ListBuilder::new(parent_state, validate_unique_fields)
1053 }
1054
1055 pub fn new_object(&mut self) -> ObjectBuilder<'_> {
1059 let (parent_state, validate_unique_fields) = self.parent_state();
1060 ObjectBuilder::new(parent_state, validate_unique_fields)
1061 }
1062
1063 pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1078 let variant = value.into();
1079 self.buffer
1080 .append_variant(variant, &mut self.metadata_builder);
1081 }
1082
1083 pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1085 &mut self,
1086 value: T,
1087 ) -> Result<(), ArrowError> {
1088 let variant = value.into();
1089 self.buffer
1090 .try_append_variant(variant, &mut self.metadata_builder)?;
1091
1092 Ok(())
1093 }
1094
1095 pub fn finish(self) -> (Vec<u8>, Vec<u8>) {
1097 (self.metadata_builder.finish(), self.buffer.into_inner())
1098 }
1099
1100 pub fn into_buffers(self) -> (Vec<u8>, Vec<u8>) {
1106 (
1107 self.metadata_builder.take_buffer(),
1108 self.buffer.into_inner(),
1109 )
1110 }
1111}
1112
1113pub struct ListBuilder<'a> {
1117 parent_state: ParentState<'a>,
1118 offsets: Vec<usize>,
1119 parent_value_offset_base: usize,
1121 parent_metadata_offset_base: usize,
1124 has_been_finished: bool,
1127 validate_unique_fields: bool,
1128}
1129
1130impl<'a> ListBuilder<'a> {
1131 fn new(parent_state: ParentState<'a>, validate_unique_fields: bool) -> Self {
1132 let parent_value_offset_base = parent_state.buffer_current_offset();
1133 let parent_metadata_offset_base = parent_state.metadata_current_offset();
1134 Self {
1135 parent_state,
1136 offsets: vec![],
1137 parent_value_offset_base,
1138 has_been_finished: false,
1139 parent_metadata_offset_base,
1140 validate_unique_fields,
1141 }
1142 }
1143
1144 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1149 self.validate_unique_fields = validate_unique_fields;
1150 self
1151 }
1152
1153 fn parent_state(&mut self) -> (ParentState<'_>, bool) {
1155 let (buffer, metadata_builder) = self.parent_state.buffer_and_metadata_builder();
1156
1157 let state = ParentState::List {
1158 buffer,
1159 metadata_builder,
1160 parent_value_offset_base: self.parent_value_offset_base,
1161 offsets: &mut self.offsets,
1162 };
1163 (state, self.validate_unique_fields)
1164 }
1165
1166 pub fn new_object(&mut self) -> ObjectBuilder<'_> {
1170 let (parent_state, validate_unique_fields) = self.parent_state();
1171 ObjectBuilder::new(parent_state, validate_unique_fields)
1172 }
1173
1174 pub fn new_list(&mut self) -> ListBuilder<'_> {
1178 let (parent_state, validate_unique_fields) = self.parent_state();
1179 ListBuilder::new(parent_state, validate_unique_fields)
1180 }
1181
1182 pub fn append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, value: T) {
1189 self.try_append_value(value).unwrap();
1190 }
1191
1192 pub fn try_append_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1194 &mut self,
1195 value: T,
1196 ) -> Result<(), ArrowError> {
1197 let (buffer, metadata_builder) = self.parent_state.buffer_and_metadata_builder();
1198
1199 let offset = buffer.offset() - self.parent_value_offset_base;
1200 self.offsets.push(offset);
1201
1202 buffer.try_append_variant(value.into(), metadata_builder)?;
1203
1204 Ok(())
1205 }
1206
1207 pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
1214 self.append_value(value);
1215 self
1216 }
1217
1218 pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
1222 mut self,
1223 value: T,
1224 ) -> Result<Self, ArrowError> {
1225 self.try_append_value(value)?;
1226 Ok(self)
1227 }
1228
1229 pub fn finish(mut self) {
1231 let buffer = self.parent_state.buffer();
1232
1233 let data_size = buffer
1234 .offset()
1235 .checked_sub(self.parent_value_offset_base)
1236 .expect("Data size overflowed usize");
1237
1238 let num_elements = self.offsets.len();
1239 let is_large = num_elements > u8::MAX as usize;
1240 let offset_size = int_size(data_size);
1241
1242 let starting_offset = self.parent_value_offset_base;
1243
1244 let num_elements_size = if is_large { 4 } else { 1 }; let num_elements = self.offsets.len();
1246 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);
1253 let header = array_header(is_large, offset_size);
1255 bytes_to_splice.push(header);
1256
1257 append_packed_u32(&mut bytes_to_splice, num_elements as u32, num_elements_size);
1258
1259 for offset in &self.offsets {
1260 append_packed_u32(&mut bytes_to_splice, *offset as u32, offset_size as usize);
1261 }
1262
1263 append_packed_u32(&mut bytes_to_splice, data_size as u32, offset_size as usize);
1264
1265 buffer
1266 .inner_mut()
1267 .splice(starting_offset..starting_offset, bytes_to_splice);
1268
1269 self.parent_state.finish(starting_offset);
1270 self.has_been_finished = true;
1271 }
1272}
1273
1274impl Drop for ListBuilder<'_> {
1279 fn drop(&mut self) {
1280 if !self.has_been_finished {
1281 self.parent_state
1282 .buffer()
1283 .inner_mut()
1284 .truncate(self.parent_value_offset_base);
1285 self.parent_state
1286 .metadata_builder()
1287 .field_names
1288 .truncate(self.parent_metadata_offset_base);
1289 }
1290 }
1291}
1292
1293pub struct ObjectBuilder<'a> {
1297 parent_state: ParentState<'a>,
1298 fields: IndexMap<u32, usize>, parent_value_offset_base: usize,
1301 parent_metadata_offset_base: usize,
1304 has_been_finished: bool,
1307 validate_unique_fields: bool,
1308 duplicate_fields: HashSet<u32>,
1310}
1311
1312impl<'a> ObjectBuilder<'a> {
1313 fn new(parent_state: ParentState<'a>, validate_unique_fields: bool) -> Self {
1314 let offset_base = parent_state.buffer_current_offset();
1315 let meta_offset_base = parent_state.metadata_current_offset();
1316 Self {
1317 parent_state,
1318 fields: IndexMap::new(),
1319 parent_value_offset_base: offset_base,
1320 has_been_finished: false,
1321 parent_metadata_offset_base: meta_offset_base,
1322 validate_unique_fields,
1323 duplicate_fields: HashSet::new(),
1324 }
1325 }
1326
1327 pub fn insert<'m, 'd, T: Into<Variant<'m, 'd>>>(&mut self, key: &str, value: T) {
1338 self.try_insert(key, value).unwrap();
1339 }
1340
1341 pub fn try_insert<'m, 'd, T: Into<Variant<'m, 'd>>>(
1351 &mut self,
1352 key: &str,
1353 value: T,
1354 ) -> Result<(), ArrowError> {
1355 let (buffer, metadata_builder) = self.parent_state.buffer_and_metadata_builder();
1356
1357 let field_id = metadata_builder.upsert_field_name(key);
1358 let field_start = buffer.offset() - self.parent_value_offset_base;
1359
1360 if self.fields.insert(field_id, field_start).is_some() && self.validate_unique_fields {
1361 self.duplicate_fields.insert(field_id);
1362 }
1363
1364 buffer.try_append_variant(value.into(), metadata_builder)?;
1365 Ok(())
1366 }
1367
1368 pub fn with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, key: &str, value: T) -> Self {
1372 self.insert(key, value);
1373 self
1374 }
1375
1376 pub fn try_with_field<'m, 'd, T: Into<Variant<'m, 'd>>>(
1380 mut self,
1381 key: &str,
1382 value: T,
1383 ) -> Result<Self, ArrowError> {
1384 self.try_insert(key, value)?;
1385 Ok(self)
1386 }
1387
1388 pub fn with_validate_unique_fields(mut self, validate_unique_fields: bool) -> Self {
1393 self.validate_unique_fields = validate_unique_fields;
1394 self
1395 }
1396
1397 fn parent_state<'b>(&'b mut self, key: &'b str) -> (ParentState<'b>, bool) {
1399 let validate_unique_fields = self.validate_unique_fields;
1400
1401 let (buffer, metadata_builder) = self.parent_state.buffer_and_metadata_builder();
1402
1403 let state = ParentState::Object {
1404 buffer,
1405 metadata_builder,
1406 fields: &mut self.fields,
1407 field_name: key,
1408 parent_value_offset_base: self.parent_value_offset_base,
1409 };
1410 (state, validate_unique_fields)
1411 }
1412
1413 pub fn new_object<'b>(&'b mut self, key: &'b str) -> ObjectBuilder<'b> {
1417 let (parent_state, validate_unique_fields) = self.parent_state(key);
1418 ObjectBuilder::new(parent_state, validate_unique_fields)
1419 }
1420
1421 pub fn new_list<'b>(&'b mut self, key: &'b str) -> ListBuilder<'b> {
1425 let (parent_state, validate_unique_fields) = self.parent_state(key);
1426 ListBuilder::new(parent_state, validate_unique_fields)
1427 }
1428
1429 pub fn finish(mut self) -> Result<(), ArrowError> {
1431 let metadata_builder = self.parent_state.metadata_builder();
1432 if self.validate_unique_fields && !self.duplicate_fields.is_empty() {
1433 let mut names = self
1434 .duplicate_fields
1435 .iter()
1436 .map(|id| metadata_builder.field_name(*id as usize))
1437 .collect::<Vec<_>>();
1438
1439 names.sort_unstable();
1440
1441 let joined = names.join(", ");
1442 return Err(ArrowError::InvalidArgumentError(format!(
1443 "Duplicate field keys detected: [{joined}]",
1444 )));
1445 }
1446
1447 self.fields.sort_by(|&field_a_id, _, &field_b_id, _| {
1448 let field_a_name = metadata_builder.field_name(field_a_id as usize);
1449 let field_b_name = metadata_builder.field_name(field_b_id as usize);
1450 field_a_name.cmp(field_b_name)
1451 });
1452
1453 let max_id = self.fields.iter().map(|(i, _)| *i).max().unwrap_or(0);
1454 let id_size = int_size(max_id as usize);
1455
1456 let parent_buffer = self.parent_state.buffer();
1457 let current_offset = parent_buffer.offset();
1458 let data_size = current_offset - self.parent_value_offset_base;
1460 let offset_size = int_size(data_size);
1461
1462 let num_fields = self.fields.len();
1463 let is_large = num_fields > u8::MAX as usize;
1464
1465 let header_size = 1 + (if is_large { 4 } else { 1 }) + (num_fields * id_size as usize) + ((num_fields + 1) * offset_size as usize); let starting_offset = self.parent_value_offset_base;
1471
1472 let buffer = parent_buffer.inner_mut();
1474 buffer.splice(
1475 starting_offset..starting_offset,
1476 std::iter::repeat_n(0u8, header_size),
1477 );
1478
1479 let mut header_pos = starting_offset;
1481
1482 let header = object_header(is_large, id_size, offset_size);
1484
1485 header_pos = self
1486 .parent_state
1487 .buffer()
1488 .append_header_start_from_buf_pos(header_pos, header, is_large, num_fields);
1489
1490 header_pos = self
1491 .parent_state
1492 .buffer()
1493 .append_offset_array_start_from_buf_pos(
1494 header_pos,
1495 self.fields.keys().copied().map(|id| id as usize),
1496 None,
1497 id_size,
1498 );
1499
1500 self.parent_state
1501 .buffer()
1502 .append_offset_array_start_from_buf_pos(
1503 header_pos,
1504 self.fields.values().copied(),
1505 Some(data_size),
1506 offset_size,
1507 );
1508 self.parent_state.finish(starting_offset);
1509
1510 self.has_been_finished = true;
1512
1513 Ok(())
1514 }
1515}
1516
1517impl Drop for ObjectBuilder<'_> {
1522 fn drop(&mut self) {
1523 if !self.has_been_finished {
1525 self.parent_state
1526 .buffer()
1527 .inner_mut()
1528 .truncate(self.parent_value_offset_base);
1529
1530 self.parent_state
1531 .metadata_builder()
1532 .field_names
1533 .truncate(self.parent_metadata_offset_base);
1534 }
1535 }
1536}
1537
1538pub trait VariantBuilderExt {
1543 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>);
1544
1545 fn new_list(&mut self) -> ListBuilder<'_>;
1546
1547 fn new_object(&mut self) -> ObjectBuilder<'_>;
1548}
1549
1550impl VariantBuilderExt for ListBuilder<'_> {
1551 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1552 self.append_value(value);
1553 }
1554
1555 fn new_list(&mut self) -> ListBuilder<'_> {
1556 self.new_list()
1557 }
1558
1559 fn new_object(&mut self) -> ObjectBuilder<'_> {
1560 self.new_object()
1561 }
1562}
1563
1564impl VariantBuilderExt for VariantBuilder {
1565 fn append_value<'m, 'v>(&mut self, value: impl Into<Variant<'m, 'v>>) {
1566 self.append_value(value);
1567 }
1568
1569 fn new_list(&mut self) -> ListBuilder<'_> {
1570 self.new_list()
1571 }
1572
1573 fn new_object(&mut self) -> ObjectBuilder<'_> {
1574 self.new_object()
1575 }
1576}
1577
1578#[cfg(test)]
1579mod tests {
1580 use crate::VariantMetadata;
1581
1582 use super::*;
1583
1584 #[test]
1585 fn test_simple_usage() {
1586 {
1587 let mut builder = VariantBuilder::new();
1588 builder.append_value(());
1589 let (metadata, value) = builder.finish();
1590 let variant = Variant::try_new(&metadata, &value).unwrap();
1591 assert_eq!(variant, Variant::Null);
1592 }
1593
1594 {
1595 let mut builder = VariantBuilder::new();
1596 builder.append_value(true);
1597 let (metadata, value) = builder.finish();
1598 let variant = Variant::try_new(&metadata, &value).unwrap();
1599 assert_eq!(variant, Variant::BooleanTrue);
1600 }
1601
1602 {
1603 let mut builder = VariantBuilder::new();
1604 builder.append_value(false);
1605 let (metadata, value) = builder.finish();
1606 let variant = Variant::try_new(&metadata, &value).unwrap();
1607 assert_eq!(variant, Variant::BooleanFalse);
1608 }
1609
1610 {
1611 let mut builder = VariantBuilder::new();
1612 builder.append_value(42i8);
1613 let (metadata, value) = builder.finish();
1614 let variant = Variant::try_new(&metadata, &value).unwrap();
1615 assert_eq!(variant, Variant::Int8(42));
1616 }
1617
1618 {
1619 let mut builder = VariantBuilder::new();
1620 builder.append_value(1234i16);
1621 let (metadata, value) = builder.finish();
1622 let variant = Variant::try_new(&metadata, &value).unwrap();
1623 assert_eq!(variant, Variant::Int16(1234));
1624 }
1625
1626 {
1627 let mut builder = VariantBuilder::new();
1628 builder.append_value(123456i32);
1629 let (metadata, value) = builder.finish();
1630 let variant = Variant::try_new(&metadata, &value).unwrap();
1631 assert_eq!(variant, Variant::Int32(123456));
1632 }
1633
1634 {
1635 let mut builder = VariantBuilder::new();
1636 builder.append_value(123456789i64);
1637 let (metadata, value) = builder.finish();
1638 let variant = Variant::try_new(&metadata, &value).unwrap();
1639 assert_eq!(variant, Variant::Int64(123456789));
1640 }
1641
1642 {
1643 let mut builder = VariantBuilder::new();
1644 builder.append_value(1.5f32);
1645 let (metadata, value) = builder.finish();
1646 let variant = Variant::try_new(&metadata, &value).unwrap();
1647 assert_eq!(variant, Variant::Float(1.5));
1648 }
1649
1650 {
1651 let mut builder = VariantBuilder::new();
1652 builder.append_value(2.5f64);
1653 let (metadata, value) = builder.finish();
1654 let variant = Variant::try_new(&metadata, &value).unwrap();
1655 assert_eq!(variant, Variant::Double(2.5));
1656 }
1657
1658 {
1659 let mut builder = VariantBuilder::new();
1660 builder.append_value("hello");
1661 let (metadata, value) = builder.finish();
1662 let variant = Variant::try_new(&metadata, &value).unwrap();
1663 assert_eq!(variant, Variant::ShortString(ShortString("hello")));
1664 }
1665
1666 {
1667 let mut builder = VariantBuilder::new();
1668 let long_string = "This is a very long string that exceeds the short string limit of 63 bytes and should be encoded as a regular string type instead of a short string";
1669 builder.append_value(long_string);
1670 let (metadata, value) = builder.finish();
1671 let variant = Variant::try_new(&metadata, &value).unwrap();
1672 assert_eq!(variant, Variant::String(long_string));
1673 }
1674
1675 {
1676 let mut builder = VariantBuilder::new();
1677 let binary_data = b"binary data";
1678 builder.append_value(binary_data.as_slice());
1679 let (metadata, value) = builder.finish();
1680 let variant = Variant::try_new(&metadata, &value).unwrap();
1681 assert_eq!(variant, Variant::Binary(binary_data.as_slice()));
1682 }
1683 }
1684
1685 #[test]
1686 fn test_list() {
1687 let mut builder = VariantBuilder::new();
1688
1689 builder
1690 .new_list()
1691 .with_value(1i8)
1692 .with_value(2i8)
1693 .with_value("test")
1694 .finish();
1695
1696 let (metadata, value) = builder.finish();
1697 assert!(!metadata.is_empty());
1698 assert!(!value.is_empty());
1699
1700 let variant = Variant::try_new(&metadata, &value).unwrap();
1701
1702 match variant {
1703 Variant::List(list) => {
1704 let val0 = list.get(0).unwrap();
1705 assert_eq!(val0, Variant::Int8(1));
1706
1707 let val1 = list.get(1).unwrap();
1708 assert_eq!(val1, Variant::Int8(2));
1709
1710 let val2 = list.get(2).unwrap();
1711 assert_eq!(val2, Variant::ShortString(ShortString("test")));
1712 }
1713 _ => panic!("Expected an array variant, got: {variant:?}"),
1714 }
1715 }
1716
1717 #[test]
1718 fn test_object() {
1719 let mut builder = VariantBuilder::new();
1720
1721 builder
1722 .new_object()
1723 .with_field("name", "John")
1724 .with_field("age", 42i8)
1725 .finish()
1726 .unwrap();
1727
1728 let (metadata, value) = builder.finish();
1729 assert!(!metadata.is_empty());
1730 assert!(!value.is_empty());
1731 }
1732
1733 #[test]
1734 fn test_object_field_ordering() {
1735 let mut builder = VariantBuilder::new();
1736
1737 builder
1738 .new_object()
1739 .with_field("zebra", "stripes")
1740 .with_field("apple", "red")
1741 .with_field("banana", "yellow")
1742 .finish()
1743 .unwrap();
1744
1745 let (_, value) = builder.finish();
1746
1747 let header = value[0];
1748 assert_eq!(header & 0x03, VariantBasicType::Object as u8);
1749
1750 let field_count = value[1] as usize;
1751 assert_eq!(field_count, 3);
1752
1753 let field_ids: Vec<u8> = value[2..5].to_vec();
1755
1756 assert_eq!(field_ids, vec![1, 2, 0]);
1758 }
1759
1760 #[test]
1761 fn test_duplicate_fields_in_object() {
1762 let mut builder = VariantBuilder::new();
1763 builder
1764 .new_object()
1765 .with_field("name", "Ron Artest")
1766 .with_field("name", "Metta World Peace") .finish()
1768 .unwrap();
1769
1770 let (metadata, value) = builder.finish();
1771 let variant = Variant::try_new(&metadata, &value).unwrap();
1772
1773 let obj = variant.as_object().unwrap();
1774 assert_eq!(obj.len(), 1);
1775 assert_eq!(obj.field(0).unwrap(), Variant::from("Metta World Peace"));
1776
1777 assert_eq!(
1778 vec![("name", Variant::from("Metta World Peace"))],
1779 obj.iter().collect::<Vec<_>>()
1780 );
1781 }
1782
1783 #[test]
1784 fn test_nested_list() {
1785 let mut builder = VariantBuilder::new();
1786
1787 let mut outer_list_builder = builder.new_list();
1788
1789 outer_list_builder
1791 .new_list()
1792 .with_value("a")
1793 .with_value("b")
1794 .with_value("c")
1795 .with_value("d")
1796 .finish();
1797
1798 outer_list_builder.finish();
1799
1800 let (metadata, value) = builder.finish();
1801
1802 let variant = Variant::try_new(&metadata, &value).unwrap();
1803 let outer_list = variant.as_list().unwrap();
1804
1805 assert_eq!(outer_list.len(), 1);
1806
1807 let inner_variant = outer_list.get(0).unwrap();
1808 let inner_list = inner_variant.as_list().unwrap();
1809
1810 assert_eq!(
1811 vec![
1812 Variant::from("a"),
1813 Variant::from("b"),
1814 Variant::from("c"),
1815 Variant::from("d"),
1816 ],
1817 inner_list.iter().collect::<Vec<_>>()
1818 );
1819 }
1820
1821 #[test]
1822 fn test_super_nested_list() {
1823 let mut builder = VariantBuilder::new();
1828 {
1829 let mut list_builder1 = builder.new_list();
1830 {
1831 let mut list_builder2 = list_builder1.new_list();
1832 {
1833 let mut list_builder3 = list_builder2.new_list();
1834 {
1835 let mut list_builder4 = list_builder3.new_list();
1836 {
1837 let mut list_builder5 = list_builder4.new_list();
1838 list_builder5.append_value(1);
1839 list_builder5.finish();
1840 }
1841 list_builder4.finish();
1842 }
1843 list_builder3.finish();
1844 }
1845 list_builder2.finish();
1846 }
1847 list_builder1.finish();
1848 }
1849
1850 let (metadata, value) = builder.finish();
1851
1852 let variant = Variant::try_new(&metadata, &value).unwrap();
1853 let list1 = variant.as_list().unwrap();
1854 assert_eq!(list1.len(), 1);
1855
1856 let list2_variant = list1.get(0).unwrap();
1857 let list2 = list2_variant.as_list().unwrap();
1858 assert_eq!(list2.len(), 1);
1859
1860 let list3_variant = list2.get(0).unwrap();
1861 let list3 = list3_variant.as_list().unwrap();
1862 assert_eq!(list3.len(), 1);
1863
1864 let list4_variant = list3.get(0).unwrap();
1865 let list4 = list4_variant.as_list().unwrap();
1866 assert_eq!(list4.len(), 1);
1867
1868 let list5_variant = list4.get(0).unwrap();
1869 let list5 = list5_variant.as_list().unwrap();
1870 assert_eq!(list5.len(), 1);
1871
1872 assert_eq!(list5.len(), 1);
1873
1874 assert_eq!(list5.get(0).unwrap(), Variant::from(1));
1875 }
1876
1877 #[test]
1878 fn test_object_list() {
1879 let mut builder = VariantBuilder::new();
1880
1881 let mut list_builder = builder.new_list();
1882
1883 list_builder
1884 .new_object()
1885 .with_field("id", 1)
1886 .with_field("type", "Cauliflower")
1887 .finish()
1888 .unwrap();
1889
1890 list_builder
1891 .new_object()
1892 .with_field("id", 2)
1893 .with_field("type", "Beets")
1894 .finish()
1895 .unwrap();
1896
1897 list_builder.finish();
1898
1899 let (metadata, value) = builder.finish();
1900
1901 let variant = Variant::try_new(&metadata, &value).unwrap();
1902 let list = variant.as_list().unwrap();
1903
1904 assert_eq!(list.len(), 2);
1905
1906 let obj1_variant = list.get(0).unwrap();
1907 let obj1 = obj1_variant.as_object().unwrap();
1908
1909 assert_eq!(
1910 vec![
1911 ("id", Variant::from(1)),
1912 ("type", Variant::from("Cauliflower")),
1913 ],
1914 obj1.iter().collect::<Vec<_>>()
1915 );
1916
1917 let obj2_variant = list.get(1).unwrap();
1918 let obj2 = obj2_variant.as_object().unwrap();
1919
1920 assert_eq!(
1921 vec![("id", Variant::from(2)), ("type", Variant::from("Beets")),],
1922 obj2.iter().collect::<Vec<_>>()
1923 );
1924 }
1925
1926 #[test]
1927 fn test_object_list2() {
1928 let mut builder = VariantBuilder::new();
1929
1930 let mut list_builder = builder.new_list();
1931
1932 list_builder
1933 .new_object()
1934 .with_field("a", 1)
1935 .finish()
1936 .unwrap();
1937
1938 list_builder
1939 .new_object()
1940 .with_field("b", 2)
1941 .finish()
1942 .unwrap();
1943
1944 list_builder.finish();
1945
1946 let (metadata, value) = builder.finish();
1947
1948 let variant = Variant::try_new(&metadata, &value).unwrap();
1949 let list = variant.as_list().unwrap();
1950 assert_eq!(list.len(), 2);
1951
1952 let obj1_variant = list.get(0).unwrap();
1953 let obj1 = obj1_variant.as_object().unwrap();
1954 assert_eq!(
1955 vec![("a", Variant::from(1)),],
1956 obj1.iter().collect::<Vec<_>>()
1957 );
1958
1959 let obj2_variant = list.get(1).unwrap();
1960 let obj2 = obj2_variant.as_object().unwrap();
1961 assert_eq!(
1962 vec![("b", Variant::from(2)),],
1963 obj2.iter().collect::<Vec<_>>()
1964 );
1965 }
1966
1967 #[test]
1968 fn test_hetergenous_list() {
1969 let mut builder = VariantBuilder::new();
1980
1981 let mut list_builder = builder.new_list();
1982
1983 list_builder.append_value(1);
1984
1985 {
1986 let mut object_builder = list_builder.new_object();
1987 object_builder.insert("a", 1);
1988 let _ = object_builder.finish();
1989 }
1990
1991 list_builder.append_value(2);
1992
1993 {
1994 let mut object_builder = list_builder.new_object();
1995 object_builder.insert("b", 2);
1996 let _ = object_builder.finish();
1997 }
1998
1999 list_builder.append_value(3);
2000
2001 list_builder.finish();
2002
2003 let (metadata, value) = builder.finish();
2004
2005 let variant = Variant::try_new(&metadata, &value).unwrap();
2006 let list = variant.as_list().unwrap();
2007 assert_eq!(list.len(), 5);
2008 assert_eq!(list.get(0).unwrap(), Variant::from(1));
2009
2010 let obj1_variant = list.get(1).unwrap();
2011 let obj1 = obj1_variant.as_object().unwrap();
2012 assert_eq!(
2013 vec![("a", Variant::from(1)),],
2014 obj1.iter().collect::<Vec<_>>()
2015 );
2016
2017 assert_eq!(list.get(2).unwrap(), Variant::from(2));
2018
2019 let obj2_variant = list.get(3).unwrap();
2020 let obj2 = obj2_variant.as_object().unwrap();
2021 assert_eq!(
2022 vec![("b", Variant::from(2)),],
2023 obj2.iter().collect::<Vec<_>>()
2024 );
2025
2026 assert_eq!(list.get(4).unwrap(), Variant::from(3));
2027 }
2028
2029 #[test]
2030 fn test_nested_object() {
2031 let mut builder = VariantBuilder::new();
2041 {
2042 let mut outer_object_builder = builder.new_object();
2043 {
2044 let mut inner_object_builder = outer_object_builder.new_object("c");
2045 inner_object_builder.insert("b", "a");
2046 let _ = inner_object_builder.finish();
2047 }
2048
2049 let _ = outer_object_builder.finish();
2050 }
2051
2052 let (metadata, value) = builder.finish();
2053 let variant = Variant::try_new(&metadata, &value).unwrap();
2054 let outer_object = variant.as_object().unwrap();
2055
2056 assert_eq!(outer_object.len(), 1);
2057 assert_eq!(outer_object.field_name(0).unwrap(), "c");
2058
2059 let inner_object_variant = outer_object.field(0).unwrap();
2060 let inner_object = inner_object_variant.as_object().unwrap();
2061
2062 assert_eq!(inner_object.len(), 1);
2063 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2064 assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2065 }
2066
2067 #[test]
2068 fn test_nested_object_with_duplicate_field_names_per_object() {
2069 let mut builder = VariantBuilder::new();
2081 {
2082 let mut outer_object_builder = builder.new_object();
2083 {
2084 let mut inner_object_builder = outer_object_builder.new_object("c");
2085 inner_object_builder.insert("b", false);
2086 inner_object_builder.insert("c", "a");
2087
2088 let _ = inner_object_builder.finish();
2089 }
2090
2091 outer_object_builder.insert("b", false);
2092 let _ = outer_object_builder.finish();
2093 }
2094
2095 let (metadata, value) = builder.finish();
2096 let variant = Variant::try_new(&metadata, &value).unwrap();
2097 let outer_object = variant.as_object().unwrap();
2098
2099 assert_eq!(outer_object.len(), 2);
2100 assert_eq!(outer_object.field_name(0).unwrap(), "b");
2101
2102 let inner_object_variant = outer_object.field(1).unwrap();
2103 let inner_object = inner_object_variant.as_object().unwrap();
2104
2105 assert_eq!(inner_object.len(), 2);
2106 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2107 assert_eq!(inner_object.field(0).unwrap(), Variant::from(false));
2108 assert_eq!(inner_object.field_name(1).unwrap(), "c");
2109 assert_eq!(inner_object.field(1).unwrap(), Variant::from("a"));
2110 }
2111
2112 #[test]
2113 fn test_nested_object_with_lists() {
2114 let mut builder = VariantBuilder::new();
2124 {
2125 let mut outer_object_builder = builder.new_object();
2126 {
2127 let mut inner_object_builder = outer_object_builder.new_object("door 1");
2128
2129 inner_object_builder
2131 .new_list("items")
2132 .with_value("apple")
2133 .with_value(false)
2134 .finish();
2135
2136 let _ = inner_object_builder.finish();
2137 }
2138
2139 let _ = outer_object_builder.finish();
2140 }
2141
2142 let (metadata, value) = builder.finish();
2143 let variant = Variant::try_new(&metadata, &value).unwrap();
2144 let outer_object = variant.as_object().unwrap();
2145
2146 assert_eq!(outer_object.len(), 1);
2147 assert_eq!(outer_object.field_name(0).unwrap(), "door 1");
2148
2149 let inner_object_variant = outer_object.field(0).unwrap();
2150 let inner_object = inner_object_variant.as_object().unwrap();
2151
2152 assert_eq!(inner_object.len(), 1);
2153 assert_eq!(inner_object.field_name(0).unwrap(), "items");
2154
2155 let items_variant = inner_object.field(0).unwrap();
2156 let items_list = items_variant.as_list().unwrap();
2157
2158 assert_eq!(items_list.len(), 2);
2159 assert_eq!(items_list.get(0).unwrap(), Variant::from("apple"));
2160 assert_eq!(items_list.get(1).unwrap(), Variant::from(false));
2161 }
2162
2163 #[test]
2164 fn test_nested_object_with_heterogeneous_fields() {
2165 let mut builder = VariantBuilder::new();
2187 {
2188 let mut outer_object_builder = builder.new_object();
2189
2190 outer_object_builder.insert("a", false);
2191
2192 {
2193 let mut inner_object_builder = outer_object_builder.new_object("c");
2194 inner_object_builder.insert("b", "a");
2195
2196 {
2197 let mut inner_inner_object_builder = inner_object_builder.new_object("c");
2198 inner_inner_object_builder.insert("aa", "bb");
2199 let _ = inner_inner_object_builder.finish();
2200 }
2201
2202 {
2203 let mut inner_inner_object_builder = inner_object_builder.new_object("d");
2204 inner_inner_object_builder.insert("cc", "dd");
2205 let _ = inner_inner_object_builder.finish();
2206 }
2207 let _ = inner_object_builder.finish();
2208 }
2209
2210 outer_object_builder.insert("b", true);
2211
2212 {
2213 let mut inner_object_builder = outer_object_builder.new_object("d");
2214 inner_object_builder.insert("e", 1);
2215 {
2216 let mut inner_list_builder = inner_object_builder.new_list("f");
2217 inner_list_builder.append_value(1);
2218 inner_list_builder.append_value(true);
2219
2220 inner_list_builder.finish();
2221 }
2222
2223 {
2224 let mut inner_list_builder = inner_object_builder.new_list("g");
2225 inner_list_builder.append_value("tree");
2226 inner_list_builder.append_value(false);
2227
2228 inner_list_builder.finish();
2229 }
2230
2231 let _ = inner_object_builder.finish();
2232 }
2233
2234 let _ = outer_object_builder.finish();
2235 }
2236
2237 let (metadata, value) = builder.finish();
2238
2239 let variant = Variant::try_new(&metadata, &value).unwrap();
2262 let outer_object = variant.as_object().unwrap();
2263
2264 assert_eq!(outer_object.len(), 4);
2265
2266 assert_eq!(outer_object.field_name(0).unwrap(), "a");
2267 assert_eq!(outer_object.field(0).unwrap(), Variant::from(false));
2268
2269 assert_eq!(outer_object.field_name(2).unwrap(), "c");
2270
2271 let inner_object_variant = outer_object.field(2).unwrap();
2272 let inner_object = inner_object_variant.as_object().unwrap();
2273
2274 assert_eq!(inner_object.len(), 3);
2275 assert_eq!(inner_object.field_name(0).unwrap(), "b");
2276 assert_eq!(inner_object.field(0).unwrap(), Variant::from("a"));
2277
2278 let inner_iner_object_variant_c = inner_object.field(1).unwrap();
2279 let inner_inner_object_c = inner_iner_object_variant_c.as_object().unwrap();
2280 assert_eq!(inner_inner_object_c.len(), 1);
2281 assert_eq!(inner_inner_object_c.field_name(0).unwrap(), "aa");
2282 assert_eq!(inner_inner_object_c.field(0).unwrap(), Variant::from("bb"));
2283
2284 let inner_iner_object_variant_d = inner_object.field(2).unwrap();
2285 let inner_inner_object_d = inner_iner_object_variant_d.as_object().unwrap();
2286 assert_eq!(inner_inner_object_d.len(), 1);
2287 assert_eq!(inner_inner_object_d.field_name(0).unwrap(), "cc");
2288 assert_eq!(inner_inner_object_d.field(0).unwrap(), Variant::from("dd"));
2289
2290 assert_eq!(outer_object.field_name(1).unwrap(), "b");
2291 assert_eq!(outer_object.field(1).unwrap(), Variant::from(true));
2292
2293 let out_object_variant_d = outer_object.field(3).unwrap();
2294 let out_object_d = out_object_variant_d.as_object().unwrap();
2295 assert_eq!(out_object_d.len(), 3);
2296 assert_eq!("e", out_object_d.field_name(0).unwrap());
2297 assert_eq!(Variant::from(1), out_object_d.field(0).unwrap());
2298 assert_eq!("f", out_object_d.field_name(1).unwrap());
2299
2300 let first_inner_list_variant_f = out_object_d.field(1).unwrap();
2301 let first_inner_list_f = first_inner_list_variant_f.as_list().unwrap();
2302 assert_eq!(2, first_inner_list_f.len());
2303 assert_eq!(Variant::from(1), first_inner_list_f.get(0).unwrap());
2304 assert_eq!(Variant::from(true), first_inner_list_f.get(1).unwrap());
2305
2306 let second_inner_list_variant_g = out_object_d.field(2).unwrap();
2307 let second_inner_list_g = second_inner_list_variant_g.as_list().unwrap();
2308 assert_eq!(2, second_inner_list_g.len());
2309 assert_eq!(Variant::from("tree"), second_inner_list_g.get(0).unwrap());
2310 assert_eq!(Variant::from(false), second_inner_list_g.get(1).unwrap());
2311 }
2312
2313 #[test]
2317 fn test_nested_list_with_heterogeneous_fields_for_buffer_reuse() {
2318 let mut builder = VariantBuilder::new();
2319
2320 {
2321 let mut outer_list_builder = builder.new_list();
2322
2323 outer_list_builder.append_value("apple");
2324 outer_list_builder.append_value(false);
2325
2326 {
2327 let mut inner_list_builder = outer_list_builder.new_list();
2329
2330 {
2331 let mut inner_object_builder = inner_list_builder.new_object();
2332 inner_object_builder.insert("a", "b");
2333 inner_object_builder.insert("b", "c");
2334 let _ = inner_object_builder.finish();
2335 }
2336
2337 {
2338 let mut inner_object_builder = inner_list_builder.new_object();
2341 inner_object_builder.insert("c", "d");
2342 inner_object_builder.insert("d", "e");
2343 let _ = inner_object_builder.finish();
2344 }
2345
2346 inner_list_builder.finish();
2347 }
2348
2349 {
2350 let mut inner_list_builder = outer_list_builder.new_list();
2352
2353 {
2354 let mut double_inner_list_builder = inner_list_builder.new_list();
2355 double_inner_list_builder.append_value(1);
2356 double_inner_list_builder.append_value(true);
2357
2358 double_inner_list_builder.finish();
2359 }
2360
2361 {
2362 let mut double_inner_list_builder = inner_list_builder.new_list();
2363 double_inner_list_builder.append_value("tree");
2364 double_inner_list_builder.append_value(false);
2365
2366 double_inner_list_builder.finish();
2367 }
2368 inner_list_builder.finish();
2369 }
2370
2371 outer_list_builder.append_value(1);
2372
2373 outer_list_builder.finish();
2374 }
2375
2376 let (metadata, value) = builder.finish();
2377
2378 let variant = Variant::try_new(&metadata, &value).unwrap();
2379 let outer_list = variant.as_list().unwrap();
2380
2381 assert_eq!(5, outer_list.len());
2382
2383 assert_eq!(Variant::from("apple"), outer_list.get(0).unwrap());
2385 assert_eq!(Variant::from(false), outer_list.get(1).unwrap());
2386 assert_eq!(Variant::from(1), outer_list.get(4).unwrap());
2387
2388 let list1_variant = outer_list.get(2).unwrap();
2390 let list1 = list1_variant.as_list().unwrap();
2391 assert_eq!(2, list1.len());
2392
2393 let list1_obj1_variant = list1.get(0).unwrap();
2394 let list1_obj1 = list1_obj1_variant.as_object().unwrap();
2395 assert_eq!("a", list1_obj1.field_name(0).unwrap());
2396 assert_eq!(Variant::from("b"), list1_obj1.field(0).unwrap());
2397
2398 assert_eq!("b", list1_obj1.field_name(1).unwrap());
2399 assert_eq!(Variant::from("c"), list1_obj1.field(1).unwrap());
2400
2401 let list2_variant = outer_list.get(3).unwrap();
2403 let list2 = list2_variant.as_list().unwrap();
2404 assert_eq!(2, list2.len());
2405
2406 let list2_list1_variant = list2.get(0).unwrap();
2408 let list2_list1 = list2_list1_variant.as_list().unwrap();
2409 assert_eq!(2, list2_list1.len());
2410 assert_eq!(Variant::from(1), list2_list1.get(0).unwrap());
2411 assert_eq!(Variant::from(true), list2_list1.get(1).unwrap());
2412
2413 let list2_list2_variant = list2.get(1).unwrap();
2415 let list2_list2 = list2_list2_variant.as_list().unwrap();
2416 assert_eq!(2, list2_list2.len());
2417 assert_eq!(Variant::from("tree"), list2_list2.get(0).unwrap());
2418 assert_eq!(Variant::from(false), list2_list2.get(1).unwrap());
2419 }
2420
2421 #[test]
2422 fn test_object_without_unique_field_validation() {
2423 let mut builder = VariantBuilder::new();
2424
2425 let mut obj = builder.new_object();
2427 obj.insert("a", 1);
2428 obj.insert("a", 2);
2429 assert!(obj.finish().is_ok());
2430
2431 let mut outer_list = builder.new_list();
2433 let mut inner_list = outer_list.new_list();
2434 let mut nested_obj = inner_list.new_object();
2435 nested_obj.insert("x", 1);
2436 nested_obj.insert("x", 2);
2437 assert!(nested_obj.finish().is_ok());
2438 }
2439
2440 #[test]
2441 fn test_object_with_unique_field_validation() {
2442 let mut builder = VariantBuilder::new().with_validate_unique_fields(true);
2443
2444 let mut root_obj = builder.new_object();
2446 root_obj.insert("a", 1);
2447 root_obj.insert("b", 2);
2448 root_obj.insert("a", 3);
2449 root_obj.insert("b", 4);
2450
2451 let result = root_obj.finish();
2452 assert_eq!(
2453 result.unwrap_err().to_string(),
2454 "Invalid argument error: Duplicate field keys detected: [a, b]"
2455 );
2456
2457 let mut outer_list = builder.new_list();
2459 let mut inner_list = outer_list.new_list();
2460 let mut nested_obj = inner_list.new_object();
2461 nested_obj.insert("x", 1);
2462 nested_obj.insert("x", 2);
2463
2464 let nested_result = nested_obj.finish();
2465 assert_eq!(
2466 nested_result.unwrap_err().to_string(),
2467 "Invalid argument error: Duplicate field keys detected: [x]"
2468 );
2469
2470 inner_list.finish();
2471 outer_list.finish();
2472
2473 let mut list = builder.new_list();
2475 let mut valid_obj = list.new_object();
2476 valid_obj.insert("m", 1);
2477 valid_obj.insert("n", 2);
2478
2479 let valid_result = valid_obj.finish();
2480 assert!(valid_result.is_ok());
2481 }
2482
2483 #[test]
2484 fn test_sorted_dictionary() {
2485 let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"].into_iter());
2487
2488 let mut variant2 = {
2489 let mut builder = VariantBuilder::new();
2490
2491 builder.add_field_name("b");
2492 builder.add_field_name("c");
2493 builder.add_field_name("d");
2494
2495 builder
2496 };
2497
2498 assert_eq!(
2499 variant1.metadata_builder.field_names,
2500 variant2.metadata_builder.field_names
2501 );
2502
2503 assert!(variant1.metadata_builder.is_sorted);
2505 assert!(variant2.metadata_builder.is_sorted);
2506
2507 {
2508 variant2.add_field_name("a");
2510 assert!(!variant2.metadata_builder.is_sorted);
2511
2512 let (m, v) = variant2.finish();
2514 let res = Variant::try_new(&m, &v);
2515 assert!(res.is_err());
2516
2517 let header = VariantMetadata::try_new(&m).unwrap();
2519 assert!(!header.is_sorted());
2520 }
2521
2522 variant1.append_value(false);
2524
2525 let (m, v) = variant1.finish();
2526 let res = Variant::try_new(&m, &v);
2527 assert!(res.is_ok());
2528
2529 let header = VariantMetadata::try_new(&m).unwrap();
2530 assert!(header.is_sorted());
2531 }
2532
2533 #[test]
2534 fn test_object_sorted_dictionary() {
2535 let mut variant1 = VariantBuilder::new().with_field_names(["a", "b", "c"].into_iter());
2537 let mut obj = variant1.new_object();
2538
2539 obj.insert("c", true);
2540 obj.insert("a", false);
2541 obj.insert("b", ());
2542
2543 let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2545 assert_eq!(field_ids_by_insert_order, vec![2, 0, 1]);
2546
2547 obj.insert("d", 2);
2549 obj.finish().unwrap();
2550
2551 let (metadata, value) = variant1.finish();
2552 let variant = Variant::try_new(&metadata, &value).unwrap();
2553
2554 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2555 assert!(metadata.is_sorted());
2556
2557 let object = variant.as_object().unwrap();
2559 let field_names = object
2560 .iter()
2561 .map(|(field_name, _)| field_name)
2562 .collect::<Vec<_>>();
2563
2564 assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2565 }
2566
2567 #[test]
2568 fn test_object_not_sorted_dictionary() {
2569 let mut variant1 = VariantBuilder::new().with_field_names(["b", "c", "d"].into_iter());
2571 let mut obj = variant1.new_object();
2572
2573 obj.insert("c", true);
2574 obj.insert("d", false);
2575 obj.insert("b", ());
2576
2577 let field_ids_by_insert_order = obj.fields.iter().map(|(&id, _)| id).collect::<Vec<_>>();
2579 assert_eq!(field_ids_by_insert_order, vec![1, 2, 0]);
2580
2581 obj.insert("a", 2);
2583 obj.finish().unwrap();
2584
2585 let (metadata, value) = variant1.finish();
2586 let variant = Variant::try_new(&metadata, &value).unwrap();
2587
2588 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2589 assert!(!metadata.is_sorted());
2590
2591 let object = variant.as_object().unwrap();
2593 let field_names = object
2594 .iter()
2595 .map(|(field_name, _)| field_name)
2596 .collect::<Vec<_>>();
2597
2598 assert_eq!(field_names, vec!["a", "b", "c", "d"]);
2599 }
2600
2601 #[test]
2602 fn test_building_sorted_dictionary() {
2603 let mut builder = VariantBuilder::new();
2604 assert!(!builder.metadata_builder.is_sorted);
2605 assert_eq!(builder.metadata_builder.num_field_names(), 0);
2606
2607 builder.add_field_name("a");
2608
2609 assert!(builder.metadata_builder.is_sorted);
2610 assert_eq!(builder.metadata_builder.num_field_names(), 1);
2611
2612 let builder = builder.with_field_names(["b", "c", "d"].into_iter());
2613
2614 assert!(builder.metadata_builder.is_sorted);
2615 assert_eq!(builder.metadata_builder.num_field_names(), 4);
2616
2617 let builder = builder.with_field_names(["z", "y"].into_iter());
2618 assert!(!builder.metadata_builder.is_sorted);
2619 assert_eq!(builder.metadata_builder.num_field_names(), 6);
2620 }
2621
2622 #[test]
2623 fn test_metadata_builder_from_iter() {
2624 let metadata = MetadataBuilder::from_iter(vec!["apple", "banana", "cherry"]);
2625 assert_eq!(metadata.num_field_names(), 3);
2626 assert_eq!(metadata.field_name(0), "apple");
2627 assert_eq!(metadata.field_name(1), "banana");
2628 assert_eq!(metadata.field_name(2), "cherry");
2629 assert!(metadata.is_sorted);
2630
2631 let metadata = MetadataBuilder::from_iter(["zebra", "apple", "banana"]);
2632 assert_eq!(metadata.num_field_names(), 3);
2633 assert_eq!(metadata.field_name(0), "zebra");
2634 assert_eq!(metadata.field_name(1), "apple");
2635 assert_eq!(metadata.field_name(2), "banana");
2636 assert!(!metadata.is_sorted);
2637
2638 let metadata = MetadataBuilder::from_iter(Vec::<&str>::new());
2639 assert_eq!(metadata.num_field_names(), 0);
2640 assert!(!metadata.is_sorted);
2641 }
2642
2643 #[test]
2644 fn test_metadata_builder_extend() {
2645 let mut metadata = MetadataBuilder::default();
2646 assert_eq!(metadata.num_field_names(), 0);
2647 assert!(!metadata.is_sorted);
2648
2649 metadata.extend(["apple", "cherry"]);
2650 assert_eq!(metadata.num_field_names(), 2);
2651 assert_eq!(metadata.field_name(0), "apple");
2652 assert_eq!(metadata.field_name(1), "cherry");
2653 assert!(metadata.is_sorted);
2654
2655 metadata.extend(vec!["dinosaur", "monkey"]);
2657 assert_eq!(metadata.num_field_names(), 4);
2658 assert_eq!(metadata.field_name(2), "dinosaur");
2659 assert_eq!(metadata.field_name(3), "monkey");
2660 assert!(metadata.is_sorted);
2661
2662 let initial_count = metadata.num_field_names();
2664 metadata.extend(["apple", "monkey"]);
2665 assert_eq!(metadata.num_field_names(), initial_count); }
2667
2668 #[test]
2669 fn test_metadata_builder_extend_sort_order() {
2670 let mut metadata = MetadataBuilder::default();
2671
2672 metadata.extend(["middle"]);
2673 assert!(metadata.is_sorted);
2674
2675 metadata.extend(["zebra"]);
2676 assert!(metadata.is_sorted);
2677
2678 metadata.extend(["apple"]);
2680 assert!(!metadata.is_sorted);
2681 }
2682
2683 #[test]
2684 fn test_metadata_builder_from_iter_with_string_types() {
2685 let metadata = MetadataBuilder::from_iter(["a", "b", "c"]);
2687 assert_eq!(metadata.num_field_names(), 3);
2688
2689 let metadata =
2691 MetadataBuilder::from_iter(vec!["a".to_string(), "b".to_string(), "c".to_string()]);
2692 assert_eq!(metadata.num_field_names(), 3);
2693
2694 let field_names: Vec<Box<str>> = vec!["a".into(), "b".into(), "c".into()];
2696 let metadata = MetadataBuilder::from_iter(field_names);
2697 assert_eq!(metadata.num_field_names(), 3);
2698 }
2699
2700 #[test]
2702 fn test_with_existing_buffers_nested() {
2703 let mut builder = VariantBuilder::new();
2704 append_test_list(&mut builder);
2705 let (m1, v1) = builder.finish();
2706 let variant1 = Variant::new(&m1, &v1);
2707
2708 let mut builder = VariantBuilder::new();
2709 append_test_object(&mut builder);
2710 let (m2, v2) = builder.finish();
2711 let variant2 = Variant::new(&m2, &v2);
2712
2713 let mut builder = VariantBuilder::new();
2714 builder.append_value("This is a string");
2715 let (m3, v3) = builder.finish();
2716 let variant3 = Variant::new(&m3, &v3);
2717
2718 let mut builder = VariantBuilder::new();
2720 append_test_list(&mut builder);
2721 let (metadata, value) = builder.finish();
2722 let (meta1_offset, meta1_end) = (0, metadata.len());
2723 let (value1_offset, value1_end) = (0, value.len());
2724
2725 let mut builder = VariantBuilder::new_with_buffers(metadata, value);
2727 append_test_object(&mut builder);
2728 let (metadata, value) = builder.finish();
2729 let (meta2_offset, meta2_end) = (meta1_end, metadata.len());
2730 let (value2_offset, value2_end) = (value1_end, value.len());
2731
2732 let mut builder = VariantBuilder::new_with_buffers(metadata, value);
2734 builder.append_value("This is a string");
2735 let (metadata, value) = builder.finish();
2736 let (meta3_offset, meta3_end) = (meta2_end, metadata.len());
2737 let (value3_offset, value3_end) = (value2_end, value.len());
2738
2739 let roundtrip1 = Variant::new(
2741 &metadata[meta1_offset..meta1_end],
2742 &value[value1_offset..value1_end],
2743 );
2744 assert_eq!(roundtrip1, variant1,);
2745
2746 let roundtrip2 = Variant::new(
2747 &metadata[meta2_offset..meta2_end],
2748 &value[value2_offset..value2_end],
2749 );
2750 assert_eq!(roundtrip2, variant2,);
2751
2752 let roundtrip3 = Variant::new(
2753 &metadata[meta3_offset..meta3_end],
2754 &value[value3_offset..value3_end],
2755 );
2756 assert_eq!(roundtrip3, variant3);
2757 }
2758
2759 fn append_test_list(builder: &mut VariantBuilder) {
2761 builder
2762 .new_list()
2763 .with_value(1234)
2764 .with_value("a string value")
2765 .finish();
2766 }
2767
2768 fn append_test_object(builder: &mut VariantBuilder) {
2770 let mut obj = builder.new_object();
2771 obj.insert("a", true);
2772 obj.finish().unwrap();
2773 }
2774
2775 #[test]
2776 fn test_variant_builder_to_list_builder_no_finish() {
2777 let mut builder = VariantBuilder::new();
2779 let mut list_builder = builder.new_list();
2780 list_builder.append_value("hi");
2781 drop(list_builder);
2782
2783 builder.append_value(42i8);
2784
2785 let (metadata, value) = builder.finish();
2787 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2788 assert!(metadata.is_empty());
2789
2790 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2791 assert_eq!(variant, Variant::Int8(42));
2792 }
2793
2794 #[test]
2795 fn test_variant_builder_to_object_builder_no_finish() {
2796 let mut builder = VariantBuilder::new();
2798 let mut object_builder = builder.new_object();
2799 object_builder.insert("name", "unknown");
2800 drop(object_builder);
2801
2802 builder.append_value(42i8);
2803
2804 let (metadata, value) = builder.finish();
2806 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2807 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2810 assert_eq!(variant, Variant::Int8(42));
2811 }
2812
2813 #[test]
2814 fn test_list_builder_to_list_builder_inner_no_finish() {
2815 let mut builder = VariantBuilder::new();
2816 let mut list_builder = builder.new_list();
2817 list_builder.append_value(1i8);
2818
2819 let mut nested_list_builder = list_builder.new_list();
2821 nested_list_builder.append_value("hi");
2822 drop(nested_list_builder);
2823
2824 list_builder.append_value(2i8);
2825
2826 list_builder.finish();
2828 let (metadata, value) = builder.finish();
2829 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2830 assert!(metadata.is_empty());
2831
2832 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2833 let list = variant.as_list().unwrap();
2834 assert_eq!(list.len(), 2);
2835 assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
2836 assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
2837 }
2838
2839 #[test]
2840 fn test_list_builder_to_list_builder_outer_no_finish() {
2841 let mut builder = VariantBuilder::new();
2842 let mut list_builder = builder.new_list();
2843 list_builder.append_value(1i8);
2844
2845 let mut nested_list_builder = list_builder.new_list();
2847 nested_list_builder.append_value("hi");
2848 nested_list_builder.finish();
2849
2850 drop(list_builder);
2852
2853 builder.append_value(2i8);
2854
2855 let (metadata, value) = builder.finish();
2857 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2858 assert!(metadata.is_empty());
2859
2860 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2861 assert_eq!(variant, Variant::Int8(2));
2862 }
2863
2864 #[test]
2865 fn test_list_builder_to_object_builder_inner_no_finish() {
2866 let mut builder = VariantBuilder::new();
2867 let mut list_builder = builder.new_list();
2868 list_builder.append_value(1i8);
2869
2870 let mut nested_object_builder = list_builder.new_object();
2872 nested_object_builder.insert("name", "unknown");
2873 drop(nested_object_builder);
2874
2875 list_builder.append_value(2i8);
2876
2877 list_builder.finish();
2879 let (metadata, value) = builder.finish();
2880 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2881 assert!(metadata.is_empty());
2882
2883 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2884 let list = variant.as_list().unwrap();
2885 assert_eq!(list.len(), 2);
2886 assert_eq!(list.get(0).unwrap(), Variant::Int8(1));
2887 assert_eq!(list.get(1).unwrap(), Variant::Int8(2));
2888 }
2889
2890 #[test]
2891 fn test_list_builder_to_object_builder_outer_no_finish() {
2892 let mut builder = VariantBuilder::new();
2893 let mut list_builder = builder.new_list();
2894 list_builder.append_value(1i8);
2895
2896 let mut nested_object_builder = list_builder.new_object();
2898 nested_object_builder.insert("name", "unknown");
2899 nested_object_builder.finish().unwrap();
2900
2901 drop(list_builder);
2903
2904 builder.append_value(2i8);
2905
2906 let (metadata, value) = builder.finish();
2908 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2909 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2912 assert_eq!(variant, Variant::Int8(2));
2913 }
2914
2915 #[test]
2916 fn test_object_builder_to_list_builder_inner_no_finish() {
2917 let mut builder = VariantBuilder::new();
2918 let mut object_builder = builder.new_object();
2919 object_builder.insert("first", 1i8);
2920
2921 let mut nested_list_builder = object_builder.new_list("nested");
2923 nested_list_builder.append_value("hi");
2924 drop(nested_list_builder);
2925
2926 object_builder.insert("second", 2i8);
2927
2928 object_builder.finish().unwrap();
2930 let (metadata, value) = builder.finish();
2931 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2932 assert_eq!(metadata.len(), 1);
2933 assert_eq!(&metadata[0], "second");
2934
2935 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2936 let obj = variant.as_object().unwrap();
2937 assert_eq!(obj.len(), 1);
2938 assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
2939 }
2940
2941 #[test]
2942 fn test_object_builder_to_list_builder_outer_no_finish() {
2943 let mut builder = VariantBuilder::new();
2944 let mut object_builder = builder.new_object();
2945 object_builder.insert("first", 1i8);
2946
2947 let mut nested_list_builder = object_builder.new_list("nested");
2949 nested_list_builder.append_value("hi");
2950 nested_list_builder.finish();
2951
2952 drop(object_builder);
2954
2955 builder.append_value(2i8);
2956
2957 let (metadata, value) = builder.finish();
2959 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2960 assert!(metadata.is_empty()); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2963 assert_eq!(variant, Variant::Int8(2));
2964 }
2965
2966 #[test]
2967 fn test_object_builder_to_object_builder_inner_no_finish() {
2968 let mut builder = VariantBuilder::new();
2969 let mut object_builder = builder.new_object();
2970 object_builder.insert("first", 1i8);
2971
2972 let mut nested_object_builder = object_builder.new_object("nested");
2974 nested_object_builder.insert("name", "unknown");
2975 drop(nested_object_builder);
2976
2977 object_builder.insert("second", 2i8);
2978
2979 object_builder.finish().unwrap();
2981 let (metadata, value) = builder.finish();
2982 let metadata = VariantMetadata::try_new(&metadata).unwrap();
2983 assert_eq!(metadata.len(), 1); assert_eq!(&metadata[0], "second");
2985
2986 let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
2987 let obj = variant.as_object().unwrap();
2988 assert_eq!(obj.len(), 1);
2989 assert_eq!(obj.get("second"), Some(Variant::Int8(2)));
2990 }
2991
2992 #[test]
2993 fn test_object_builder_to_object_builder_outer_no_finish() {
2994 let mut builder = VariantBuilder::new();
2995 let mut object_builder = builder.new_object();
2996 object_builder.insert("first", 1i8);
2997
2998 let mut nested_object_builder = object_builder.new_object("nested");
3000 nested_object_builder.insert("name", "unknown");
3001 nested_object_builder.finish().unwrap();
3002
3003 drop(object_builder);
3005
3006 builder.append_value(2i8);
3007
3008 let (metadata, value) = builder.finish();
3010 let metadata = VariantMetadata::try_new(&metadata).unwrap();
3011 assert_eq!(metadata.len(), 0); let variant = Variant::try_new_with_metadata(metadata, &value).unwrap();
3014 assert_eq!(variant, Variant::Int8(2));
3015 }
3016
3017 #[test]
3019 fn test_append_object() {
3020 let (m1, v1) = make_object();
3021 let variant = Variant::new(&m1, &v1);
3022
3023 let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3024
3025 builder.append_value(variant.clone());
3026
3027 let (metadata, value) = builder.finish();
3028 assert_eq!(variant, Variant::new(&metadata, &value));
3029 }
3030
3031 fn make_object() -> (Vec<u8>, Vec<u8>) {
3033 let mut builder = VariantBuilder::new();
3034
3035 let mut obj = builder.new_object();
3036
3037 obj.insert("b", true);
3038 obj.insert("a", false);
3039 obj.finish().unwrap();
3040 builder.finish()
3041 }
3042
3043 #[test]
3044 fn test_append_nested_object() {
3045 let (m1, v1) = make_nested_object();
3046 let variant = Variant::new(&m1, &v1);
3047
3048 let mut builder = VariantBuilder::new().with_metadata(VariantMetadata::new(&m1));
3050 builder.append_value(variant.clone());
3051
3052 let (metadata, value) = builder.finish();
3053 let result_variant = Variant::new(&metadata, &value);
3054
3055 assert_eq!(variant, result_variant);
3056 }
3057
3058 fn make_nested_object() -> (Vec<u8>, Vec<u8>) {
3060 let mut builder = VariantBuilder::new();
3061
3062 {
3063 let mut outer_obj = builder.new_object();
3064
3065 {
3066 let mut inner_obj = outer_obj.new_object("b");
3067 inner_obj.insert("a", "inner_value");
3068 inner_obj.finish().unwrap();
3069 }
3070
3071 outer_obj.finish().unwrap();
3072 }
3073
3074 builder.finish()
3075 }
3076
3077 #[test]
3078 fn test_append_list() {
3079 let (m1, v1) = make_list();
3080 let variant = Variant::new(&m1, &v1);
3081 let mut builder = VariantBuilder::new();
3082 builder.append_value(variant.clone());
3083 let (metadata, value) = builder.finish();
3084 assert_eq!(variant, Variant::new(&metadata, &value));
3085 }
3086
3087 fn make_list() -> (Vec<u8>, Vec<u8>) {
3089 let mut builder = VariantBuilder::new();
3090
3091 builder
3092 .new_list()
3093 .with_value(1234)
3094 .with_value("a string value")
3095 .finish();
3096
3097 builder.finish()
3098 }
3099
3100 #[test]
3101 fn test_append_nested_list() {
3102 let (m1, v1) = make_nested_list();
3103 let variant = Variant::new(&m1, &v1);
3104 let mut builder = VariantBuilder::new();
3105 builder.append_value(variant.clone());
3106 let (metadata, value) = builder.finish();
3107 assert_eq!(variant, Variant::new(&metadata, &value));
3108 }
3109
3110 fn make_nested_list() -> (Vec<u8>, Vec<u8>) {
3111 let mut builder = VariantBuilder::new();
3112 let mut list = builder.new_list();
3113
3114 list.new_list()
3116 .with_value("the dog licked the oil")
3117 .with_value(4.3)
3118 .finish();
3119
3120 list.finish();
3121
3122 builder.finish()
3123 }
3124}