2022-09-28 16:59:35 +02:00

57 lines
1.5 KiB
Rust

// 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,
}
impl WakuMessageEvent {
pub fn pubsub_topic(&self) -> &PubsubTopic {
&self.pubsub_topic
}
pub fn message_id(&self) -> &String {
&self.message_id
}
pub fn waku_message(&self) -> &WakuMessage {
&self.waku_message
}
}
pub fn waku_set_event_callback<F: FnMut(Signal)>(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) };
}