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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#![feature(result_map_or_else)]
pub mod client;
pub mod server;

/// SerializableEvent denotes structs that are able to serialize to some String.
/// This is used as mainly a marker trait, underneath serialize you most likely would want to use
/// serde.
pub trait SerializableEvent: Sync + Send + 'static {
    /// Returns a String of the serialized object
    fn serialize(&self) -> String;
}

/// Base Event struct which can be sent across a channel provided by
/// [`Server::get_tx`](server::Server::get_tx).
/// This struct encapsulates a inner trait object and res which is the resource we want to target.
pub struct Event {
    res: String,
    inner: Box<dyn SerializableEvent>,
}

impl Event {
    /// Returns a Event instance.
    /// # Arguments
    ///
    /// * `res` - A string slice that holds the resource we want to target
    /// * `inner` - A boxed trait object that can serialize to a string.
    ///
    /// # Example
    /// ```
    /// use pushevent::{Event, SerializableEvent};
    /// struct Message;
    ///
    /// impl SerializableEvent for Message {
    ///     fn serialize(&self) -> String {
    ///         String::from("Hello world")
    ///     }
    /// }
    ///
    /// let message = Box::new(Message);
    /// let new_event = Event::new("/events/message", message);
    ///
    /// assert_eq!(new_event.get_res(), String::from("/events/message"));
    /// assert_eq!(new_event.build(), String::from("Hello world"));
    /// ```
    pub fn new(res: String, inner: Box<dyn SerializableEvent>) -> Self {
        Self { res, inner }
    }

    /// Returns the resource path that this event targets. Usually used internally and rarely
    /// useful.
    /// # Example
    /// ```
    /// use pushevent::{Event, SerializableEvent};
    /// struct Message;
    ///
    /// impl SerializableEvent for Message {
    ///     fn serialize(&self) -> String {
    ///         String::from("Hello world")
    ///     }
    /// }
    ///
    /// let message = Box::new(Message);
    /// let new_event = Event::new("/events/message", message);
    ///
    /// assert_eq!(new_event.get_res(), String::from("/events/message"));
    /// ```
    pub fn get_res(&self) -> String {
        self.res.to_owned()
    }

    /// Serializes and returns the inner event/message.
    /// # Example
    /// ```
    /// use pushevent::{Event, SerializableEvent};
    /// struct Message;
    ///
    /// impl SerializableEvent for Message {
    ///     fn serialize(&self) -> String {
    ///         String::from("Hello world")
    ///     }
    /// }
    ///
    /// let message = Box::new(Message);
    /// let new_event = Event::new("/events/message", message);
    /// assert_eq!(new_event.build(), String::from("Hello world"));
    /// ```
    pub fn build(&self) -> String {
        self.inner.serialize()
    }
}