kti_cqrs_provider_rs

Crates.iokti_cqrs_provider_rs
lib.rskti_cqrs_provider_rs
version0.3.0
sourcesrc
created_at2023-11-05 08:14:21.889321
updated_at2024-12-08 11:02:04.70185
descriptionCQRS provider with ioc container
homepagehttps://github.com/kotletti/kti_cqrs_provider_rs
repositoryhttps://github.com/kotletti/kti_cqrs_provider_rs
max_upload_size
id1025815
size10,901
Andrey Dudnik (andreyddk)

documentation

README

CQRS provider with ioc container

Wrapped kti_cqrs_rs via provider for more complex usage

Simple example (existed in repo)

pub struct UserController {
  context: Arc<dyn ContextPort>,
}

#[async_trait]
impl AdapterPort<UserController> for UserController {
  fn token() -> &'static str {
    "UserController"
  }

  async fn get_adapter(context: &Arc<dyn ContextPort>) -> Result<Box<Self>, Error> {
    let me = context
      .resolve_provider(Self::token())
      .await?
      .downcast::<Self>()
      .map_err(|_| format!("Cant resolve provider: {}", Self::token()))?;

    Ok(me)
  }
}

impl UserController {
  pub fn new(context: Arc<dyn ContextPort>) -> Self {
    Self { context }
  }

  pub async fn get_user_by_name(&self, name: &str) -> Result<Option<User>, Error> {
    let bus = CqrsProvider::get_adapter(&self.context).await?;

    let query = GetUserByNameQuery::new(name);

    bus.query(Box::new(query)).await
  }

  pub async fn create_user(&self, name: &str, email: &str) -> Result<(), Error> {
    let bus = CqrsProvider::get_adapter(&self.context).await?;

    let command = CreateUserCommand::new(name, email);

    bus.command(Box::new(command)).await?;

    Ok(())
  }

  pub async fn create_safe_user(&self, name: &str, email: &str) -> Result<(), Error> {
    let bus = CqrsProvider::get_adapter(&self.context).await?;

    let command = CreateSafeUserCommand::new(name, email);

    bus.command(Box::new(command)).await?;

    Ok(())
  }

  pub async fn update_user_email(&self, name: &str, email: &str) -> Result<(), Error> {
    let bus = CqrsProvider::get_adapter(&self.context).await?;

    let command = UpdateUserCommand::new(name, email);

    bus.command(Box::new(command)).await?;

    Ok(())
  }

  pub async fn update_user_name(&self, current_name: &str, new_name: &str) -> Result<(), Error> {
    let bus = CqrsProvider::get_adapter(&self.context).await?;

    let event = RenameUserEvent::new(current_name, new_name);

    bus.event(Box::new(event)).await?;

    Ok(())
  }
}
Commit count: 8

cargo fmt