use std::sync::{Arc, Mutex};
use super::MimeRegistry;
#[derive(Debug)]
pub struct RegistryCell {
inner: Mutex<Arc<MimeRegistry>>,
}
impl RegistryCell {
pub fn new(registry: Arc<MimeRegistry>) -> Self {
Self {
inner: Mutex::new(registry),
}
}
pub fn load(&self) -> Arc<MimeRegistry> {
crate::sync::lock(&self.inner).clone()
}
pub fn store(&self, registry: Arc<MimeRegistry>) {
*crate::sync::lock(&self.inner) = registry;
}
}
impl Default for RegistryCell {
fn default() -> Self {
Self::new(Arc::new(MimeRegistry::builtin()))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::mime::MimeType;
#[test]
fn a_store_reaches_the_next_load_but_not_a_snapshot_already_taken() {
let cell = RegistryCell::default();
let before = cell.load();
let obj = MimeType::parse("model/obj").unwrap();
assert_eq!(before.info(&obj).family, "model");
let table: toml::Table = toml::from_str("[\"model/obj\"]\nfamily = \"scene\"\n").unwrap();
let mut next = MimeRegistry::builtin();
next.layer(&table, "edit").unwrap();
cell.store(Arc::new(next));
assert_eq!(
cell.load().info(&obj).family,
"scene",
"the next load sees the edit"
);
assert_eq!(before.info(&obj).family, "model", "the snapshot does not");
assert!(format!("{cell:?}").contains("RegistryCell"));
}
}