Skip to main content

radiate_expr/
traits.rs

1use crate::ops::SelectOp;
2use radiate_error::RadiateError;
3use radiate_utils::AnyValue;
4use std::time::Duration;
5
6pub(crate) type ExprResult<'a, O = AnyValue<'a>> = Result<O, RadiateError>;
7
8pub trait ProjectExpr<'a> {
9    fn select(&'a self, expr: &SelectOp) -> Result<AnyValue<'a>, RadiateError>;
10}
11
12impl<'a, T, F> ProjectExpr<'a> for F
13where
14    T: Into<AnyValue<'a>>,
15    F: Fn(&SelectOp) -> Result<T, RadiateError>,
16{
17    fn select(&'a self, expr: &SelectOp) -> Result<AnyValue<'a>, RadiateError> {
18        self(expr).map(|v| v.into())
19    }
20}
21
22impl<'a, T: ProjectExpr<'a>> ProjectExpr<'a> for Vec<T> {
23    fn select(&'a self, expr: &SelectOp) -> Result<AnyValue<'a>, RadiateError> {
24        match expr {
25            SelectOp::Identity => Ok(AnyValue::Vector(
26                self.iter()
27                    .filter_map(|v| v.select(&SelectOp::Identity).ok())
28                    .collect::<Vec<AnyValue<'a>>>(),
29            )),
30            SelectOp::Index(idx) => self
31                .get(*idx)
32                .map(|v| v.select(&SelectOp::Identity))
33                .unwrap_or(Ok(AnyValue::Null)),
34            SelectOp::Range(start, end) => {
35                let slice = self.get(*start..*end).unwrap_or(&[]);
36                let values = slice
37                    .iter()
38                    .filter_map(|v| v.select(&SelectOp::Identity).ok())
39                    .collect::<Vec<AnyValue<'a>>>();
40                Ok(AnyValue::Vector(values))
41            }
42            _ => Ok(AnyValue::Null),
43        }
44    }
45}
46
47impl<'a> ProjectExpr<'a> for AnyValue<'a> {
48    fn select(&'a self, _: &SelectOp) -> Result<AnyValue<'a>, RadiateError> {
49        Ok(self.clone())
50    }
51}
52
53impl<'a> ProjectExpr<'a> for String {
54    fn select(&'a self, _: &SelectOp) -> Result<AnyValue<'a>, RadiateError> {
55        Ok(AnyValue::Str(self))
56    }
57}
58
59macro_rules! impl_select {
60    ($t:ty, $dtype:ident) => {
61        impl<'a> ProjectExpr<'a> for $t {
62            fn select(&'a self, _: &SelectOp) -> Result<AnyValue<'a>, RadiateError> {
63                Ok(AnyValue::$dtype(*self))
64            }
65        }
66    };
67}
68
69impl_select!(u8, UInt8);
70impl_select!(u16, UInt16);
71impl_select!(u32, UInt32);
72impl_select!(u64, UInt64);
73impl_select!(u128, UInt128);
74
75impl_select!(i8, Int8);
76impl_select!(i16, Int16);
77impl_select!(i32, Int32);
78impl_select!(i64, Int64);
79impl_select!(i128, Int128);
80
81impl_select!(f32, Float32);
82impl_select!(f64, Float64);
83
84impl_select!(Duration, Duration);
85impl_select!(bool, Bool);
86impl_select!(usize, Usize);
87
88impl_select!(char, Char);
89impl_select!(&str, Str);