fidl_next_protocol/
message.rs1use fidl_next_codec::{AsDecoder, DecodeError, DecoderExt};
6
7use crate::Transport;
8use crate::wire::MessageHeader;
9
10pub struct Message<T: Transport> {
16 buffer: T::RecvBuffer,
17}
18
19impl<T: Transport> Message<T> {
20 pub fn decode(mut buffer: T::RecvBuffer) -> Result<Self, DecodeError> {
22 let _ = buffer.as_decoder().decode_prefix::<MessageHeader>()?;
23 Ok(Self { buffer })
24 }
25
26 pub fn header(&mut self) -> MessageHeader {
28 let mut decoder = self.buffer.as_decoder();
29 unsafe { *decoder.take_slot::<MessageHeader>().unwrap().deref_unchecked() }
30 }
31}
32
33unsafe impl<'de, T: Transport> AsDecoder<'de> for Message<T> {
34 type Decoder = <T::RecvBuffer as AsDecoder<'de>>::Decoder;
35
36 fn as_decoder(&'de mut self) -> Self::Decoder {
37 let mut decoder = self.buffer.as_decoder();
38 let _ = decoder.take_slot::<MessageHeader>();
39 decoder
40 }
41}