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