bromine/ipc/stream_emitter/
event_metadata.rs

1use crate::context::Context;
2use crate::error;
3use crate::error::Error;
4use crate::event::{Event, EventType};
5use crate::payload::IntoPayload;
6use std::mem;
7
8pub(crate) struct EventMetadata<P: IntoPayload> {
9    pub(crate) event: Option<Event>,
10    pub(crate) ctx: Option<Context>,
11    pub(crate) event_namespace: Option<Option<String>>,
12    pub(crate) event_name: Option<String>,
13    pub(crate) res_id: Option<Option<u64>>,
14    pub(crate) event_type: Option<EventType>,
15    pub(crate) payload: Option<P>,
16}
17
18impl<P: IntoPayload> EventMetadata<P> {
19    pub fn get_event(&mut self) -> error::Result<&Event> {
20        if self.event.is_none() {
21            self.build_event()?;
22        }
23        Ok(self.event.as_ref().unwrap())
24    }
25
26    pub fn take_event(mut self) -> error::Result<Option<Event>> {
27        if self.event.is_none() {
28            self.build_event()?;
29        }
30        Ok(mem::take(&mut self.event))
31    }
32
33    fn build_event(&mut self) -> error::Result<()> {
34        let ctx = self.ctx.take().ok_or(Error::InvalidState)?;
35        let event = self.event_name.take().ok_or(Error::InvalidState)?;
36        let namespace = self.event_namespace.take().ok_or(Error::InvalidState)?;
37        let payload = self.payload.take().ok_or(Error::InvalidState)?;
38        let res_id = self.res_id.take().ok_or(Error::InvalidState)?;
39        let event_type = self.event_type.take().ok_or(Error::InvalidState)?;
40        let payload_bytes = payload.into_payload(&ctx)?;
41
42        let event = Event::new(
43            namespace,
44            event,
45            payload_bytes,
46            res_id,
47            event_type,
48        );
49
50        self.event = Some(event);
51
52        Ok(())
53    }
54}