use crate::{DdsResult, DdsType, write_arena::WriteArena};
use std::ffi::c_void;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SerdeSample<T> {
payload: Vec<u8>,
_marker: std::marker::PhantomData<T>,
}
impl<T> SerdeSample<T> {
pub fn new(value: &T) -> DdsResult<Self>
where
T: serde::Serialize,
{
let payload = postcard::to_vec::<T, 4096>(value).map_err(|e| {
crate::DdsError::BadParameter(format!("serde serialization failed: {}", e))
})?;
Ok(SerdeSample {
payload: payload.to_vec(),
_marker: std::marker::PhantomData,
})
}
pub fn deserialize(&self) -> DdsResult<T>
where
T: for<'de> serde::Deserialize<'de>,
{
postcard::from_bytes(&self.payload).map_err(|e| {
crate::DdsError::BadParameter(format!("serde deserialization failed: {}", e))
})
}
pub fn as_bytes(&self) -> &[u8] {
&self.payload
}
}
impl<T: serde::Serialize + for<'de> serde::Deserialize<'de> + Send + 'static> DdsType
for SerdeSample<T>
{
fn type_name() -> &'static str {
concat!("SerdeSample<", stringify!(T), ">")
}
fn ops() -> Vec<u32> {
use crate::topic::{OP_ADR, OP_RTS, TYPE_SEQ, SUBTYPE_1BY};
vec![
OP_ADR | TYPE_SEQ | SUBTYPE_1BY,
0, OP_RTS,
]
}
fn descriptor_size() -> u32 {
std::mem::size_of::<Vec<u8>>() as u32
}
fn descriptor_align() -> u32 {
std::mem::align_of::<Vec<u8>>() as u32
}
unsafe fn clone_out(ptr: *const Self) -> Self {
std::ptr::read(ptr)
}
fn write_to_native<'a>(
&'a self,
_arena: &'a mut WriteArena,
) -> DdsResult<*const c_void> {
Ok(self as *const Self as *const c_void)
}
}