10
crates/adapters/event-publisher/Cargo.toml
Normal file
10
crates/adapters/event-publisher/Cargo.toml
Normal file
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "event-publisher"
|
||||
edition.workspace = true
|
||||
version.workspace = true
|
||||
|
||||
[dependencies]
|
||||
domain.workspace = true
|
||||
async-trait.workspace = true
|
||||
tokio = { workspace = true, features = ["sync"] }
|
||||
tracing.workspace = true
|
||||
35
crates/adapters/event-publisher/src/channel.rs
Normal file
35
crates/adapters/event-publisher/src/channel.rs
Normal file
@@ -0,0 +1,35 @@
|
||||
use tokio::sync::mpsc;
|
||||
|
||||
use domain::errors::DomainError;
|
||||
use domain::events::EventEnvelope;
|
||||
|
||||
const DEFAULT_CHANNEL_CAPACITY: usize = 256;
|
||||
|
||||
pub type EventReceiver = mpsc::Receiver<EventEnvelope>;
|
||||
|
||||
pub struct ChannelEventPublisher {
|
||||
sender: mpsc::Sender<EventEnvelope>,
|
||||
}
|
||||
|
||||
impl ChannelEventPublisher {
|
||||
fn new(sender: mpsc::Sender<EventEnvelope>) -> Self {
|
||||
Self { sender }
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl domain::ports::EventPublisherPort for ChannelEventPublisher {
|
||||
async fn publish(&self, envelope: EventEnvelope) -> Result<(), DomainError> {
|
||||
self.sender
|
||||
.send(envelope)
|
||||
.await
|
||||
.map_err(|_| DomainError::InvalidInput("event channel closed".into()))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_event_channel() -> (ChannelEventPublisher, EventReceiver) {
|
||||
let (sender, receiver) = mpsc::channel(DEFAULT_CHANNEL_CAPACITY);
|
||||
(ChannelEventPublisher::new(sender), receiver)
|
||||
}
|
||||
5
crates/adapters/event-publisher/src/lib.rs
Normal file
5
crates/adapters/event-publisher/src/lib.rs
Normal file
@@ -0,0 +1,5 @@
|
||||
mod channel;
|
||||
mod noop;
|
||||
|
||||
pub use channel::{ChannelEventPublisher, EventReceiver, create_event_channel};
|
||||
pub use noop::NoopEventPublisher;
|
||||
11
crates/adapters/event-publisher/src/noop.rs
Normal file
11
crates/adapters/event-publisher/src/noop.rs
Normal file
@@ -0,0 +1,11 @@
|
||||
use domain::errors::DomainError;
|
||||
use domain::events::EventEnvelope;
|
||||
|
||||
pub struct NoopEventPublisher;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl domain::ports::EventPublisherPort for NoopEventPublisher {
|
||||
async fn publish(&self, _envelope: EventEnvelope) -> Result<(), DomainError> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user