pub mod error;
pub mod eval;
pub mod model;
pub mod parser;
pub mod store;
use std::collections::{HashMap, HashSet};
use crate::{
error::ZanzibarError,
model::{NamespaceConfig, Object, Relation, RelationTuple, User},
store::{InMemoryTupleStore, TupleStore},
};
#[derive(Debug)]
pub struct ZanzibarService {
configs: HashMap<String, NamespaceConfig>,
store: Box<dyn TupleStore>,
}
impl Default for ZanzibarService {
fn default() -> Self {
Self::new()
}
}
impl ZanzibarService {
#[must_use]
pub fn new() -> Self {
Self {
configs: HashMap::new(),
store: Box::new(InMemoryTupleStore::default()),
}
}
#[must_use]
pub fn with_store(store: Box<dyn TupleStore>) -> Self {
Self {
configs: HashMap::new(),
store,
}
}
pub fn add_dsl(&mut self, dsl: &str) -> Result<(), ZanzibarError> {
let configs = parser::parse_dsl(dsl)?;
for config in configs {
self.add_config(config);
}
Ok(())
}
pub fn add_config(&mut self, config: NamespaceConfig) {
self.configs.insert(config.name.clone(), config);
}
pub fn write_tuple(&mut self, tuple: RelationTuple) -> Result<(), ZanzibarError> {
self.store.write_tuple(tuple)?;
Ok(())
}
pub fn delete_tuple(&mut self, tuple: &RelationTuple) -> Result<(), ZanzibarError> {
self.store.delete_tuple(tuple)?;
Ok(())
}
pub fn check(
&self,
object: &Object,
relation: &Relation,
user: &User,
) -> Result<bool, ZanzibarError> {
eval::check(
object,
relation,
user,
&self.configs,
self.store.as_ref(),
&mut HashSet::new(),
)
}
pub fn expand(
&self,
object: &Object,
relation: &Relation,
) -> Result<model::ExpandedUserset, ZanzibarError> {
eval::expand(object, relation, &self.configs, self.store.as_ref())
}
}