use super::{ExtractError, FromMessageRequest, MessageRequest, Payload};
use crate::message::Message as WireMessage;
#[derive(Debug, Clone)]
pub struct Message<T>(T);
impl<T> Message<T> {
#[must_use]
pub fn into_inner(self) -> T { self.0 }
}
impl<T> std::ops::Deref for Message<T> {
type Target = T;
fn deref(&self) -> &Self::Target { &self.0 }
}
impl<T> FromMessageRequest for Message<T>
where
T: WireMessage,
{
type Error = ExtractError;
fn from_message_request(
_req: &MessageRequest,
payload: &mut Payload<'_>,
) -> Result<Self, Self::Error> {
let (msg, consumed) = T::from_bytes(payload.data).map_err(ExtractError::InvalidPayload)?;
payload.advance(consumed);
Ok(Self(msg))
}
}