use crate::error::SynwireError;
use crate::runnables::config::RunnableConfig;
use crate::{BoxFuture, BoxStream};
pub trait RunnableCore: Send + Sync {
fn invoke<'a>(
&'a self,
input: serde_json::Value,
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<serde_json::Value, SynwireError>>;
fn batch<'a>(
&'a self,
inputs: Vec<serde_json::Value>,
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<Vec<serde_json::Value>, SynwireError>> {
Box::pin(async move {
let mut results = Vec::with_capacity(inputs.len());
for input in inputs {
results.push(self.invoke(input, config).await?);
}
Ok(results)
})
}
fn stream<'a>(
&'a self,
input: serde_json::Value,
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<BoxStream<'a, Result<serde_json::Value, SynwireError>>, SynwireError>>
{
Box::pin(async move {
let result = self.invoke(input, config).await;
let stream: BoxStream<'a, Result<serde_json::Value, SynwireError>> =
Box::pin(futures_util::stream::iter(vec![result]));
Ok(stream)
})
}
#[allow(clippy::unnecessary_literal_bound)]
fn name(&self) -> &str {
"RunnableCore"
}
}