vortex_scalar/scalarvalue/
list.rs

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