vortex_bytebool/
serde.rs

1use vortex_array::serde::ArrayParts;
2use vortex_array::validity::Validity;
3use vortex_array::vtable::SerdeVTable;
4use vortex_array::{
5    Array, ArrayBufferVisitor, ArrayChildVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl,
6    EmptyMetadata,
7};
8use vortex_dtype::DType;
9use vortex_error::{VortexResult, vortex_bail};
10
11use crate::{ByteBoolArray, ByteBoolEncoding};
12
13impl ArrayVisitorImpl<EmptyMetadata> for ByteBoolArray {
14    fn _buffers(&self, visitor: &mut dyn ArrayBufferVisitor) {
15        visitor.visit_buffer(self.buffer());
16    }
17
18    fn _children(&self, visitor: &mut dyn ArrayChildVisitor) {
19        visitor.visit_validity(self.validity(), self.len());
20    }
21
22    fn _metadata(&self) -> EmptyMetadata {
23        EmptyMetadata
24    }
25}
26
27impl SerdeVTable<&ByteBoolArray> for ByteBoolEncoding {
28    fn decode(
29        &self,
30        parts: &ArrayParts,
31        ctx: &ArrayContext,
32        dtype: DType,
33        len: usize,
34    ) -> VortexResult<ArrayRef> {
35        let validity = if parts.nchildren() == 0 {
36            Validity::from(dtype.nullability())
37        } else if parts.nchildren() == 1 {
38            let validity = parts.child(0).decode(ctx, Validity::DTYPE, len)?;
39            Validity::Array(validity)
40        } else {
41            vortex_bail!("Expected 0 or 1 child, got {}", parts.nchildren());
42        };
43
44        if parts.nbuffers() != 1 {
45            vortex_bail!("Expected 1 buffer, got {}", parts.nbuffers());
46        }
47        let buffer = parts.buffer(0)?;
48
49        Ok(ByteBoolArray::new(buffer, validity).into_array())
50    }
51}