vortex_array/arrays/extension/
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 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}