use std::sync::Arc;
use vantage_rhai::Vocab;
use vantage_rhai::rhai::Engine;
use super::narrow::register_narrowing;
use super::read::register_reads;
use super::record::register_record;
use super::write::register_writes;
use crate::VistaResolver;
#[derive(Clone, Debug)]
#[non_exhaustive]
pub enum Writes {
Allowed,
Denied(String),
}
#[derive(Clone, Debug)]
#[non_exhaustive]
pub enum Terminals {
Describe,
ReadWrite {
limit: Option<usize>,
writes: Writes,
},
}
#[derive(Clone)]
pub struct DataVocab {
resolver: Option<Arc<dyn VistaResolver>>,
terminals: Terminals,
}
impl DataVocab {
pub fn new(terminals: Terminals) -> Self {
Self {
resolver: None,
terminals,
}
}
pub fn with_resolver(mut self, resolver: Arc<dyn VistaResolver>) -> Self {
self.resolver = Some(resolver);
self
}
}
impl Vocab for DataVocab {
fn register(&self, engine: &mut Engine) {
register_narrowing(engine, self.resolver.clone());
match &self.terminals {
Terminals::Describe => {}
Terminals::ReadWrite { limit, writes } => {
register_reads(engine, self.resolver.clone(), *limit);
register_writes(engine, self.resolver.clone(), writes.clone());
register_record(engine, writes.clone());
}
}
}
}