use rustecal_core::types::DataTypeInfo;
use rustecal_pubsub::typed_publisher::PublisherMessage;
use rustecal_pubsub::typed_subscriber::SubscriberMessage;
use std::{borrow::Cow, sync::Arc};
pub struct BytesMessage<'a> {
pub data: Cow<'a, [u8]>,
}
impl<'a> BytesMessage<'a> {
pub fn owned(data: Arc<[u8]>) -> BytesMessage<'static> {
BytesMessage {
data: Cow::Owned(data.as_ref().to_vec()),
}
}
}
impl<'a> SubscriberMessage<'a> for BytesMessage<'a> {
fn datatype() -> DataTypeInfo {
DataTypeInfo {
encoding: "raw".into(),
type_name: "bytes".into(),
descriptor: Vec::new(),
}
}
fn from_bytes(bytes: &'a [u8], _info: &DataTypeInfo) -> Option<Self> {
Some(BytesMessage {
data: Cow::Borrowed(bytes),
})
}
}
impl<'a> PublisherMessage for BytesMessage<'a> {
fn datatype() -> DataTypeInfo {
<BytesMessage as SubscriberMessage>::datatype()
}
fn to_bytes(&self) -> Arc<[u8]> {
match &self.data {
Cow::Owned(vec) => Arc::from(&vec[..]),
Cow::Borrowed(s) => Arc::from(*s),
}
}
}