1use std::sync::Arc;
2
3use stoat_database::events::server::ClientMessage;
4use tokio::sync::mpsc::UnboundedSender;
5
6use crate::{
7 Error, GlobalCache, HttpClient,
8 notifiers::Notifiers,
9 websocket::{EventMessage, ProgramMessage},
10};
11
12#[derive(Debug, Clone)]
13pub struct Events(pub(crate) Arc<UnboundedSender<EventMessage>>);
14
15impl AsRef<Events> for Events {
16 fn as_ref(&self) -> &Events {
17 self
18 }
19}
20
21impl Events {
22 pub(crate) fn send_message(&self, message: EventMessage) -> Result<(), Error> {
23 self.0.send(message).map_err(|_| Error::BrokenChannel)
24 }
25
26 pub fn send_event(&self, event: ClientMessage) -> Result<(), Error> {
27 self.send_message(EventMessage::Client(event))
28 }
29
30 pub fn close(&self) -> Result<(), Error> {
31 self.send_message(EventMessage::Program(ProgramMessage::Close))
32 }
33}
34
35#[derive(Debug, Clone)]
36pub struct Context {
37 pub cache: GlobalCache,
38 pub http: HttpClient,
39 pub notifiers: Notifiers,
40 pub events: Events,
41}
42
43impl AsRef<GlobalCache> for Context {
44 fn as_ref(&self) -> &GlobalCache {
45 &self.cache
46 }
47}
48
49impl AsRef<HttpClient> for Context {
50 fn as_ref(&self) -> &HttpClient {
51 &self.http
52 }
53}
54
55impl AsRef<Notifiers> for Context {
56 fn as_ref(&self) -> &Notifiers {
57 &self.notifiers
58 }
59}
60
61impl AsRef<Events> for Context {
62 fn as_ref(&self) -> &Events {
63 &self.events
64 }
65}