use crate::domain_event::DomainEvent;
use crate::errors::{CommandHandlerError, QueryHandlerError};
use crate::persistence::transaction::EventTransactionContext;
use crate::prelude::*;
use async_trait::async_trait;
use downcast_rs::{impl_downcast, Downcast};
use std::any::Any;
use std::fmt::Debug;
pub trait Command: Downcast + Send + Sync + Debug {}
impl_downcast!(Command);
#[async_trait]
pub trait CommandHandler<C>: Send + Sync + 'static
where
C: Command,
{
async fn handle(&self, command: C, ctx: Option<&mut dyn EventTransactionContext>) -> Result<(EntityId, Vec<Box<dyn DomainEvent>>), CommandHandlerError>;
}
#[async_trait]
pub trait CommandHandlerFactory<C>: Send + Sync
where
C: Command,
{
async fn create(&self) -> Result<Box<dyn CommandHandler<C>>, CommandHandlerError>;
}
#[async_trait]
pub trait Query: Downcast + Send + Sync + 'static {}
impl_downcast!(Query);
#[async_trait]
pub trait QueryHandler<Q>: Send + Sync + 'static
where
Q: Query,
{
async fn handle(&self, query: Q) -> Result<Box<dyn Any + Send + Sync + 'static>, QueryHandlerError>;
}
#[async_trait]
pub trait QueryHandlerFactory<Q>: Send + Sync
where
Q: Query,
{
async fn create(&self) -> Result<Box<dyn QueryHandler<Q>>, QueryHandlerError>;
}