use std::{collections::BTreeMap, ops::DerefMut};
use uqa_sql::catalog::roles::identity::RoleBinding;
use uqa_sql::{
catalog::roles::{
definition::RoleValidationContext, dependencies::context::RoleDependencyCatalog,
RoleDefinition, RoleMembership, RoleMembershipKey,
},
SQLError,
};
pub type RoleDefinitionWrite<'a> =
Box<dyn DerefMut<Target = BTreeMap<String, RoleDefinition>> + 'a>;
pub type RoleMembershipWrite<'a> =
Box<dyn DerefMut<Target = BTreeMap<RoleMembershipKey, RoleMembership>> + 'a>;
pub trait RoleRegistry {
fn write_roles(&self) -> RoleDefinitionWrite<'_>;
fn write_memberships(&self) -> RoleMembershipWrite<'_>;
}
pub trait RolePublication {
fn prepare_writer(&self) -> Result<(), SQLError>;
fn persist_roles(
&self,
before: &BTreeMap<String, RoleDefinition>,
roles: &BTreeMap<String, RoleDefinition>,
) -> Result<(), SQLError>;
fn persist_memberships(
&self,
before: &BTreeMap<RoleMembershipKey, RoleMembership>,
memberships: &BTreeMap<RoleMembershipKey, RoleMembership>,
) -> Result<(), SQLError>;
fn catalog_changed(&self);
fn set_current_role(&self, target: Option<RoleBinding>);
fn set_session_authorization(&self, target: RoleBinding);
}
#[derive(Clone, Copy)]
pub struct RoleExecutionContext<'a> {
pub analysis: RoleValidationContext<'a>,
pub registry: &'a dyn RoleRegistry,
pub publication: &'a dyn RolePublication,
pub dependencies: &'a dyn RoleDependencyCatalog,
pub locks: &'a dyn crate::row_locks::shared_objects::SharedObjectLockSession,
pub temporary_roles: &'a dyn super::super::roles::temporary::TemporaryRoleDependencyReads,
}