x_one/xserver/
blocking.rs1use super::Server;
6use crate::error::XOneError;
7use tokio::sync::watch;
8
9pub struct BlockingServer {
14 tx: watch::Sender<bool>,
15 rx: watch::Receiver<bool>,
16}
17
18impl BlockingServer {
19 pub fn new() -> Self {
21 let (tx, rx) = watch::channel(false);
22 Self { tx, rx }
23 }
24
25 #[doc(hidden)]
27 pub fn rx(&self) -> watch::Receiver<bool> {
28 self.rx.clone()
29 }
30}
31
32impl Default for BlockingServer {
33 fn default() -> Self {
34 Self::new()
35 }
36}
37
38impl Server for BlockingServer {
39 async fn run(&self) -> Result<(), XOneError> {
40 let mut rx = self.rx.clone();
41 while !*rx.borrow() {
43 if rx.changed().await.is_err() {
44 break;
45 }
46 }
47 Ok(())
48 }
49
50 async fn stop(&self) -> Result<(), XOneError> {
51 let _ = self.tx.send(true);
52 Ok(())
53 }
54}