reifydb_sub_flow/operator/transform/
mod.rs1use reifydb_core::interface::FlowNodeId;
5use reifydb_rql::expression::Expression;
6
7use crate::operator::{BoxedOperator, Operator};
8
9pub mod registry;
10
11pub trait TransformOperator: Operator {}
12
13pub trait TransformOperatorFactory: Send + Sync {
14 fn create_from_expressions(node: FlowNodeId, expressions: &[Expression]) -> crate::Result<BoxedOperator>;
15}
16
17pub mod extract {
18 use reifydb_rql::expression::ConstantExpression;
19
20 use super::*;
21
22 pub fn int(expr: &Expression) -> crate::Result<i64> {
23 match expr {
24 Expression::Constant(ConstantExpression::Number {
25 fragment,
26 }) => {
27 let text = fragment.text();
29 text.parse::<i64>().map_err(|_| panic!("Failed to parse integer from: {}", text))
30 }
31 _ => panic!("Expected integer value"),
32 }
33 }
34
35 pub fn float(expr: &Expression) -> crate::Result<f64> {
37 match expr {
38 Expression::Constant(ConstantExpression::Number {
39 fragment,
40 }) => {
41 let text = fragment.text();
43 text.parse::<f64>().map_err(|_| panic!("Failed to parse float from: {}", text))
44 }
45 _ => panic!("Expected numeric value"),
46 }
47 }
48
49 pub fn string(expr: &Expression) -> crate::Result<String> {
51 match expr {
52 Expression::Constant(ConstantExpression::Text {
53 fragment,
54 }) => Ok(fragment.text().to_string()),
55 Expression::Column(col) => {
56 Ok(col.0.name.text().to_string())
58 }
59 _ => panic!("Expected string value"),
60 }
61 }
62}