fidl_next_codec/fuchsia/
rights.rs1use core::fmt;
6use core::mem::MaybeUninit;
7
8use munge::munge;
9
10use crate::{
11 Decode, DecodeError, Encodable, Encode, EncodeError, EncodeRef, FromWire, FromWireRef,
12 IntoNatural, Slot, Wire, WireU32,
13};
14
15#[derive(Clone, Copy)]
17#[repr(transparent)]
18pub struct WireRights {
19 inner: WireU32,
20}
21
22unsafe impl Wire for WireRights {
23 type Decoded<'de> = Self;
24
25 #[inline]
26 fn zero_padding(out: &mut MaybeUninit<Self>) {
27 munge!(let Self { inner } = out);
28 WireU32::zero_padding(inner);
29 }
30}
31
32impl WireRights {
33 pub fn to_rights(self) -> zx::Rights {
35 zx::Rights::from_bits_retain(*self.inner)
36 }
37}
38
39impl fmt::Debug for WireRights {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 self.to_rights().fmt(f)
42 }
43}
44
45unsafe impl<D: ?Sized> Decode<D> for WireRights {
46 fn decode(slot: Slot<'_, Self>, decoder: &mut D) -> Result<(), DecodeError> {
47 munge!(let Self { inner } = slot);
48 WireU32::decode(inner, decoder)
49 }
50}
51
52impl Encodable for zx::Rights {
53 type Encoded = WireRights;
54}
55
56unsafe impl<E: ?Sized> Encode<E> for zx::Rights {
57 fn encode(
58 self,
59 encoder: &mut E,
60 out: &mut MaybeUninit<Self::Encoded>,
61 ) -> Result<(), EncodeError> {
62 self.encode_ref(encoder, out)
63 }
64}
65
66unsafe impl<E: ?Sized> EncodeRef<E> for zx::Rights {
67 fn encode_ref(
68 &self,
69 encoder: &mut E,
70 out: &mut MaybeUninit<Self::Encoded>,
71 ) -> Result<(), EncodeError> {
72 munge!(let WireRights { inner } = out);
73 self.bits().encode(encoder, inner)
74 }
75}
76
77impl FromWire<WireRights> for zx::Rights {
78 fn from_wire(wire: WireRights) -> Self {
79 Self::from_wire_ref(&wire)
80 }
81}
82
83impl FromWireRef<WireRights> for zx::Rights {
84 fn from_wire_ref(wire: &WireRights) -> Self {
85 Self::from_bits_retain(*wire.inner)
86 }
87}
88
89impl IntoNatural for WireRights {
90 type Natural = zx::Rights;
91}