use persy::{Config, GenericError, Persy}; use std::sync::{Condvar, Mutex}; use tempfile::Builder; #[allow(dead_code)] pub struct CountDown { lock: Mutex, cond: Condvar, } #[allow(dead_code)] impl CountDown { pub fn new(count: u64) -> CountDown { CountDown { lock: Mutex::new(count), cond: Condvar::new(), } } pub fn wait(&self) -> Result { let guard = self.lock.lock().expect("lock not poisoned"); if *guard != 0 { drop(self.cond.wait(guard).expect("lock not poisoned")); } Ok(true) } pub fn count_down(&self) -> Result<(), GenericError> { let mut count = self.lock.lock().expect("lock not poisoned"); *count = (*count) - 1; if *count == 0 { self.cond.notify_all(); } Ok(()) } } #[allow(dead_code)] pub fn create_and_drop(name: &str, test: F) where F: FnOnce(&Persy), { create_and_drop_with_config(name, Config::new(), test); } #[allow(dead_code)] pub fn create_and_drop_with_config(name: &str, config: Config, test: F) where F: FnOnce(&Persy), { let file = Builder::new() .prefix(name) .suffix(".persy") .tempfile() .expect("expect temp file creation"); Persy::create_from_file(file.reopen().expect("reopen")).expect(&format!("file '{:?}' do not exist", file)); { let persy = Persy::open_from_file(file.reopen().expect("reopen"), config).unwrap(); test(&persy); } }