vortex_array/arrays/extension/
serde.rs

1use vortex_buffer::ByteBuffer;
2use vortex_dtype::DType;
3use vortex_error::{VortexResult, vortex_bail};
4
5use super::ExtensionEncoding;
6use crate::EmptyMetadata;
7use crate::arrays::{ExtensionArray, ExtensionVTable};
8use crate::serde::ArrayChildren;
9use crate::vtable::SerdeVTable;
10
11impl SerdeVTable<ExtensionVTable> for ExtensionVTable {
12    type Metadata = EmptyMetadata;
13
14    fn metadata(_array: &ExtensionArray) -> VortexResult<Option<Self::Metadata>> {
15        Ok(Some(EmptyMetadata))
16    }
17
18    fn build(
19        _encoding: &ExtensionEncoding,
20        dtype: &DType,
21        len: usize,
22        _metadata: &Self::Metadata,
23        _buffers: &[ByteBuffer],
24        children: &dyn ArrayChildren,
25    ) -> VortexResult<ExtensionArray> {
26        let DType::Extension(ext_dtype) = dtype else {
27            vortex_bail!("Not an extension DType");
28        };
29        if children.len() != 1 {
30            vortex_bail!("Expected 1 child, got {}", children.len());
31        }
32        let storage = children.get(0, ext_dtype.storage_dtype(), len)?;
33        Ok(ExtensionArray::new(ext_dtype.clone(), storage))
34    }
35}