use alloc::boxed::Box;
use alloc::sync::Arc;
use core::any::Any;
use core::fmt::Debug;
use core::fmt::Display;
pub trait Pipeline: Debug {
fn format(
&self,
pipe_object: &Box<dyn PipelineValue + Send + Sync>,
) -> Box<dyn PipelineValue + Send + Sync>;
fn options(&self, options: &str) -> Box<dyn Pipeline + Send + Sync>;
fn boxed_clone(&self) -> Box<dyn Pipeline + Send + Sync>;
}
pub trait PipelineValue: Any + Display {
fn as_any(&self) -> &dyn Any;
fn boxed_clone(&self) -> Box<dyn PipelineValue + Send + Sync>;
fn cloned(&self) -> Self
where
Self: Clone,
{
Clone::clone(self)
}
}
impl PipelineValue for i32 {
fn as_any(&self) -> &dyn Any {
self
}
fn boxed_clone(&self) -> Box<dyn PipelineValue + Send + Sync> {
Box::new(Clone::clone(self))
}
}
impl PipelineValue for f32 {
fn as_any(&self) -> &dyn Any {
self
}
fn boxed_clone(&self) -> Box<dyn PipelineValue + Send + Sync> {
Box::new(Clone::clone(self))
}
}
impl PipelineValue for f64 {
fn as_any(&self) -> &dyn Any {
self
}
fn boxed_clone(&self) -> Box<dyn PipelineValue + Send + Sync> {
Box::new(Clone::clone(self))
}
}
impl PipelineValue for String {
fn as_any(&self) -> &dyn Any {
self
}
fn boxed_clone(&self) -> Box<dyn PipelineValue + Send + Sync> {
Box::new(Clone::clone(self))
}
}
impl PipelineValue for Arc<String> {
fn as_any(&self) -> &dyn Any {
self
}
fn boxed_clone(&self) -> Box<dyn PipelineValue + Send + Sync> {
Box::new(Clone::clone(self))
}
}