use zvariant::{
serialized::{self, Data},
Signature, Type,
};
use crate::{Error, Message, Result};
#[derive(Clone, Debug)]
pub struct Body {
data: Data<'static, 'static>,
msg: Message,
}
impl Body {
pub(super) fn new(data: Data<'static, 'static>, msg: Message) -> Self {
Self { data, msg }
}
pub fn deserialize<'s, B>(&'s self) -> Result<B>
where
B: zvariant::DynamicDeserialize<'s>,
{
let body_sig = self
.signature()
.unwrap_or_else(|| Signature::from_static_str_unchecked(""));
self.data
.deserialize_for_dynamic_signature(body_sig)
.map_err(Error::from)
.map(|b| b.0)
}
pub fn deserialize_unchecked<'d, 'm: 'd, B>(&'m self) -> Result<B>
where
B: serde::de::Deserialize<'d> + Type,
{
self.data.deserialize().map_err(Error::from).map(|b| b.0)
}
pub fn signature(&self) -> Option<Signature<'_>> {
self.msg.inner.quick_fields.signature(&self.msg)
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn data(&self) -> &serialized::Data<'static, 'static> {
&self.data
}
pub fn message(&self) -> &Message {
&self.msg
}
}