use crate::catalog::roles::RoleReference;
use crate::semantics::view_privileges::{next_layer_privilege_subject, ViewPrivilegeCatalog};
use crate::SQLError;
pub(super) struct LayerPrivileges {
failure: Option<SQLError>,
}
impl LayerPrivileges {
pub(super) const fn new() -> Self {
Self { failure: None }
}
pub(super) fn check(
&mut self,
services: &dyn ViewPrivilegeCatalog,
view: &str,
subject: Option<&RoleReference>,
check: impl FnOnce() -> Result<RoleReference, SQLError>,
) -> Result<RoleReference, SQLError> {
match check() {
Ok(next) => Ok(next),
Err(error) => {
self.failure.get_or_insert(error);
next_layer_privilege_subject(services, view, subject)
}
}
}
pub(super) fn finish(self) -> Result<(), SQLError> {
self.failure.map_or(Ok(()), Err)
}
}