use serde::{Deserialize, Serialize};
mod nodes;
pub use nodes::{
Operator, PipelineNode, PipelineOperator, SegmentSink, SegmentSource, Service, ServiceBackend,
ServiceFrontend, Sink, Source,
};
pub mod context;
pub mod error;
pub mod network;
pub use network::egress::addressed_router::{AddressedPushRouter, AddressedRequest};
pub use network::egress::push_router::{
MultimodalCacheIndex, MultimodalCacheKeyExtractor, PushRouter, RouterMode, WorkerLoadMonitor,
};
pub mod registry;
pub use crate::engine::{
self as engine, AsyncEngine, AsyncEngineContext, AsyncEngineContextProvider, AsyncEngineStream,
Data, DataStream, Engine, EngineStream, EngineUnary, ResponseStream, async_trait,
};
pub use anyhow::Error;
pub use context::Context;
pub use error::{PipelineError, PipelineErrorExt, TwoPartCodecError};
pub type SingleIn<T> = Context<T>;
pub struct RequestStream<T: Data> {
inner: std::sync::Mutex<Option<DataStream<T>>>,
}
impl<T: Data> RequestStream<T> {
pub fn new(stream: DataStream<T>) -> Self {
Self {
inner: std::sync::Mutex::new(Some(stream)),
}
}
pub fn take(&self) -> Option<DataStream<T>> {
self.inner.lock().unwrap().take()
}
}
impl<T: Data> std::fmt::Debug for RequestStream<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let taken = self.inner.lock().map(|g| g.is_none()).unwrap_or(true);
f.debug_struct("RequestStream")
.field("taken", &taken)
.finish()
}
}
pub type ManyIn<T> = Context<RequestStream<T>>;
pub type SingleOut<T> = EngineUnary<T>;
pub type ManyOut<T> = EngineStream<T>;
pub type ServiceEngine<T, U> = Engine<T, U, Error>;
pub type UnaryEngine<T, U> = ServiceEngine<SingleIn<T>, SingleOut<U>>;
pub type ClientStreamingEngine<T, U> = ServiceEngine<ManyIn<T>, SingleOut<U>>;
pub type ServerStreamingEngine<T, U> = ServiceEngine<SingleIn<T>, ManyOut<U>>;
pub type BidirectionalStreamingEngine<T, U> = ServiceEngine<ManyIn<T>, ManyOut<U>>;
pub trait AsyncTransportEngine<T: Data + PipelineIO, U: Data + PipelineIO>:
AsyncEngine<T, U, Error> + Send + Sync + 'static
{
}
mod sealed {
use super::*;
#[allow(dead_code)]
pub struct Token;
pub trait Connectable {
type DataType: Data;
}
impl<T: Data> Connectable for Context<T> {
type DataType = T;
}
impl<T: Data> Connectable for EngineUnary<T> {
type DataType = T;
}
impl<T: Data> Connectable for EngineStream<T> {
type DataType = T;
}
}
pub trait PipelineIO: sealed::Connectable + AsyncEngineContextProvider + 'static {
fn id(&self) -> String;
}
impl<T: Data> PipelineIO for Context<T> {
fn id(&self) -> String {
self.id().to_string()
}
}
impl<T: Data> PipelineIO for EngineUnary<T> {
fn id(&self) -> String {
self.context().id().to_string()
}
}
impl<T: Data> PipelineIO for EngineStream<T> {
fn id(&self) -> String {
self.context().id().to_string()
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Event {
pub id: String,
}