fidl_next_protocol/
buffer.rs

1// Copyright 2024 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::{
6    DecodeError, DecoderExt as _, EncodeError, EncoderExt as _, WireU32, WireU64,
7};
8
9use crate::{Transport, WireMessageHeader, FLAG_0_WIRE_FORMAT_V2_BIT, MAGIC_NUMBER};
10
11/// Encodes a message into the given buffer.
12pub fn encode_header<T: Transport>(
13    buffer: &mut T::SendBuffer,
14    txid: u32,
15    ordinal: u64,
16) -> Result<(), EncodeError> {
17    buffer.encode_next(&mut WireMessageHeader {
18        txid: WireU32(txid),
19        flags: [FLAG_0_WIRE_FORMAT_V2_BIT, 0, 0],
20        magic_number: MAGIC_NUMBER,
21        ordinal: WireU64(ordinal),
22    })
23}
24
25/// Parses the transaction ID and ordinal from the given buffer.
26pub fn decode_header<T: Transport>(
27    mut buffer: &mut T::RecvBuffer,
28) -> Result<(u32, u64), DecodeError> {
29    let (txid, ordinal) = {
30        let header = buffer.decode_next::<WireMessageHeader>()?;
31        (*header.txid, *header.ordinal)
32    };
33
34    Ok((txid, ordinal))
35}