use std::{marker::PhantomData, ops::Deref};
use bytes::Bytes;
use crate::{
dds::adapters::*, messages::submessages::submessages::RepresentationIdentifier, Keyed,
};
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) {}
}
pub struct SAWrapper<SA> {
no_key: PhantomData<SA>,
}
impl<D, SA> no_key::SerializerAdapter<NoKeyWrapper<D>> for SAWrapper<SA>
where
SA: no_key::SerializerAdapter<D>,
{
type Error = SA::Error;
fn output_encoding() -> RepresentationIdentifier {
SA::output_encoding()
}
fn to_bytes(value: &NoKeyWrapper<D>) -> Result<Bytes, SA::Error> {
SA::to_bytes(&value.d)
}
}
impl<D, SA> with_key::SerializerAdapter<NoKeyWrapper<D>> for SAWrapper<SA>
where
SA: no_key::SerializerAdapter<D>,
{
fn key_to_bytes(_value: &()) -> Result<Bytes, SA::Error> {
Ok(Bytes::new())
}
}
pub struct DAWrapper<DA> {
no_key: PhantomData<DA>,
}
impl<D, DA> no_key::DeserializerAdapter<NoKeyWrapper<D>> for DAWrapper<DA>
where
DA: no_key::DeserializerAdapter<D>,
{
type Error = DA::Error;
type Decoded = DA::Decoded;
fn supported_encodings() -> &'static [RepresentationIdentifier] {
DA::supported_encodings()
}
fn transform_decoded(deserialized: Self::Decoded) -> NoKeyWrapper<D> {
NoKeyWrapper::<D> {
d: DA::transform_decoded(deserialized),
}
}
}
impl<D, DA> with_key::DeserializerAdapter<NoKeyWrapper<D>> for DAWrapper<DA>
where
DA: no_key::DeserializerAdapter<D>,
{
type DecodedKey = ();
#[allow(clippy::unused_unit, clippy::semicolon_if_nothing_returned)]
fn transform_decoded_key(_decoded_key: Self::DecodedKey) -> () {
()
}
}
impl<D, DA> no_key::DefaultDecoder<NoKeyWrapper<D>> for DAWrapper<DA>
where
DA: no_key::DefaultDecoder<D>,
{
type Decoder = DA::Decoder;
const DECODER: Self::Decoder = DA::DECODER;
}
impl<D, DA> with_key::DefaultDecoder<NoKeyWrapper<D>> for DAWrapper<DA>
where
DA: no_key::DefaultDecoder<D>,
{
type Decoder = DecodeWrapper<DA::Decoder>;
const DECODER: Self::Decoder = DecodeWrapper::new(DA::DECODER);
}
#[derive(Clone)]
pub struct DecodeWrapper<NoKeyDecode> {
no_key: NoKeyDecode,
}
impl<NoKeyDecode> DecodeWrapper<NoKeyDecode> {
pub const fn new(no_key: NoKeyDecode) -> Self {
DecodeWrapper { no_key }
}
}
impl<Decoded, NoKeyDecode> no_key::Decode<Decoded> for DecodeWrapper<NoKeyDecode>
where
NoKeyDecode: no_key::Decode<Decoded>,
{
type Error = NoKeyDecode::Error;
fn decode_bytes(
self,
input_bytes: &[u8],
encoding: RepresentationIdentifier,
) -> Result<Decoded, Self::Error> {
self.no_key.decode_bytes(input_bytes, encoding)
}
}
impl<Decoded, NoKeyDecode> with_key::Decode<Decoded, ()> for DecodeWrapper<NoKeyDecode>
where
NoKeyDecode: no_key::Decode<Decoded>,
{
fn decode_key_bytes(
self,
_input_key_bytes: &[u8],
_encoding: RepresentationIdentifier,
) -> Result<(), Self::Error> {
Ok(())
}
}