use crate::experimental::trait_based::{ data::{ io::{Inputs, Outputs}, raw::Data, }, element::{DataType, ElementIo, PipelineElement}, }; pub struct Concatenate(pub String); impl PipelineElement for Concatenate { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { if let [Data::String(s0), Data::String(s1), ..] = input.inner()[..] { format!("{s0}{s1}").into() } else { panic!("Invalid data passed") } } } fn signature(&self) -> ElementIo { ElementIo { inputs: vec![DataType::String, DataType::String], outputs: vec![DataType::String], } } } pub struct Upper; impl PipelineElement for Upper { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { if let [Data::String(s), ..] = input.inner()[..] { s.to_uppercase().into() } else { panic!("Invalid data passed") } } } fn signature(&self) -> ElementIo { ElementIo { inputs: vec![DataType::String], outputs: vec![DataType::String], } } } pub struct Lower; impl PipelineElement for Lower { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { if let [Data::String(s), ..] = input.inner()[..] { s.to_lowercase().into() } else { panic!("Invalid data passed") } } } fn signature(&self) -> ElementIo { ElementIo { inputs: vec![DataType::String], outputs: vec![DataType::String], } } }