vortex_scalar/scalar_value/
list.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use std::sync::Arc;
5
6use vortex_buffer::{BufferString, ByteBuffer};
7use vortex_dtype::half::f16;
8use vortex_error::{VortexError, vortex_err};
9
10use crate::ScalarValue;
11use crate::scalar_value::InnerScalarValue;
12
13impl<'a, T: for<'b> TryFrom<&'b ScalarValue, Error = VortexError>> TryFrom<&'a ScalarValue>
14    for Vec<T>
15{
16    type Error = VortexError;
17
18    fn try_from(value: &'a ScalarValue) -> Result<Self, Self::Error> {
19        let value = value
20            .as_list()?
21            .ok_or_else(|| vortex_err!("Can't convert non list scalar to vec"))?;
22
23        value.iter().map(|v| T::try_from(v)).collect()
24    }
25}
26
27macro_rules! from_vec_for_scalar_value {
28    ($T:ty) => {
29        impl From<Vec<$T>> for ScalarValue {
30            fn from(value: Vec<$T>) -> Self {
31                ScalarValue(InnerScalarValue::List(
32                    value
33                        .into_iter()
34                        .map(ScalarValue::from)
35                        .collect::<Arc<[_]>>(),
36                ))
37            }
38        }
39    };
40}
41
42// no From<Vec<u8>> because it could either be a List or a Buffer
43from_vec_for_scalar_value!(u16);
44from_vec_for_scalar_value!(u32);
45from_vec_for_scalar_value!(u64);
46from_vec_for_scalar_value!(usize); // For usize only, we implicitly cast for better ergonomics.
47from_vec_for_scalar_value!(i8);
48from_vec_for_scalar_value!(i16);
49from_vec_for_scalar_value!(i32);
50from_vec_for_scalar_value!(i64);
51from_vec_for_scalar_value!(f16);
52from_vec_for_scalar_value!(f32);
53from_vec_for_scalar_value!(f64);
54from_vec_for_scalar_value!(String);
55from_vec_for_scalar_value!(BufferString);
56from_vec_for_scalar_value!(ByteBuffer);