use async_trait::async_trait;
use crate::error::RbacError;
use crate::models::{Permission, Role};
#[async_trait]
pub trait RbacStorage: Send + Sync {
async fn create_permission(&self, permission: &Permission) -> Result<(), RbacError>;
async fn get_permission(&self, name: &str) -> Result<Option<Permission>, RbacError>;
async fn delete_permission(&self, name: &str) -> Result<(), RbacError>;
async fn create_role(&self, role: &Role) -> Result<(), RbacError>;
async fn get_role(&self, name: &str) -> Result<Option<Role>, RbacError>;
async fn delete_role(&self, name: &str) -> Result<(), RbacError>;
async fn assign_permission_to_role(&self, permission_name: &str, role_name: &str) -> Result<(), RbacError>;
async fn remove_permission_from_role(&self, permission_name: &str, role_name: &str) -> Result<(), RbacError>;
async fn get_permissions_for_role(&self, role_name: &str) -> Result<Vec<Permission>, RbacError>;
async fn assign_role_to_subject(&self, role_name: &str, subject_id: &str) -> Result<(), RbacError>;
async fn remove_role_from_subject(&self, role_name: &str, subject_id: &str) -> Result<(), RbacError>;
async fn get_roles_for_subject(&self, subject_id: &str) -> Result<Vec<Role>, RbacError>;
async fn assign_permission_to_subject(&self, permission_name: &str, subject_id: &str) -> Result<(), RbacError>;
async fn remove_permission_from_subject(&self, permission_name: &str, subject_id: &str) -> Result<(), RbacError>;
async fn get_direct_permissions_for_subject(&self, subject_id: &str) -> Result<Vec<Permission>, RbacError>;
async fn subject_has_permission(&self, subject_id: &str, permission_name: &str) -> Result<bool, RbacError>;
}