use std::{marker::PhantomData, ops::Deref};
use bytes::Bytes;
use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize, Serializer};
use crate::{
dds::traits::{key::Keyed, serde_adapters::*},
messages::submessages::submessages::RepresentationIdentifier,
serialization::error::Result,
};
pub(crate) struct NoKeyWrapper<D> {
pub(crate) d: D,
}
impl<D> From<D> for NoKeyWrapper<D> {
fn from(d: D) -> Self {
Self { d }
}
}
impl<D> Deref for NoKeyWrapper<D> {
type Target = D;
fn deref(&self) -> &Self::Target {
&self.d
}
}
impl<D> Keyed for NoKeyWrapper<D> {
type K = ();
fn key(&self) {}
}
impl<'de, D> Deserialize<'de> for NoKeyWrapper<D>
where
D: Deserialize<'de>,
{
fn deserialize<R>(deserializer: R) -> std::result::Result<Self, R::Error>
where
R: Deserializer<'de>,
{
D::deserialize(deserializer).map(|d| Self { d })
}
}
impl<D> Serialize for NoKeyWrapper<D>
where
D: Serialize,
{
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
self.d.serialize(serializer)
}
}
pub struct SAWrapper<SA> {
no_key: PhantomData<SA>,
}
impl<D, SA> no_key::SerializerAdapter<NoKeyWrapper<D>> for SAWrapper<SA>
where
D: Serialize,
SA: no_key::SerializerAdapter<D>,
{
fn output_encoding() -> RepresentationIdentifier {
SA::output_encoding()
}
fn to_bytes(value: &NoKeyWrapper<D>) -> Result<Bytes> {
SA::to_bytes(&value.d)
}
}
impl<D, SA> with_key::SerializerAdapter<NoKeyWrapper<D>> for SAWrapper<SA>
where
D: Serialize,
SA: no_key::SerializerAdapter<D>,
{
fn key_to_bytes(_value: &()) -> Result<Bytes> {
Ok(Bytes::new())
}
}
pub struct DAWrapper<DA> {
no_key: PhantomData<DA>,
}
impl<D, DA> no_key::DeserializerAdapter<NoKeyWrapper<D>> for DAWrapper<DA>
where
D: DeserializeOwned,
DA: no_key::DeserializerAdapter<D>,
{
fn supported_encodings() -> &'static [RepresentationIdentifier] {
DA::supported_encodings()
}
fn from_bytes(input_bytes: &[u8], encoding: RepresentationIdentifier) -> Result<NoKeyWrapper<D>> {
DA::from_bytes(input_bytes, encoding).map(|d| NoKeyWrapper::<D> { d })
}
}
impl<D, DA> with_key::DeserializerAdapter<NoKeyWrapper<D>> for DAWrapper<DA>
where
D: DeserializeOwned,
DA: no_key::DeserializerAdapter<D>,
{
fn key_from_bytes(
_input_bytes: &[u8],
_encoding: RepresentationIdentifier,
) -> Result<<NoKeyWrapper<D> as Keyed>::K> {
Ok(())
}
}