use crate::access_control::manifest::ManifestParams;
use crate::guardian::error::Result;
use crate::log::access_control;
use crate::log::identity_provider::IdentityProvider;
use async_trait::async_trait;
pub type LogEntry = dyn access_control::LogEntry;
pub type CanAppendAdditionalContext = dyn access_control::CanAppendAdditionalContext;
#[async_trait]
pub trait AccessController: Send + Sync {
fn get_type(&self) -> &str;
async fn get_authorized_by_role(&self, role: &str) -> Result<Vec<String>>;
async fn grant(&self, capability: &str, key_id: &str) -> Result<()>;
async fn revoke(&self, capability: &str, key_id: &str) -> Result<()>;
async fn load(&self, address: &str) -> Result<()>;
async fn save(&self) -> Result<Box<dyn ManifestParams>>;
async fn close(&self) -> Result<()>;
async fn can_append(
&self,
entry: &dyn access_control::LogEntry,
identity_provider: &dyn IdentityProvider,
additional_context: &dyn access_control::CanAppendAdditionalContext,
) -> Result<()>;
}
pub type Option = Box<dyn FnOnce(&mut dyn AccessController)>;