From aceff4d74924bb61d9b6caa4aa9c8893d96722a2 Mon Sep 17 00:00:00 2001 From: Daniel Sanchez Quiros Date: Wed, 28 Sep 2022 16:47:51 +0200 Subject: [PATCH] Implement event module --- waku/src/events/mod.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ waku/src/lib.rs | 1 + 2 files changed, 43 insertions(+) create mode 100644 waku/src/events/mod.rs diff --git a/waku/src/events/mod.rs b/waku/src/events/mod.rs new file mode 100644 index 0000000..22686c7 --- /dev/null +++ b/waku/src/events/mod.rs @@ -0,0 +1,42 @@ +// std +use std::ffi::{c_char, CStr}; +// crates +use serde::{Deserialize, Serialize}; +// internal +use crate::general::{PubsubTopic, WakuMessage}; + +#[derive(Serialize, Deserialize)] +pub struct Signal { + #[serde(alias = "type")] + _type: String, + event: Event, +} + +#[derive(Serialize, Deserialize)] +#[serde(tag = "untagged", rename_all = "camelCase")] +pub enum Event { + WakuMessage(WakuMessageEvent), +} + +/// Type of `event` field for a `message` event +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct WakuMessageEvent { + /// The pubsub topic on which the message was received + pubsub_topic: PubsubTopic, + /// The message id + message_id: String, + /// The message in [`WakuMessage`] format + waku_message: WakuMessage, +} + +pub fn waku_set_event_callback(mut callback: F) { + let mut callback = move |data: *const c_char| { + let raw_response = unsafe { CStr::from_ptr(data) } + .to_str() + .expect("Not null ptr"); + let data: Signal = serde_json::from_str(raw_response).expect("Parsing signal to succeed"); + callback(data); + }; + unsafe { waku_sys::waku_set_event_callback(&mut callback as *mut _ as *mut std::ffi::c_void) }; +} diff --git a/waku/src/lib.rs b/waku/src/lib.rs index 0d6c116..2c44c9a 100644 --- a/waku/src/lib.rs +++ b/waku/src/lib.rs @@ -1,4 +1,5 @@ mod general; +mod events; #[cfg(test)] mod tests {