serde_arrow 0.14.0

Convert sequences of Rust objects to Arrow arrays and back again
Documentation
use std::collections::{BTreeMap, HashMap};

use marrow::{
    array::{Array, BooleanArray},
    datatypes::FieldMeta,
};
use serde::{Serialize, Serializer};

use crate::internal::{
    error::{set_default, try_, Context, ContextSupport, Result},
    serialization::utils::impl_serializer,
    utils::array_ext::{reserve_bits, set_bit_buffer, set_validity, set_validity_default},
};

use super::array_builder::ArrayBuilder;

#[derive(Debug, Clone)]
pub struct BoolBuilder {
    pub name: String,
    array: BooleanArray,
    metadata: HashMap<String, String>,
}

impl BoolBuilder {
    pub fn new(name: String, is_nullable: bool, metadata: HashMap<String, String>) -> Self {
        Self {
            name,
            array: BooleanArray {
                len: 0,
                validity: is_nullable.then(Vec::new),
                values: Vec::new(),
            },
            metadata,
        }
    }

    pub fn take(&mut self) -> ArrayBuilder {
        ArrayBuilder::Bool(Self {
            name: self.name.clone(),
            metadata: self.metadata.clone(),
            array: BooleanArray {
                len: std::mem::take(&mut self.array.len),
                validity: self.array.validity.as_mut().map(std::mem::take),
                values: std::mem::take(&mut self.array.values),
            },
        })
    }

    pub fn is_nullable(&self) -> bool {
        self.array.validity.is_some()
    }

    #[inline]
    pub fn into_array_and_field_meta(self) -> Result<(Array, FieldMeta)> {
        let meta = FieldMeta {
            name: self.name,
            nullable: self.array.validity.is_some(),
            metadata: self.metadata,
        };
        let array = Array::Boolean(self.array);
        Ok((array, meta))
    }

    pub fn reserve(&mut self, additional: usize) {
        if let Some(validity) = &mut self.array.validity {
            reserve_bits(validity, self.array.len, additional);
        }
        reserve_bits(&mut self.array.values, self.array.len, additional);
    }

    pub fn serialize_default_value(&mut self) -> Result<()> {
        try_(|| {
            set_validity_default(self.array.validity.as_mut(), self.array.len);
            set_bit_buffer(&mut self.array.values, self.array.len, false);
            self.array.len += 1;
            Ok(())
        })
        .ctx(self)
    }

    pub fn serialize_value<V: Serialize>(&mut self, value: V) -> Result<()> {
        value.serialize(&mut *self).ctx(self)
    }
}

impl Context for BoolBuilder {
    fn annotate(&self, annotations: &mut BTreeMap<String, String>) {
        set_default(annotations, "field", &self.name);
        set_default(annotations, "data_type", "Boolean");
    }
}

impl<'a> Serializer for &'a mut BoolBuilder {
    impl_serializer!(
        'a, BoolBuilder;
        override serialize_none,
        override serialize_bool,
    );

    fn serialize_none(self) -> Result<()> {
        set_validity(self.array.validity.as_mut(), self.array.len, false)?;
        set_bit_buffer(&mut self.array.values, self.array.len, false);
        self.array.len += 1;
        Ok(())
    }

    fn serialize_bool(self, v: bool) -> Result<()> {
        set_validity(self.array.validity.as_mut(), self.array.len, true)?;
        set_bit_buffer(&mut self.array.values, self.array.len, v);
        self.array.len += 1;
        Ok(())
    }
}