voxelize/world/
events.rs

1use serde::Serialize;
2use serde_json::json;
3
4use crate::{ClientFilter, Vec2};
5
6#[derive(Default, Clone, Debug)]
7pub struct Event {
8    pub name: String,
9    pub payload: Option<String>,
10    pub filter: Option<ClientFilter>,
11    pub location: Option<Vec2<i32>>,
12}
13
14impl Event {
15    pub fn new(name: &str) -> EventBuilder {
16        EventBuilder::new(name)
17    }
18}
19
20#[derive(Default)]
21pub struct EventBuilder {
22    name: String,
23    payload: Option<String>,
24    filter: Option<ClientFilter>,
25    location: Option<Vec2<i32>>,
26}
27
28impl EventBuilder {
29    pub fn new(name: &str) -> Self {
30        Self {
31            name: name.to_owned(),
32            payload: Some(json!("{}").to_string()),
33            ..Default::default()
34        }
35    }
36
37    pub fn payload<T: Serialize>(mut self, payload: T) -> Self {
38        self.payload = Some(json!(payload).to_string());
39        self
40    }
41
42    pub fn filter(mut self, filter: ClientFilter) -> Self {
43        self.filter = Some(filter);
44        self
45    }
46
47    pub fn location(mut self, location: Vec2<i32>) -> Self {
48        self.location = Some(location);
49        self
50    }
51
52    pub fn build(self) -> Event {
53        Event {
54            name: self.name,
55            payload: self.payload,
56            filter: self.filter,
57            location: self.location,
58        }
59    }
60}
61
62#[derive(Default)]
63pub struct Events {
64    pub queue: Vec<Event>,
65}
66
67impl Events {
68    pub fn new() -> Self {
69        Self::default()
70    }
71
72    pub fn dispatch(&mut self, event: Event) {
73        self.queue.push(event);
74    }
75}