#[cfg(feature = "serde")]
use serde::{
de::{self, Deserializer, Visitor},
forward_to_deserialize_any,
};
#[cfg(feature = "serde")]
use crate::value::ValueDeserializer;
use crate::{BinaryParser, Error, Value};
#[derive(Debug, Clone, PartialEq)]
pub struct MethodCall<'i> {
pub method_name: &'i str,
pub type_name: &'i str,
pub call_context: Option<&'i str>,
pub args: Option<Vec<Value<'i>>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct MethodReturn<'i> {
pub return_value: Option<Value<'i>>,
pub call_context: Option<&'i str>,
pub args: Option<Vec<Value<'i>>>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum RemotingMessage<'i> {
MethodCall(MethodCall<'i>),
MethodReturn(MethodReturn<'i>),
Value(Value<'i>),
}
impl<'i> RemotingMessage<'i> {
pub fn parse(input: &'i [u8]) -> Result<Self, Error<'i>> {
let parser = BinaryParser::default();
parser.deserialize(input)
}
#[cfg(feature = "serde")]
fn to_deserializer<V: Visitor<'i>>(&self, visitor: &V) -> Result<ValueDeserializer<'i, '_>, de::value::Error> {
use serde::de::{Error, Unexpected};
match self {
Self::MethodCall(..) => Err(de::value::Error::invalid_type(Unexpected::Other("method call"), visitor)),
Self::MethodReturn(..) => Err(de::value::Error::invalid_type(Unexpected::Other("method return"), visitor)),
Self::Value(root_object) => Ok(ValueDeserializer::new(root_object)),
}
}
}
#[cfg(feature = "serde")]
impl<'de> Deserializer<'de> for RemotingMessage<'de> {
type Error = de::value::Error;
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.to_deserializer(&visitor)?.deserialize_any(visitor)
}
fn deserialize_struct<V>(
self,
name: &'static str,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.to_deserializer(&visitor)?.deserialize_struct(name, fields, visitor)
}
forward_to_deserialize_any! {
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
bytes byte_buf option unit unit_struct newtype_struct seq tuple
tuple_struct map enum identifier ignored_any
}
}