//! State use super::*; use tokio::{ sync::{ watch, }, }; use config::Config; #[derive(Debug, Clone)] pub struct State { config: Arc, //to avoid cloning config chain: Arc>>, save: Arc, shutdown: Arc>, shutdown_recv: watch::Receiver, } impl State { pub fn new(config: Config, chain: Arc>>, save: Arc) -> Self { let (shutdown, shutdown_recv) = watch::channel(false); Self { config: Arc::new(config), chain, save, shutdown: Arc::new(shutdown), shutdown_recv, } } pub fn config(&self) -> &Config { self.config.as_ref() } pub fn notify_save(&self) { self.save.notify(); } pub fn chain(&self) -> &RwLock> { &self.chain.as_ref() } pub fn when(&self) -> &Arc { &self.save } pub fn shutdown(self) { self.shutdown.broadcast(true).expect("Failed to communicate shutdown"); self.save.notify(); } pub fn has_shutdown(&self) -> bool { *self.shutdown_recv.borrow() } pub async fn on_shutdown(mut self) { if !self.has_shutdown() { while let Some(false) = self.shutdown_recv.recv().await { } } } }