Skip to main content

stoat/
context.rs

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}