1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use super::RillClient;
use super::RillClientLink;
use anyhow::Error;
use async_trait::async_trait;
use derive_more::From;
use meio::{ActionHandler, Context, Interact, Interaction, InteractionResponder, InteractionTask};
pub struct WaitReady;
impl Interaction for WaitReady {
type Output = ();
}
impl RillClientLink {
pub async fn wait_ready(&mut self) -> InteractionTask<WaitReady> {
let msg = WaitReady;
self.address.interact(msg)
}
}
#[derive(From)]
pub(super) struct Notifier {
responder: InteractionResponder<()>,
}
impl Notifier {
fn notify(self) {
let res = self.responder.send(Ok(()));
if res.is_err() {
log::error!("Can't notify a listener that the client is ready.");
}
}
}
#[async_trait]
impl ActionHandler<Interact<WaitReady>> for RillClient {
async fn handle(
&mut self,
input: Interact<WaitReady>,
_ctx: &mut Context<Self>,
) -> Result<(), Error> {
let notifier = Notifier::from(input.responder);
if self.sender.is_some() {
notifier.notify();
} else {
self.awaiting_clients.push_back(notifier);
}
Ok(())
}
}
impl RillClient {
pub(super) fn notify_awaiting_clients(&mut self) {
for notifier in self.awaiting_clients.drain(..) {
notifier.notify();
}
}
}