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}