vortex_array/arrays/extension/vtable/
serde.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}