Add EventReceivePayload trait and BytePayload wrapper

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/12/head
trivernis 3 years ago
parent 0d8d66100d
commit a485f664a0
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -1,5 +1,6 @@
use crate::error::Result; use crate::error::Result;
use crate::events::generate_event_id; use crate::events::generate_event_id;
use crate::events::payload::EventReceivePayload;
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tokio::io::{AsyncRead, AsyncReadExt}; use tokio::io::{AsyncRead, AsyncReadExt};
@ -45,8 +46,8 @@ impl Event {
} }
/// Decodes the data to the given type /// Decodes the data to the given type
pub fn data<T: DeserializeOwned>(&self) -> Result<T> { pub fn data<T: EventReceivePayload>(&self) -> Result<T> {
let data = rmp_serde::from_read(&self.data[..])?; let data = T::from_payload_bytes(&self.data[..])?;
Ok(data) Ok(data)
} }

@ -1,6 +1,10 @@
use crate::prelude::IPCResult; use crate::prelude::IPCResult;
use serde::de::DeserializeOwned;
use serde::Serialize; use serde::Serialize;
use std::io::Read;
/// Trait to convert event data into sending bytes
/// It is implemented for all types that implement Serialize
pub trait EventSendPayload { pub trait EventSendPayload {
fn to_payload_bytes(self) -> IPCResult<Vec<u8>>; fn to_payload_bytes(self) -> IPCResult<Vec<u8>>;
} }
@ -15,3 +19,38 @@ where
Ok(bytes) Ok(bytes)
} }
} }
/// Trait to get the event data from receiving bytes.
/// It is implemented for all types that are DeserializeOwned
pub trait EventReceivePayload: Sized {
fn from_payload_bytes<R: Read>(reader: R) -> IPCResult<Self>;
}
impl<T> EventReceivePayload for T
where
T: DeserializeOwned,
{
fn from_payload_bytes<R: Read>(reader: R) -> IPCResult<Self> {
let type_data = rmp_serde::from_read(reader)?;
Ok(type_data)
}
}
/// A payload wrapper type for sending bytes directly without
/// serializing them
#[derive(Clone, Debug)]
pub struct BytePayload {
bytes: Vec<u8>,
}
impl BytePayload {
pub fn new(bytes: Vec<u8>) -> Self {
Self { bytes }
}
}
impl EventSendPayload for BytePayload {
fn to_payload_bytes(self) -> IPCResult<Vec<u8>> {
Ok(self.bytes)
}
}

@ -109,6 +109,7 @@ mod namespaces;
pub use events::error_event; pub use events::error_event;
pub use events::event; pub use events::event;
pub use events::event_handler; pub use events::event_handler;
pub use events::payload;
pub use ipc::builder::IPCBuilder; pub use ipc::builder::IPCBuilder;
pub use macros::*; pub use macros::*;
pub use namespaces::builder::NamespaceBuilder; pub use namespaces::builder::NamespaceBuilder;
@ -126,5 +127,6 @@ pub mod prelude {
pub use crate::namespace::Namespace; pub use crate::namespace::Namespace;
pub use crate::namespaces::builder::NamespaceBuilder; pub use crate::namespaces::builder::NamespaceBuilder;
pub use crate::namespaces::provider_trait::*; pub use crate::namespaces::provider_trait::*;
pub use crate::payload::*;
pub use crate::*; pub use crate::*;
} }

Loading…
Cancel
Save