use std::collections::HashMap;
use std::sync::Arc;
use std::time::Duration;
use uni_common::{Result, Value};
use crate::api::UniInner;
use crate::api::hooks::SessionHook;
use crate::api::impl_locy::{self, LocyRuleRegistry};
use crate::api::session::Session;
pub struct SessionTemplate {
db: Arc<UniInner>,
params: HashMap<String, Value>,
rule_registry: LocyRuleRegistry,
hooks: HashMap<String, Arc<dyn SessionHook>>,
pub(crate) query_timeout: Option<Duration>,
pub(crate) transaction_timeout: Option<Duration>,
}
impl SessionTemplate {
pub fn create(&self) -> Session {
Session::new_from_template(
self.db.clone(),
self.params.clone(),
self.rule_registry.clone(),
self.hooks.clone(),
self.query_timeout,
self.transaction_timeout,
)
}
}
pub struct SessionTemplateBuilder {
db: Arc<UniInner>,
params: HashMap<String, Value>,
rule_registry: LocyRuleRegistry,
hooks: HashMap<String, Arc<dyn SessionHook>>,
query_timeout: Option<Duration>,
transaction_timeout: Option<Duration>,
}
impl SessionTemplateBuilder {
pub(crate) fn new(db: Arc<UniInner>) -> Self {
let global_registry = db.locy_rule_registry.read().unwrap();
let registry = global_registry.clone();
drop(global_registry);
Self {
db,
params: HashMap::new(),
rule_registry: registry,
hooks: HashMap::new(),
query_timeout: None,
transaction_timeout: None,
}
}
pub fn param<K: Into<String>, V: Into<Value>>(mut self, key: K, value: V) -> Self {
self.params.insert(key.into(), value.into());
self
}
pub fn rules(mut self, program: &str) -> Result<Self> {
let temp_registry = Arc::new(std::sync::RwLock::new(self.rule_registry.clone()));
impl_locy::register_rules_on_registry(&temp_registry, program)?;
self.rule_registry = temp_registry.read().unwrap().clone();
Ok(self)
}
pub fn hook(mut self, name: impl Into<String>, hook: impl SessionHook + 'static) -> Self {
self.hooks.insert(name.into(), Arc::new(hook));
self
}
pub fn query_timeout(mut self, duration: Duration) -> Self {
self.query_timeout = Some(duration);
self
}
pub fn transaction_timeout(mut self, duration: Duration) -> Self {
self.transaction_timeout = Some(duration);
self
}
pub fn build(self) -> Result<SessionTemplate> {
Ok(SessionTemplate {
db: self.db,
params: self.params,
rule_registry: self.rule_registry,
hooks: self.hooks,
query_timeout: self.query_timeout,
transaction_timeout: self.transaction_timeout,
})
}
}