use crate::{HashMap, HashSet};
use anyhow::{bail, Result};
use super::{
context::Context,
schema::{Schema, IMPLEMENTED, META_AND_ANNOTATIONS},
};
pub struct SharedContext {
defs: HashMap<String, Schema>,
seen: HashSet<String>,
n_compiled: usize,
}
impl SharedContext {
pub fn new() -> Self {
SharedContext {
defs: HashMap::default(),
seen: HashSet::default(),
n_compiled: 0,
}
}
}
impl Context<'_> {
pub fn insert_ref(&self, uri: &str, schema: Schema) {
self.shared
.borrow_mut()
.defs
.insert(uri.to_string(), schema);
}
pub fn get_ref_cloned(&self, uri: &str) -> Option<Schema> {
self.shared.borrow().defs.get(uri).cloned()
}
pub fn mark_seen(&self, uri: &str) {
self.shared.borrow_mut().seen.insert(uri.to_string());
}
pub fn been_seen(&self, uri: &str) -> bool {
self.shared.borrow().seen.contains(uri)
}
pub fn is_valid_keyword(&self, keyword: &str) -> bool {
if !self.draft.is_known_keyword(keyword)
|| IMPLEMENTED.contains(&keyword)
|| META_AND_ANNOTATIONS.contains(&keyword)
{
return true;
}
false
}
pub fn increment(&self) -> Result<()> {
let mut shared = self.shared.borrow_mut();
shared.n_compiled += 1;
if shared.n_compiled > self.options.max_size {
bail!("schema too large");
}
Ok(())
}
pub fn take_defs(&self) -> HashMap<String, Schema> {
std::mem::take(&mut self.shared.borrow_mut().defs)
}
}