serde_arrow/internal/
array_builder.rs

1use serde::Serialize;
2
3use marrow::array::Array;
4
5use crate::internal::{
6    error::Result, schema::SerdeArrowSchema, serialization::OuterSequenceBuilder,
7};
8
9/// Construct arrays by pushing individual records
10///
11/// It can be constructed via
12///
13/// - [`ArrayBuilder::new`]
14/// - [`ArrayBuilder::from_marrow`]
15#[cfg_attr(has_arrow, doc = r"- [`ArrayBuilder::from_arrow`]")]
16#[cfg_attr(has_arrow2, doc = r"- [`ArrayBuilder::from_arrow2`]")]
17///
18/// It supports array construction via
19/// - [`ArrayBuilder::to_marrow`]
20#[cfg_attr(has_arrow, doc = r"- [`ArrayBuilder::to_record_batch`]")]
21#[cfg_attr(has_arrow, doc = r"- [`ArrayBuilder::to_arrow`]")]
22#[cfg_attr(has_arrow2, doc = r"- [`ArrayBuilder::to_arrow2`]")]
23///
24/// Usage:
25///
26/// ```rust
27/// # #[cfg(has_arrow)]
28/// # fn main() -> serde_arrow::_impl::PanicOnError<()> {
29/// # use serde_arrow::_impl::docs::defs::{Record, example_records};
30/// # use serde_arrow::schema::{TracingOptions, SchemaLike};
31/// # use serde::Serialize;
32/// # let items = example_records();
33/// # let item = items[0].clone();
34/// # let fields = Vec::<serde_arrow::_impl::arrow::datatypes::FieldRef>::from_type::<Record>(TracingOptions::default())?;
35/// use serde_arrow::ArrayBuilder;
36/// let mut builder = ArrayBuilder::from_arrow(&fields)?;
37///
38/// // push multiple items
39/// builder.extend(&items)?;
40///
41/// // push a single items
42/// builder.push(&item)?;
43///
44/// // build the arrays
45/// let arrays = builder.to_arrow()?;
46/// #
47/// # Ok(()) }
48/// # #[cfg(not(has_arrow))]
49/// # fn main() {}
50/// ```
51pub struct ArrayBuilder {
52    pub(crate) builder: OuterSequenceBuilder,
53    #[allow(unused)]
54    pub(crate) schema: SerdeArrowSchema,
55}
56
57impl ArrayBuilder {
58    /// Construct an array builder from an [`SerdeArrowSchema`]
59    pub fn new(schema: SerdeArrowSchema) -> Result<Self> {
60        Ok(Self {
61            builder: OuterSequenceBuilder::new(&schema)?,
62            schema,
63        })
64    }
65}
66
67impl std::fmt::Debug for ArrayBuilder {
68    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69        write!(f, "ArrayBuilder {{ .. }}")
70    }
71}
72
73impl ArrayBuilder {
74    /// Add a single record to the arrays
75    ///
76    pub fn push<T: Serialize>(&mut self, item: T) -> Result<()> {
77        self.builder.push(item)
78    }
79
80    /// Add multiple records to the arrays
81    ///
82    pub fn extend<T: Serialize>(&mut self, items: T) -> Result<()> {
83        self.builder.extend(items)
84    }
85
86    pub(crate) fn build_arrays(&mut self) -> Result<Vec<Array>> {
87        let mut arrays = Vec::new();
88        for field in self.builder.take_records()? {
89            arrays.push(field.into_array()?);
90        }
91        Ok(arrays)
92    }
93}
94
95impl std::convert::AsRef<ArrayBuilder> for ArrayBuilder {
96    fn as_ref(&self) -> &ArrayBuilder {
97        self
98    }
99}
100
101impl std::convert::AsMut<ArrayBuilder> for ArrayBuilder {
102    fn as_mut(&mut self) -> &mut ArrayBuilder {
103        self
104    }
105}
106
107#[allow(unused)]
108const _: () = {
109    trait AssertSendSync: Send + Sync {}
110    impl AssertSendSync for ArrayBuilder {}
111};