Skip to main content

fidl_next_protocol/
message.rs

1// Copyright 2026 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use fidl_next_codec::{AsDecoder, DecodeError, DecoderExt};
6
7use crate::Transport;
8use crate::wire::MessageHeader;
9
10/// A FIDL message with a decoded message header.
11///
12/// This is a simple wrapper around `T::RecvBuffer` that skips the transaction
13/// header when `as_decoder` is called. The message header can be retrieved by
14/// calling `header()`.
15pub struct Message<T: Transport> {
16    buffer: T::RecvBuffer,
17}
18
19impl<T: Transport> Message<T> {
20    /// Decodes the given buffer, returning the message header and
21    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    /// Returns the message header.
27    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}