prost_arrow/
lists.rs

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}