use async_trait::async_trait;
use crate::event::RunEvent;
#[derive(Debug, thiserror::Error)]
pub enum TransportError {
#[error("failed to serialize lineage event: {0}")]
Serialize(#[from] serde_json::Error),
#[error("transport error: {0}")]
Other(String),
}
#[async_trait]
pub trait Transport: std::fmt::Debug + Send + Sync {
async fn emit(&self, event: &RunEvent) -> Result<(), TransportError>;
async fn emit_batch(&self, events: &[RunEvent]) -> Result<(), TransportError> {
for event in events {
self.emit(event).await?;
}
Ok(())
}
async fn flush(&self) -> Result<(), TransportError> {
Ok(())
}
}
#[derive(Debug, Default)]
pub struct NoopTransport;
#[async_trait]
impl Transport for NoopTransport {
async fn emit(&self, _event: &RunEvent) -> Result<(), TransportError> {
Ok(())
}
}
#[derive(Debug, Default)]
pub struct ConsoleTransport;
#[async_trait]
impl Transport for ConsoleTransport {
async fn emit(&self, event: &RunEvent) -> Result<(), TransportError> {
let json = serde_json::to_string_pretty(event)?;
tracing::info!(target: "openlineage", "{json}");
Ok(())
}
}