use std::sync::Arc;
use std::sync::atomic::Ordering;
use super::Router;
use crate::router_state::RouterState;
#[cfg(feature = "signals")]
use crate::signals::Signal;
#[cfg(feature = "signals")]
use crate::signals::SignalArbiter;
use crate::state::set_state;
impl Router {
pub fn state<T: Clone + Send + Sync + 'static>(&mut self, value: T) {
set_state(value);
}
pub fn with_state<T: Clone + Send + Sync + 'static>(&mut self, value: T) -> &mut Self {
self.router_state.insert(value);
self.has_router_state.store(true, Ordering::Release);
self
}
#[inline]
pub fn router_state(&self) -> &Arc<RouterState> {
&self.router_state
}
#[cfg(feature = "signals")]
pub fn signals(&self) -> &SignalArbiter {
&self.signals
}
#[cfg(feature = "signals")]
pub fn signal_arbiter(&self) -> SignalArbiter {
self.signals.clone()
}
#[cfg(feature = "signals")]
pub fn on_signal<F, Fut>(&self, id: impl Into<String>, handler: F)
where
F: Fn(Signal) -> Fut + Send + Sync + 'static,
Fut: std::future::Future<Output = ()> + Send + 'static,
{
self.signals.on(id, handler);
}
#[cfg(feature = "signals")]
pub async fn emit_signal(&self, signal: Signal) {
self.signals.emit(signal).await;
}
}