use std::{io, ops::Deref};
use serde::{Deserialize, Deserializer, Serialize, Serializer, de::DeserializeOwned};
use crate::{
dds::traits::key::Keyed, dds::traits::serde_adapters::DeserializerAdapter,
dds::traits::serde_adapters::SerializerAdapter, serialization,
messages::submessages::submessages::RepresentationIdentifier,
};
pub struct NoKeyWrapper<D> {
pub d: D,
}
impl<D> From<D> for NoKeyWrapper<D> {
fn from(d: D) -> Self {
NoKeyWrapper { 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 get_key(&self) -> () {
()
}
}
impl<'de, D> Deserialize<'de> for NoKeyWrapper<D>
where
D: Deserialize<'de>,
{
fn deserialize<R>(deserializer: R) -> std::result::Result<NoKeyWrapper<D>, R::Error>
where
R: Deserializer<'de>,
{
D::deserialize(deserializer).map(|d| NoKeyWrapper::<D> { 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)
}
}
impl<D: Serialize, SA: SerializerAdapter<D>> SerializerAdapter<NoKeyWrapper<D>> for SAWrapper<SA> {
fn output_encoding() -> RepresentationIdentifier {
SA::output_encoding()
}
fn to_writer<W: io::Write>(
writer: W,
value: &NoKeyWrapper<D>,
) -> serialization::error::Result<()> {
SA::to_writer(writer, &value.d)
}
}
pub struct SAWrapper<SA> {
inner: SA,
}
impl<D: DeserializeOwned, SA: DeserializerAdapter<D>> DeserializerAdapter<NoKeyWrapper<D>>
for SAWrapper<SA>
{
fn supported_encodings() -> &'static [RepresentationIdentifier] {
SA::supported_encodings()
}
fn from_bytes<'de>(
input_bytes: &'de [u8],
encoding: RepresentationIdentifier,
) -> serialization::error::Result<NoKeyWrapper<D>> {
SA::from_bytes(input_bytes, encoding).map(|d| NoKeyWrapper::<D> { d })
}
}
impl<D> NoKeyWrapper<D> {
pub fn unwrap(self) -> D {
self.d
}
}