#[cfg(test)]
use std::sync::{Arc, Mutex};
#[salsa::db]
#[derive(Clone)]
#[cfg_attr(not(test), derive(Default))]
pub struct CalcDatabaseImpl {
storage: salsa::Storage<Self>,
#[cfg(test)]
logs: Arc<Mutex<Option<Vec<String>>>>,
}
#[cfg(test)]
impl Default for CalcDatabaseImpl {
fn default() -> Self {
let logs = <Arc<Mutex<Option<Vec<String>>>>>::default();
Self {
storage: salsa::Storage::new(Some(Box::new({
let logs = logs.clone();
move |event| {
eprintln!("Event: {event:?}");
if let Some(logs) = &mut *logs.lock().unwrap() {
if let salsa::EventKind::WillExecute { .. } = event.kind {
logs.push(format!("Event: {event:?}"));
}
}
}
}))),
logs,
}
}
}
impl CalcDatabaseImpl {
#[cfg(test)]
pub fn enable_logging(&self) {
let mut logs = self.logs.lock().unwrap();
if logs.is_none() {
*logs = Some(vec![]);
}
}
#[cfg(test)]
#[allow(unused)]
pub fn take_logs(&self) -> Vec<String> {
let mut logs = self.logs.lock().unwrap();
if let Some(logs) = &mut *logs {
std::mem::take(logs)
} else {
vec![]
}
}
}
#[salsa::db]
impl salsa::Database for CalcDatabaseImpl {}