use async_trait::async_trait;
use serde::{de::DeserializeOwned, Serialize};
use crate::error::DomainError;
use crate::events::{
DeliberationCompletedEvent, PhaseChangedEvent, TaskCompletedEvent, TaskDispatchedEvent,
TaskFailedEvent,
};
pub trait DomainEvent: Serialize + DeserializeOwned + Send + Sync + 'static {}
impl DomainEvent for TaskDispatchedEvent {}
impl DomainEvent for TaskCompletedEvent {}
impl DomainEvent for TaskFailedEvent {}
impl DomainEvent for DeliberationCompletedEvent {}
impl DomainEvent for PhaseChangedEvent {}
#[async_trait]
pub trait SubscriptionHandler<E: DomainEvent>: Send + Sync {
async fn handle(&self, event: E) -> Result<(), DomainError>;
}
#[async_trait]
pub trait MessagingPort: Send + Sync {
async fn publish_task_dispatched(&self, event: &TaskDispatchedEvent)
-> Result<(), DomainError>;
async fn publish_task_completed(&self, event: &TaskCompletedEvent) -> Result<(), DomainError>;
async fn publish_task_failed(&self, event: &TaskFailedEvent) -> Result<(), DomainError>;
async fn publish_deliberation_completed(
&self,
event: &DeliberationCompletedEvent,
) -> Result<(), DomainError>;
async fn publish_phase_changed(&self, event: &PhaseChangedEvent) -> Result<(), DomainError>;
}