rustdds 0.1.0

Rust DDS implementation with RTPS
Documentation
use serde::{
  de::{Visitor, Error},
};
use super::{
  builtin_data_deserializer::BuiltinDataDeserializer, cdr_deserializer::CDRDeserializerAdapter,
};

use crate::{messages::submessages::submessage_elements::serialized_payload::RepresentationIdentifier};

use crate::dds::traits::serde_adapters::DeserializerAdapter;

use std::convert::TryFrom;

impl<'de> Visitor<'de> for BuiltinDataDeserializer {
  type Value = BuiltinDataDeserializer;
  fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
    write!(formatter, "ParameterId")
  }

  fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
  where
    E: Error,
  {
    let rep: RepresentationIdentifier =
      match CDRDeserializerAdapter::<u16>::from_bytes(&v[..2], RepresentationIdentifier::CDR_LE) {
        Ok(v) => match RepresentationIdentifier::try_from(v) {
          Ok(v) => v,
          _ => return Err(E::missing_field("representation identifier")),
        },
        Err(_) => return Err(E::missing_field("representation identifier")),
      };

    match rep {
      RepresentationIdentifier::PL_CDR_LE => Ok(self.parse_data_little_endian(&v[2..])),
      RepresentationIdentifier::PL_CDR_BE => Ok(self.parse_data_big_endian(&v[2..])),
      _ => Err(E::missing_field("representation identifier")),
    }
  }
}