fdomain_client/fidl_next/
wire_types.rs

1// Copyright 2025 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 super::{HandleEncoder, WireHandle, WireOptionalHandle};
6use crate::{Channel, Event, EventPair, Handle, HandleBased, Socket};
7use fidl_next_codec::{
8    Encodable, EncodableOption, Encode, EncodeError, EncodeOption, FromWire, FromWireOption,
9};
10use std::mem::MaybeUninit;
11
12macro_rules! handle_type {
13    ($name:ident) => {
14        impl Encodable for $name {
15            type Encoded = WireHandle;
16        }
17
18        unsafe impl<E: HandleEncoder + ?Sized> Encode<E> for $name {
19            fn encode(
20                self,
21                encoder: &mut E,
22                out: &mut MaybeUninit<Self::Encoded>,
23            ) -> Result<(), EncodeError> {
24                Encode::<E>::encode(self.into_handle(), encoder, out)
25            }
26        }
27
28        impl FromWire<WireHandle> for $name {
29            fn from_wire(wire: WireHandle) -> Self {
30                $name::from_handle(Handle::from_wire(wire))
31            }
32        }
33
34        impl EncodableOption for $name {
35            type EncodedOption = WireOptionalHandle;
36        }
37
38        unsafe impl<E: HandleEncoder + ?Sized> EncodeOption<E> for $name {
39            fn encode_option(
40                this: Option<Self>,
41                encoder: &mut E,
42                out: &mut MaybeUninit<Self::EncodedOption>,
43            ) -> Result<(), EncodeError> {
44                EncodeOption::<E>::encode_option(this.map(HandleBased::into_handle), encoder, out)
45            }
46        }
47
48        impl FromWireOption<WireOptionalHandle> for $name {
49            fn from_wire_option(wire: WireOptionalHandle) -> Option<Self> {
50                Handle::from_wire_option(wire).map(Self::from_handle)
51            }
52        }
53    };
54}
55
56handle_type!(Channel);
57handle_type!(Event);
58handle_type!(EventPair);
59handle_type!(Socket);