use crate::{rbac::RoleManager, Result};
#[cfg(feature = "incremental")]
use crate::emitter::EventData;
use parking_lot::RwLock;
use std::{collections::HashMap, sync::Arc};
mod assertion;
mod default_model;
pub mod function_map;
pub use assertion::{Assertion, AssertionMap};
pub use default_model::DefaultModel;
pub use function_map::*;
pub trait Model: Send + Sync {
fn add_def(&mut self, sec: &str, key: &str, value: &str) -> bool;
fn get_model(&self) -> &HashMap<String, AssertionMap>;
fn get_mut_model(&mut self) -> &mut HashMap<String, AssertionMap>;
fn build_role_links(
&mut self,
rm: Arc<RwLock<dyn RoleManager>>,
) -> Result<()>;
#[cfg(feature = "incremental")]
fn build_incremental_role_links(
&mut self,
rm: Arc<RwLock<dyn RoleManager>>,
d: EventData,
) -> Result<()>;
fn add_policy(&mut self, sec: &str, ptype: &str, rule: Vec<String>)
-> bool;
fn add_policies(
&mut self,
sec: &str,
ptype: &str,
rules: Vec<Vec<String>>,
) -> bool;
fn get_policy(&self, sec: &str, ptype: &str) -> Vec<Vec<String>>;
fn get_filtered_policy(
&self,
sec: &str,
ptype: &str,
field_index: usize,
field_values: Vec<String>,
) -> Vec<Vec<String>>;
fn has_policy(&self, sec: &str, ptype: &str, rule: Vec<String>) -> bool;
fn get_values_for_field_in_policy(
&self,
sec: &str,
ptype: &str,
field_index: usize,
) -> Vec<String>;
fn remove_policy(
&mut self,
sec: &str,
ptype: &str,
rule: Vec<String>,
) -> bool;
fn remove_policies(
&mut self,
sec: &str,
ptype: &str,
rules: Vec<Vec<String>>,
) -> bool;
fn clear_policy(&mut self);
fn remove_filtered_policy(
&mut self,
sec: &str,
ptype: &str,
field_index: usize,
field_values: Vec<String>,
) -> (bool, Vec<Vec<String>>);
fn to_text(&self) -> String;
}