vortex_array/arrays/extension/
serde.rs

1use vortex_dtype::DType;
2use vortex_error::{VortexResult, vortex_bail};
3
4use crate::arrays::{ExtensionArray, ExtensionEncoding};
5use crate::serde::ArrayParts;
6use crate::vtable::SerdeVTable;
7use crate::{Array, ArrayChildVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl, EmptyMetadata};
8
9impl ArrayVisitorImpl for ExtensionArray {
10    fn _children(&self, visitor: &mut dyn ArrayChildVisitor) {
11        visitor.visit_child("storage", self.storage())
12    }
13
14    fn _metadata(&self) -> EmptyMetadata {
15        EmptyMetadata
16    }
17}
18
19impl SerdeVTable<&ExtensionArray> for ExtensionEncoding {
20    fn decode(
21        &self,
22        parts: &ArrayParts,
23        ctx: &ArrayContext,
24        dtype: DType,
25        len: usize,
26    ) -> VortexResult<ArrayRef> {
27        let DType::Extension(ext_dtype) = dtype else {
28            vortex_bail!("Not an extension DType");
29        };
30        let storage = parts
31            .child(0)
32            .decode(ctx, ext_dtype.storage_dtype().clone(), len)?;
33        Ok(ExtensionArray::new(ext_dtype, storage).into_array())
34    }
35}