use std::future::Future;
use futures::future::BoxFuture;
use crate::{
error::ComponentError,
types::{ComponentInput, ComponentOutput},
Cache,
};
pub trait IComponentFunction<TMessage, TConfig>: Send {
fn call(
&self,
input: ComponentInput<TMessage>,
output: ComponentOutput<TMessage>,
config: TConfig,
cache: Cache<TMessage>,
) -> BoxFuture<'static, Result<(), ComponentError>>;
}
impl<T, F, TMessage, TConfig> IComponentFunction<TMessage, TConfig> for T
where
T: Fn(ComponentInput<TMessage>, ComponentOutput<TMessage>, TConfig, Cache<TMessage>) -> F
+ Send,
F: Future<Output = Result<(), ComponentError>> + 'static + Send,
{
fn call(
&self,
input: ComponentInput<TMessage>,
output: ComponentOutput<TMessage>,
config: TConfig,
cache: Cache<TMessage>,
) -> BoxFuture<'static, Result<(), ComponentError>> {
Box::pin(self(input, output, config, cache))
}
}