use serde::Serialize;
use marrow::{
array::Array,
datatypes::{Field, FieldMeta},
};
use crate::{
internal::{error::Result, schema::SerdeArrowSchema, serialization::StructBuilder},
Serializer,
};
#[cfg_attr(has_arrow, doc = r"- [`ArrayBuilder::from_arrow`]")]
#[cfg_attr(has_arrow2, doc = r"- [`ArrayBuilder::from_arrow2`]")]
#[cfg_attr(has_arrow, doc = r"- [`ArrayBuilder::to_record_batch`]")]
#[cfg_attr(has_arrow, doc = r"- [`ArrayBuilder::to_arrow`]")]
#[cfg_attr(has_arrow2, doc = r"- [`ArrayBuilder::to_arrow2`]")]
pub struct ArrayBuilder {
pub(crate) builder: StructBuilder,
}
impl ArrayBuilder {
pub fn new(schema: SerdeArrowSchema) -> Result<Self> {
Self::from_marrow_vec(schema.fields)
}
pub(crate) fn from_marrow_vec(fields: Vec<Field>) -> Result<Self> {
Ok(Self {
builder: StructBuilder::from_fields(fields)?,
})
}
pub fn reserve(&mut self, additional: usize) {
self.builder.reserve(additional);
}
}
impl std::fmt::Debug for ArrayBuilder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "ArrayBuilder {{ .. }}")
}
}
impl ArrayBuilder {
pub fn push<T: Serialize>(&mut self, item: T) -> Result<()> {
self.builder.serialize_value(item)
}
pub fn extend<T: Serialize>(&mut self, items: T) -> Result<()> {
items.serialize(Serializer::new(self))?;
Ok(())
}
pub(crate) fn take(&mut self) -> Self {
Self {
builder: self.builder.take_self(),
}
}
#[inline]
pub(crate) fn into_arrays_and_field_metas(self) -> Result<(Vec<Array>, Vec<FieldMeta>)> {
let mut arrays = Vec::with_capacity(self.builder.num_fields());
let mut metas = Vec::with_capacity(self.builder.num_fields());
for builder in self.builder.fields {
let (array, meta) = builder.into_array_and_field_meta()?;
arrays.push(array);
metas.push(meta);
}
Ok((arrays, metas))
}
}
impl std::convert::AsRef<ArrayBuilder> for ArrayBuilder {
fn as_ref(&self) -> &ArrayBuilder {
self
}
}
impl std::convert::AsMut<ArrayBuilder> for ArrayBuilder {
fn as_mut(&mut self) -> &mut ArrayBuilder {
self
}
}
#[allow(unused)]
const _: () = {
trait AssertSendSync: Send + Sync {}
impl AssertSendSync for ArrayBuilder {}
};