mirror of
https://github.com/logos-messaging/logos-messaging-rust-bindings.git
synced 2026-01-03 22:43:07 +00:00
Fix signal -> event -> message deserialization
This commit is contained in:
parent
c1ac5a939d
commit
464fbcd98b
@ -13,6 +13,7 @@ use once_cell::sync::Lazy;
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
// internal
|
// internal
|
||||||
use crate::general::{WakuMessage, WakuPubSubTopic};
|
use crate::general::{WakuMessage, WakuPubSubTopic};
|
||||||
|
use crate::MessageId;
|
||||||
|
|
||||||
/// Event signal
|
/// Event signal
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
@ -34,7 +35,7 @@ impl Signal {
|
|||||||
/// For now just WakuMessage is supported
|
/// For now just WakuMessage is supported
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
#[serde(tag = "untagged", rename_all = "camelCase")]
|
#[serde(untagged, rename_all = "camelCase")]
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
WakuMessage(WakuMessageEvent),
|
WakuMessage(WakuMessageEvent),
|
||||||
}
|
}
|
||||||
@ -46,7 +47,7 @@ pub struct WakuMessageEvent {
|
|||||||
/// The pubsub topic on which the message was received
|
/// The pubsub topic on which the message was received
|
||||||
pubsub_topic: WakuPubSubTopic,
|
pubsub_topic: WakuPubSubTopic,
|
||||||
/// The message id
|
/// The message id
|
||||||
message_id: String,
|
message_id: MessageId,
|
||||||
/// The message in [`WakuMessage`] format
|
/// The message in [`WakuMessage`] format
|
||||||
waku_message: WakuMessage,
|
waku_message: WakuMessage,
|
||||||
}
|
}
|
||||||
@ -93,16 +94,29 @@ extern "C" fn callback(data: *const c_char) {
|
|||||||
/// which are used to react to asynchronous events in Waku
|
/// which are used to react to asynchronous events in Waku
|
||||||
pub fn waku_set_event_callback<F: FnMut(Signal) + Send + Sync + 'static>(f: F) {
|
pub fn waku_set_event_callback<F: FnMut(Signal) + Send + Sync + 'static>(f: F) {
|
||||||
set_callback(f);
|
set_callback(f);
|
||||||
unsafe { waku_sys::waku_set_event_callback(&mut callback as *mut _ as *mut std::ffi::c_void) };
|
unsafe { waku_sys::waku_set_event_callback(callback as *mut std::ffi::c_void) };
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::events::waku_set_event_callback;
|
use crate::events::waku_set_event_callback;
|
||||||
|
use crate::{Event, MessageId, Signal, WakuMessage, WakuPubSubTopic};
|
||||||
|
|
||||||
// TODO: how to actually send a signal and check if the callback is run?
|
// TODO: how to actually send a signal and check if the callback is run?
|
||||||
#[test]
|
#[test]
|
||||||
fn set_event_callback() {
|
fn set_event_callback() {
|
||||||
waku_set_event_callback(|_signal| {});
|
waku_set_event_callback(|_signal| {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deserialize_signal() {
|
||||||
|
let s = "{\"type\":\"message\",\"event\":{\"messageId\":\"0x26ff3d7fbc950ea2158ce62fd76fd745eee0323c9eac23d0713843b0f04ea27c\",\"pubsubTopic\":\"/waku/2/default-waku/proto\",\"wakuMessage\":{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660}}}";
|
||||||
|
let _: Signal = serde_json::from_str(s).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deserialize_event() {
|
||||||
|
let e = "{\"messageId\":\"0x26ff3d7fbc950ea2158ce62fd76fd745eee0323c9eac23d0713843b0f04ea27c\",\"pubsubTopic\":\"/waku/2/default-waku/proto\",\"wakuMessage\":{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660}}";
|
||||||
|
let _: Event = serde_json::from_str(e).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -80,7 +80,9 @@ pub struct WakuMessage {
|
|||||||
payload: Vec<u8>,
|
payload: Vec<u8>,
|
||||||
/// The content topic to be set on the message
|
/// The content topic to be set on the message
|
||||||
content_topic: WakuContentTopic,
|
content_topic: WakuContentTopic,
|
||||||
|
// TODO: check if missing default should be 0
|
||||||
/// The Waku Message version number
|
/// The Waku Message version number
|
||||||
|
#[serde(default)]
|
||||||
version: WakuMessageVersion,
|
version: WakuMessageVersion,
|
||||||
/// Unix timestamp in nanoseconds
|
/// Unix timestamp in nanoseconds
|
||||||
timestamp: usize,
|
timestamp: usize,
|
||||||
@ -325,7 +327,7 @@ impl FromStr for WakuContentTopic {
|
|||||||
|
|
||||||
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
|
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
|
||||||
if let Ok((application_name, version, content_topic_name, encoding)) =
|
if let Ok((application_name, version, content_topic_name, encoding)) =
|
||||||
scanf!(s, "/{}/{}/{}/{}", String, usize, String, Encoding)
|
scanf!(s, "/{}/{}/{}/{:/.+?/}", String, usize, String, Encoding)
|
||||||
{
|
{
|
||||||
Ok(WakuContentTopic {
|
Ok(WakuContentTopic {
|
||||||
application_name,
|
application_name,
|
||||||
@ -498,4 +500,10 @@ mod tests {
|
|||||||
let s = "/waku/2/default-waku/proto";
|
let s = "/waku/2/default-waku/proto";
|
||||||
let _: WakuPubSubTopic = s.parse().unwrap();
|
let _: WakuPubSubTopic = s.parse().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deserialize_waku_message() {
|
||||||
|
let message = "{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660}";
|
||||||
|
let _: WakuMessage = serde_json::from_str(message).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user