bromine/ipc/stream_emitter/
event_metadata.rs1use 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}