fidl_next_codec/
compat.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
5/// Conversions between old and new Rust bindings types.
6pub trait CompatFrom<T> {
7    /// Converts `value` into a value of this type.
8    fn compat_from(value: T) -> Self;
9}
10
11macro_rules! impl_compat_from_for_primitives {
12    ($($ty:ty),* $(,)?) => {
13        $(
14            impl CompatFrom<$ty> for $ty {
15                fn compat_from(value: $ty) -> Self {
16                    value
17                }
18            }
19        )*
20    };
21}
22
23impl_compat_from_for_primitives! {
24    i8, i16, i32, i64,
25    u8, u16, u32, u64,
26    f32, f64,
27    bool,
28    (),
29}
30
31impl<T, U: CompatFrom<T>> CompatFrom<Option<T>> for Option<U> {
32    fn compat_from(value: Option<T>) -> Self {
33        value.map(U::compat_from)
34    }
35}
36
37impl<T, U: CompatFrom<T>> CompatFrom<Box<T>> for Box<U> {
38    fn compat_from(value: Box<T>) -> Self {
39        Box::new(U::compat_from(*value))
40    }
41}
42
43impl<T, U: CompatFrom<T>, const N: usize> CompatFrom<[T; N]> for [U; N] {
44    fn compat_from(value: [T; N]) -> Self {
45        value.map(U::compat_from)
46    }
47}
48
49impl<T, U: CompatFrom<T>> CompatFrom<Vec<T>> for Vec<U> {
50    fn compat_from(mut value: Vec<T>) -> Self {
51        value.drain(..).map(U::compat_from).collect()
52    }
53}
54
55impl CompatFrom<String> for String {
56    fn compat_from(value: String) -> Self {
57        value
58    }
59}
60
61#[cfg(feature = "fuchsia")]
62impl CompatFrom<zx::Handle> for zx::Handle {
63    fn compat_from(value: zx::Handle) -> Self {
64        value
65    }
66}
67
68#[cfg(feature = "fuchsia")]
69macro_rules! impl_compat_from_for_handle_types {
70    ($($name:ident),* $(,)?) => {
71        $(
72            #[cfg(feature = "fuchsia")]
73            impl CompatFrom<zx::$name> for zx::$name {
74                fn compat_from(value: zx::$name) -> Self {
75                    value
76                }
77            }
78        )*
79    };
80}
81
82#[cfg(feature = "fuchsia")]
83impl_compat_from_for_handle_types! {
84    Process,
85    Thread,
86    Vmo,
87    Channel,
88    Event,
89    Port,
90    Interrupt,
91    Socket,
92    Resource,
93    EventPair,
94    Job,
95    Vmar,
96    Fifo,
97    Guest,
98    Vcpu,
99    Timer,
100    Iommu,
101    Bti,
102    Profile,
103    Pmt,
104    Pager,
105    Exception,
106    Clock,
107    Stream,
108    Iob,
109}
110
111impl<T: fidl::Timeline> CompatFrom<i64> for ::fidl::Instant<T, ::fidl::NsUnit> {
112    fn compat_from(value: i64) -> Self {
113        Self::from_nanos(value)
114    }
115}
116
117impl<T: fidl::Timeline> CompatFrom<::fidl::Instant<T, ::fidl::NsUnit>> for i64 {
118    fn compat_from(value: ::fidl::Instant<T, ::fidl::NsUnit>) -> Self {
119        value.into_nanos()
120    }
121}
122
123impl<T: fidl::Timeline> CompatFrom<i64> for fidl::Instant<T, fidl::TicksUnit> {
124    fn compat_from(value: i64) -> Self {
125        Self::from_raw(value)
126    }
127}
128
129impl<T: fidl::Timeline> CompatFrom<::fidl::Instant<T, ::fidl::TicksUnit>> for i64 {
130    fn compat_from(value: ::fidl::Instant<T, ::fidl::TicksUnit>) -> Self {
131        value.into_raw()
132    }
133}