use std::sync::Arc;
use kernel::{Envelope, IndexName, Position, SinkName};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum LaneItem {
Batch(Batch),
SnapshotComplete { indexes: Vec<IndexName> },
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Batch {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub position: Option<Position>,
#[serde(default)]
pub changes: usize,
pub envelopes: Arc<[Envelope]>,
}
impl LaneItem {
pub fn position(&self) -> Option<Position> {
match self {
LaneItem::Batch(batch) => batch.position,
LaneItem::SnapshotComplete { .. } => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Request {
Backfill {
sink: SinkName,
indexes: Vec<IndexName>,
},
}
#[derive(Debug)]
pub struct Lane {
pub producer: Box<dyn crate::Producer<LaneItem>>,
pub consumer: Box<dyn crate::Consumer<LaneItem>>,
}
#[derive(Debug)]
pub struct RequestLane {
pub producer: Box<dyn crate::Producer<Request>>,
pub consumer: Box<dyn crate::Consumer<Request>>,
}
pub trait Stream: std::fmt::Debug + Send + Sync {
fn lane(&self, sink: &SinkName) -> crate::Result<Lane>;
fn requests(&self) -> crate::Result<RequestLane>;
fn watermark(&self) -> Option<Position>;
fn is_idle(&self) -> bool;
}