use super::ShutdownSignal;
use std::pin::Pin;
use tokio::sync::oneshot;
pub struct ChannelSignal {
name: String,
rx: Option<oneshot::Receiver<()>>,
}
impl ChannelSignal {
pub fn new(name: impl Into<String>, rx: oneshot::Receiver<()>) -> Self {
Self {
name: name.into(),
rx: Some(rx),
}
}
}
impl ShutdownSignal for ChannelSignal {
fn wait(&mut self) -> Pin<Box<dyn std::future::Future<Output = ()> + Send + '_>> {
if let Some(rx) = self.rx.take() {
Box::pin(async move {
let _ = rx.await;
})
} else {
Box::pin(std::future::pending::<()>())
}
}
fn name(&self) -> &str {
&self.name
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_channel_signal() {
let (tx, rx) = oneshot::channel();
let mut signal = ChannelSignal::new("test", rx);
tx.send(()).unwrap();
signal.wait().await;
}
#[test]
fn test_channel_signal_name() {
let (_tx, rx) = oneshot::channel();
let signal = ChannelSignal::new("custom-signal", rx);
assert_eq!(signal.name(), "custom-signal");
}
}