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
use crate::ring_buffer::RingBuffer;
use std::sync::Arc;

#[allow(unused_imports)]
use crate::Eventador;

/// A handle to publish events to the event-bus.
///
/// Although the [`Eventador::publish`] function has the exact same behavior, this handle offers an API
/// that mirrors the `AsyncPublisher` API.
///
/// # Example
///
/// Basic usage:
///
/// ```ignore
/// let eventbus = Eventador::new(4)?;
/// let mut publisher = eventbus.publisher();
///
/// let i: usize = 1234;
/// publisher.send(i);
/// ```
///
pub struct Publisher {
    ring: Arc<RingBuffer>,
}

impl Publisher {
    pub(crate) fn new(ring: Arc<RingBuffer>) -> Self {
        Self { ring }
    }

    /// Publish an event on the event-bus.
    ///
    /// # Example
    ///
    /// Basic usage:
    ///
    /// ```ignore
    /// let eventbus = Eventador::new(4)?;
    ///
    /// let i: usize = 1234;
    /// eventbus.publish(i);
    /// ```
    ///
    pub fn send<T: 'static + Send + Sync>(&mut self, event: T) {
        let sequence = self.ring.next();

        let envelope = self
            .ring
            .get_envelope(sequence)
            .expect("ring buffer was not pre-populated with empty event envelopes");

        envelope.overwrite(sequence, event);
    }
}