use serde::de::DeserializeOwned;
use serde_json::Value;
use super::dependencies::{HasReadModelStore, HasRepo};
use super::error::HandlerError;
use super::session::Session;
use crate::bus::Message;
pub struct Context<'a, D> {
message: Message,
input: Value,
session: Session,
dependencies: &'a D,
}
impl<'a, D> Context<'a, D> {
pub(crate) fn new(
message: Message,
input: Value,
session: Session,
dependencies: &'a D,
) -> Self {
Self {
message,
input,
session,
dependencies,
}
}
pub fn input<T: DeserializeOwned>(&self) -> Result<T, HandlerError> {
self.message.payload_json().map_err(HandlerError::from)
}
pub fn raw_input(&self) -> &Value {
&self.input
}
pub fn command_name(&self) -> &str {
self.message.name()
}
pub fn message_name(&self) -> &str {
self.message.name()
}
pub fn message(&self) -> &Message {
&self.message
}
pub fn session(&self) -> &Session {
&self.session
}
pub fn user_id(&self) -> Result<&str, HandlerError> {
self.session
.user_id()
.ok_or_else(|| HandlerError::Unauthorized("missing user ID in session".into()))
}
pub fn role(&self) -> Option<&str> {
self.session.role()
}
pub fn dependencies(&self) -> &D {
self.dependencies
}
pub fn repo(&self) -> &D::Repo
where
D: HasRepo,
{
self.dependencies.repo()
}
pub fn read_model_store(&self) -> &D::ReadModelStore
where
D: HasReadModelStore,
{
self.dependencies.read_model_store()
}
pub fn has_field(&self, field: &str) -> bool {
self.input.get(field).is_some()
}
pub fn has_fields(&self, fields: &[&str]) -> bool {
fields.iter().all(|f| self.has_field(f))
}
}