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 _, WireI32, WireU32, WireU64,
7};
8
9use crate::{FLAG_0_WIRE_FORMAT_V2_BIT, MAGIC_NUMBER, Transport, WireEpitaph, WireMessageHeader};
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(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_owned::<WireMessageHeader>()?;
31        (*header.txid, *header.ordinal)
32    };
33
34    Ok((txid, ordinal))
35}
36
37/// Encodes an epitaph into the given buffer.
38pub fn encode_epitaph<T: Transport>(
39    buffer: &mut T::SendBuffer,
40    error: i32,
41) -> Result<(), EncodeError> {
42    buffer.encode_next(WireEpitaph { error: WireI32(error) })
43}
44
45/// Parses the epitaph error from the given buffer.
46pub fn decode_epitaph<T: Transport>(mut buffer: &mut T::RecvBuffer) -> Result<i32, DecodeError> {
47    Ok(*buffer.decode_owned::<WireEpitaph>()?.error)
48}