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);