Skip to content

Commit

Permalink
feat: modularize the event system and add helper macros for creating …
Browse files Browse the repository at this point in the history
…messages
  • Loading branch information
vyfor committed Dec 6, 2024
1 parent 3a70ea6 commit f302fa1
Show file tree
Hide file tree
Showing 20 changed files with 262 additions and 105 deletions.
21 changes: 9 additions & 12 deletions src/ipc/pipe/platform/unix/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ use std::sync::mpsc::Sender;
use std::thread::JoinHandle;

use crate::ipc::pipe::PipeClientImpl;
use crate::messages::message::{ClientMessage, Event, LocalMessage, Message};
use crate::local_event;
use crate::messages::events::client::ClientEvent;
use crate::messages::events::event::Event;
use crate::messages::events::local::{ClientDisconnectedEvent, ErrorEvent};
use crate::messages::message::Message;

pub struct PipeClient {
id: u32,
Expand Down Expand Up @@ -45,26 +49,19 @@ impl PipeClientImpl for PipeClient {
loop {
match read_pipe.read(&mut buf) {
Ok(n) if n == 0 => {
tx.send(Message::new(
id,
Event::Local(LocalMessage::ClientDisconnected),
))
.ok();
tx.send(local_event!(id, ClientDisconnected)).ok();
break;
}
Ok(n) => {
if let Ok(message) =
ClientMessage::deserialize(&String::from_utf8_lossy(&buf[..n]))
ClientEvent::deserialize(&String::from_utf8_lossy(&buf[..n]))
{
tx.send(Message::new(id, Event::Client(message))).ok();
}
}
Err(e) => {
tx.send(Message::new(
id,
Event::Local(LocalMessage::Error(Box::new(e))),
))
.ok();
tx.send(local_event!(id, Error, ErrorEvent::new(Box::new(e))))
.ok();
break;
}
}
Expand Down
11 changes: 5 additions & 6 deletions src/ipc/pipe/platform/unix/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ use std::sync::{Arc, Mutex};
use std::thread::JoinHandle;

use crate::ipc::pipe::{PipeClientImpl, PipeServerImpl};
use crate::messages::message::{Event, LocalMessage, Message};
use crate::local_event;
use crate::messages::events::local::ErrorEvent;
use crate::messages::message::Message;

use super::client::PipeClient;

Expand Down Expand Up @@ -64,11 +66,8 @@ impl PipeServerImpl for PipeServer {
clients.lock().unwrap().insert(client_id, client);
}
Err(e) => {
tx.send(Message::new(
0,
Event::Local(LocalMessage::Error(Box::new(e))),
))
.ok();
tx.send(local_event!(0, Error, ErrorEvent::new(Box::new(e))))
.ok();
}
}
}
Expand Down
21 changes: 9 additions & 12 deletions src/ipc/pipe/platform/windows/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ use std::sync::Arc;
use std::thread::JoinHandle;

use crate::ipc::pipe::PipeClientImpl;
use crate::messages::message::{ClientMessage, Event, LocalMessage, Message};
use crate::local_event;
use crate::messages::events::client::ClientEvent;
use crate::messages::events::event::Event;
use crate::messages::events::local::{ClientDisconnectedEvent, ErrorEvent};
use crate::messages::message::Message;

pub struct PipeClient {
id: u32,
Expand Down Expand Up @@ -43,26 +47,19 @@ impl PipeClientImpl for PipeClient {
loop {
match pipe.read(&mut buf) {
Ok(n) if n == 0 => {
tx.send(Message::new(
id,
Event::Local(LocalMessage::ClientDisconnected),
))
.ok();
tx.send(local_event!(id, ClientDisconnected)).ok();
break;
}
Ok(n) => {
if let Ok(message) =
ClientMessage::deserialize(&String::from_utf8_lossy(&buf[..n]))
ClientEvent::deserialize(&String::from_utf8_lossy(&buf[..n]))
{
tx.send(Message::new(id, Event::Client(message))).ok();
}
}
Err(e) => {
tx.send(Message::new(
id,
Event::Local(LocalMessage::Error(Box::new(e))),
))
.ok();
tx.send(local_event!(id, Error, ErrorEvent::new(Box::new(e))))
.ok();
break;
}
}
Expand Down
13 changes: 8 additions & 5 deletions src/ipc/pipe/platform/windows/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ use std::sync::{Arc, Mutex};
use std::thread::JoinHandle;

use crate::ipc::pipe::{PipeClientImpl, PipeServerImpl};
use crate::messages::message::{Event, LocalMessage, Message};
use crate::local_event;
use crate::messages::events::local::ErrorEvent;
use crate::messages::message::Message;

use super::client::PipeClient;

Expand Down Expand Up @@ -84,11 +86,12 @@ impl PipeServerImpl for PipeServer {
let error = GetLastError();
if error != ERROR_PIPE_CONNECTED {
CloseHandle(handle);
tx.send(Message::new(
tx.send(local_event!(
0,
Event::Local(LocalMessage::Error(Box::new(
io::Error::from_raw_os_error(error as _),
))),
Error,
ErrorEvent::new(Box::new(io::Error::from_raw_os_error(
error as _
)))
))
.ok();
continue;
Expand Down
13 changes: 8 additions & 5 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ use ipc::{
discord::client::{Connection, RichClient},
pipe::{platform::server::PipeServer, PipeServerImpl},
};
use messages::message::{Event, LocalMessage, Message};
use messages::{
events::{event::Event, local::LocalEvent},
message::Message,
};

mod ipc;
mod json;
Expand All @@ -22,15 +25,15 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
pipe.start()?;

while let Ok(message) = rx.recv() {
match message.message {
match message.event {
Event::Client(_client_message) => {}
Event::Local(server_message) => match server_message {
LocalMessage::ClientDisconnected => {
LocalEvent::ClientDisconnected(_) => {
println!("Client {} disconnected", message.client_id);
break;
}
LocalMessage::Error(e) => {
println!("Error: {}", e);
LocalEvent::Error(event) => {
println!("Error: {}", event.error);
break;
}
},
Expand Down
6 changes: 6 additions & 0 deletions src/messages/events/client/clear_activity.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#[derive(Debug, Default)]
pub struct ClearActivityEvent;

impl ClearActivityEvent {
pub fn on_clear_activity(self) {}
}
6 changes: 6 additions & 0 deletions src/messages/events/client/connect.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#[derive(Debug, Default)]
pub struct ConnectEvent;

impl ConnectEvent {
pub fn on_connect(self) {}
}
6 changes: 6 additions & 0 deletions src/messages/events/client/disconnect.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#[derive(Debug, Default)]
pub struct DisconnectEvent;

impl DisconnectEvent {
pub fn on_disconnect(self) {}
}
14 changes: 14 additions & 0 deletions src/messages/events/client/initialize.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
use crate::types::Config;

#[derive(Debug)]
pub struct InitializeEvent {
pub config: Config,
}

impl InitializeEvent {
pub fn new(config: Config) -> Self {
Self { config }
}

pub fn on_initialize(self) {}
}
74 changes: 74 additions & 0 deletions src/messages/events/client/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
use crate::{
json::deserialize::{Deserializable, Json},
presence::activity::ActivityContext,
types::Config,
};

pub mod clear_activity;
pub mod connect;
pub mod disconnect;
pub mod initialize;
pub mod reset_timestamp;
pub mod update_activity;
pub mod update_workspace;

pub use clear_activity::ClearActivityEvent;
pub use connect::ConnectEvent;
pub use disconnect::DisconnectEvent;
pub use initialize::InitializeEvent;
pub use reset_timestamp::ResetTimestampEvent;
pub use update_activity::UpdateActivityEvent;
pub use update_workspace::UpdateWorkspaceEvent;

#[derive(Debug)]
pub enum ClientEvent {
Connect(ConnectEvent),
Initialize(InitializeEvent),
UpdateActivity(UpdateActivityEvent),
ClearActivity(ClearActivityEvent),
UpdateWorkspace(UpdateWorkspaceEvent),
ResetTimestamp(ResetTimestampEvent),
Disconnect(DisconnectEvent),
}

macro_rules! data {
($map:expr) => {
$map.get("data")
.and_then(|v| v.as_map())
.ok_or("Missing or invalid 'data' field")?
};
($map:expr, $expr:expr) => {
$map.get("data")
.and_then($expr)
.ok_or("Missing or invalid 'data' field")?
};
}

impl ClientEvent {
// { type: string, data: any }
pub fn deserialize(json: &str) -> Result<Self, String> {
let map = Json::deserialize(json)?;

let ty = map
.get("type")
.and_then(|v| v.as_str())
.ok_or("Missing 'type' field")?;

Ok(match ty {
"connect" => Self::Connect(ConnectEvent),
"initialize" => {
Self::Initialize(InitializeEvent::new(Config::deserialize(data!(map))?))
}
"update_activity" => Self::UpdateActivity(UpdateActivityEvent::new(
ActivityContext::deserialize(data!(map))?,
)),
"clear_activity" => Self::ClearActivity(ClearActivityEvent),
"update_workspace" => {
Self::UpdateWorkspace(UpdateWorkspaceEvent::new(data!(map, |v| v.as_string())))
}
"reset_timestamp" => Self::ResetTimestamp(ResetTimestampEvent),
"disconnect" => Self::Disconnect(DisconnectEvent),
_ => return Err(format!("Unknown message type: {}", ty)),
})
}
}
6 changes: 6 additions & 0 deletions src/messages/events/client/reset_timestamp.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#[derive(Debug, Default)]
pub struct ResetTimestampEvent;

impl ResetTimestampEvent {
pub fn on_timestamp_reset(self) {}
}
14 changes: 14 additions & 0 deletions src/messages/events/client/update_activity.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
use crate::presence::activity::ActivityContext;

#[derive(Debug)]
pub struct UpdateActivityEvent {
pub context: ActivityContext,
}

impl UpdateActivityEvent {
pub fn new(context: ActivityContext) -> Self {
Self { context }
}

pub fn on_update_activity(self) {}
}
12 changes: 12 additions & 0 deletions src/messages/events/client/update_workspace.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#[derive(Debug)]
pub struct UpdateWorkspaceEvent {
pub workspace: String,
}

impl UpdateWorkspaceEvent {
pub fn new(workspace: String) -> Self {
Self { workspace }
}

pub fn on_update_workspace(self) {}
}
7 changes: 7 additions & 0 deletions src/messages/events/event.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
use super::{client::ClientEvent, local::LocalEvent};

#[derive(Debug)]
pub enum Event {
Client(ClientEvent),
Local(LocalEvent),
}
6 changes: 6 additions & 0 deletions src/messages/events/local/client_disconnected.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#[derive(Debug, Default)]
pub struct ClientDisconnectedEvent;

impl ClientDisconnectedEvent {
pub fn on_client_disconnected(self) {}
}
14 changes: 14 additions & 0 deletions src/messages/events/local/error.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
type Error = Box<dyn std::error::Error + Send + Sync>;

#[derive(Debug)]
pub struct ErrorEvent {
pub error: Error,
}

impl ErrorEvent {
pub fn new(error: Error) -> Self {
Self { error }
}

pub fn on_error(self) {}
}
11 changes: 11 additions & 0 deletions src/messages/events/local/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
pub mod client_disconnected;
pub mod error;

pub use client_disconnected::ClientDisconnectedEvent;
pub use error::ErrorEvent;

#[derive(Debug)]
pub enum LocalEvent {
ClientDisconnected(ClientDisconnectedEvent),
Error(ErrorEvent),
}
3 changes: 3 additions & 0 deletions src/messages/events/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pub mod client;
pub mod event;
pub mod local;
Loading

0 comments on commit f302fa1

Please sign in to comment.