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