1use std::any::Any;
2use std::sync::Arc;
3
4use arrow_array::builder::{ArrayBuilder, ListBuilder};
5use arrow_array::ArrayRef;
6
7use crate::traits::{ArrowBuilder, ToArrow};
8
9pub struct ArrowListBuilder<T: ToArrow<Item = T>> {
10 builder: ListBuilder<T::Builder>,
11}
12
13impl<T: ToArrow<Item = T>> ArrowBuilder<Vec<T>> for ArrowListBuilder<T>
14where
15 T: 'static,
16{
17 fn new_with_capacity(capacity: usize) -> Self {
18 Self {
19 builder: ListBuilder::<T::Builder>::with_capacity(
20 T::Builder::new_with_capacity(capacity),
21 capacity,
22 ),
23 }
24 }
25
26 fn append_value(&mut self, value: Vec<T>) {
27 let values = self.builder.values();
28 for v in value {
29 values.append_value(v);
30 }
31 self.builder.append(true);
32 }
33
34 fn append_option(&mut self, value: Option<Vec<T>>) {
35 match value {
36 Some(vs) => self.append_value(vs),
37 None => self.builder.append(false),
38 }
39 }
40}
41
42impl<T: ToArrow<Item = T>> ArrayBuilder for ArrowListBuilder<T>
43where
44 T: 'static,
45{
46 fn len(&self) -> usize {
47 self.builder.len()
48 }
49
50 fn finish(&mut self) -> ArrayRef {
51 Arc::new(self.builder.finish())
52 }
53
54 fn finish_cloned(&self) -> ArrayRef {
55 Arc::new(self.builder.finish_cloned())
56 }
57
58 fn as_any(&self) -> &dyn Any {
59 self
60 }
61
62 fn as_any_mut(&mut self) -> &mut dyn Any {
63 self
64 }
65
66 fn into_box_any(self: Box<Self>) -> Box<dyn Any> {
67 self
68 }
69}