Skip to main content

fidl_fuchsia_hardware_spmi_common/
fidl_fuchsia_hardware_spmi_common.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
8use futures::future::{self, MaybeDone, TryFutureExt};
9use zx_status;
10
11/// An arbitrary limit on the number of register writes that can be returned to
12/// `WatchControllerWriteCommands()`.
13pub const MAX_CONTROLLER_WRITE_COMMANDS: u32 = 256;
14
15/// Maximum length of the SPMI device name.
16pub const MAX_SPMI_NAME_LEN: u32 = 64;
17
18pub const MAX_SUB_TARGETS: u32 = 65536;
19
20pub const MAX_TARGETS: u32 = 16;
21
22/// Errors that this driver may return.
23#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
24pub enum DriverError {
25    /// The driver encountered an otherwise unspecified error while performing the operation.
26    Internal,
27    /// The operation is not implemented, supported, or enabled.
28    NotSupported,
29    /// An argument is invalid.
30    InvalidArgs,
31    /// The operation failed because the current state of the driver does not allow it, or a
32    /// precondition of the operation is not satisfied.
33    BadState,
34    /// The device returned a NACK (negative Acknowledgment).
35    /// The client may retry the operation after a NACK was sent for instance due to a parity error.
36    IoRefused,
37    /// The hanging-get method was canceled.
38    Canceled,
39    /// No pending hanging-get method was found for the given arguments.
40    NotFound,
41    #[doc(hidden)]
42    __SourceBreaking { unknown_ordinal: u32 },
43}
44
45/// Pattern that matches an unknown `DriverError` member.
46#[macro_export]
47macro_rules! DriverErrorUnknown {
48    () => {
49        _
50    };
51}
52
53impl DriverError {
54    #[inline]
55    pub fn from_primitive(prim: u32) -> Option<Self> {
56        match prim {
57            1 => Some(Self::Internal),
58            2 => Some(Self::NotSupported),
59            3 => Some(Self::InvalidArgs),
60            4 => Some(Self::BadState),
61            5 => Some(Self::IoRefused),
62            6 => Some(Self::Canceled),
63            7 => Some(Self::NotFound),
64            _ => None,
65        }
66    }
67
68    #[inline]
69    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
70        match prim {
71            1 => Self::Internal,
72            2 => Self::NotSupported,
73            3 => Self::InvalidArgs,
74            4 => Self::BadState,
75            5 => Self::IoRefused,
76            6 => Self::Canceled,
77            7 => Self::NotFound,
78            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
79        }
80    }
81
82    #[inline]
83    pub fn unknown() -> Self {
84        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
85    }
86
87    #[inline]
88    pub const fn into_primitive(self) -> u32 {
89        match self {
90            Self::Internal => 1,
91            Self::NotSupported => 2,
92            Self::InvalidArgs => 3,
93            Self::BadState => 4,
94            Self::IoRefused => 5,
95            Self::Canceled => 6,
96            Self::NotFound => 7,
97            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
98        }
99    }
100
101    #[inline]
102    pub fn is_unknown(&self) -> bool {
103        match self {
104            Self::__SourceBreaking { unknown_ordinal: _ } => true,
105            _ => false,
106        }
107    }
108}
109
110#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
111#[repr(C)]
112pub struct DeviceCancelWatchControllerWriteCommandsRequest {
113    pub address: u8,
114    pub size: u16,
115}
116
117impl fidl::Persistable for DeviceCancelWatchControllerWriteCommandsRequest {}
118
119#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
120#[repr(C)]
121pub struct DeviceRegisterReadRequest {
122    pub address: u16,
123    pub size_bytes: u32,
124}
125
126impl fidl::Persistable for DeviceRegisterReadRequest {}
127
128#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
129pub struct DeviceRegisterWriteRequest {
130    pub address: u16,
131    pub data: Vec<u8>,
132}
133
134impl fidl::Persistable for DeviceRegisterWriteRequest {}
135
136#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
137pub struct DeviceRegisterReadResponse {
138    pub data: Vec<u8>,
139}
140
141impl fidl::Persistable for DeviceRegisterReadResponse {}
142
143/// A single register read from or written to with an SPMI command that uses an 8-bit address.
144#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
145#[repr(C)]
146pub struct Register8 {
147    pub address: u8,
148    pub data: u8,
149}
150
151impl fidl::Persistable for Register8 {}
152
153/// `ControllerInfo` is passed to SPMI controller drivers via metadata.
154#[derive(Clone, Debug, Default, PartialEq)]
155pub struct ControllerInfo {
156    /// Board-specific controller ID. Optional.
157    pub id: Option<u32>,
158    /// SPMI target devices on this bus. Optional.
159    pub targets: Option<Vec<TargetInfo>>,
160    #[doc(hidden)]
161    pub __source_breaking: fidl::marker::SourceBreaking,
162}
163
164impl fidl::Persistable for ControllerInfo {}
165impl fidl::Serializable for ControllerInfo {
166    const SERIALIZABLE_NAME: &'static str = "fuchsia.hardware.spmi.ControllerInfo";
167}
168
169#[derive(Clone, Debug, Default, PartialEq)]
170pub struct DebugGetControllerPropertiesResponse {
171    /// User friendly string for the controller name. If not set, the controller name is
172    /// unknown. If included, this string must be non-empty.
173    ///
174    /// Optional.
175    pub name: Option<String>,
176    #[doc(hidden)]
177    pub __source_breaking: fidl::marker::SourceBreaking,
178}
179
180impl fidl::Persistable for DebugGetControllerPropertiesResponse {}
181
182#[derive(Clone, Debug, Default, PartialEq)]
183pub struct DeviceGetPropertiesResponse {
184    /// Unique SPMI target/secondary identifier, corresponds to the SPMI specification sid.
185    /// Up to 16 secondaries are identifed with an id from 0 to 15 inclusive.
186    ///
187    /// Required.
188    pub sid: Option<u8>,
189    /// User friendly string for the device name. If not set, the device name is unknown.
190    /// If included, this string must be non-empty.
191    ///
192    /// Optional.
193    pub name: Option<String>,
194    /// Width in bytes of each register in the device. If not set, the register width
195    /// defaults to 1 byte.
196    ///
197    /// Optional.
198    pub register_width_bytes: Option<u32>,
199    #[doc(hidden)]
200    pub __source_breaking: fidl::marker::SourceBreaking,
201}
202
203impl fidl::Persistable for DeviceGetPropertiesResponse {}
204
205#[derive(Clone, Debug, Default, PartialEq)]
206pub struct SubTargetInfo {
207    /// The SPMI base register address. Accesses to this sub-target will be restricted to the range
208    /// [0, `size`) and offset by `address`. Required.
209    pub address: Option<u16>,
210    /// The size of the SPMI register region accessible to this sub-target. The sum of `address` and
211    /// `size` must be less than or equal to 65536. Required.
212    pub size: Option<u32>,
213    /// The name of this sub-target to be used for bind properties. Optional.
214    pub name: Option<String>,
215    /// A human-readable name for this sub-target. Optional.
216    pub display_name: Option<String>,
217    #[doc(hidden)]
218    pub __source_breaking: fidl::marker::SourceBreaking,
219}
220
221impl fidl::Persistable for SubTargetInfo {}
222
223#[derive(Clone, Debug, Default, PartialEq)]
224pub struct TargetInfo {
225    /// SPMI target ID in [0, `MAX_TARGETS`), unique for this controller. Required.
226    pub id: Option<u8>,
227    /// Sub-target register regions within this target. Optional.
228    pub sub_targets: Option<Vec<SubTargetInfo>>,
229    /// The name of this target to be used for bind properties. Optional.
230    pub name: Option<String>,
231    /// A human-readable name for this target. Optional.
232    pub display_name: Option<String>,
233    #[doc(hidden)]
234    pub __source_breaking: fidl::marker::SourceBreaking,
235}
236
237impl fidl::Persistable for TargetInfo {}
238
239pub mod debug_ordinals {
240    pub const CONNECT_TARGET: u64 = 0xb18ebc371c68d19;
241    pub const GET_CONTROLLER_PROPERTIES: u64 = 0x41b1c4ef901d051f;
242}
243
244pub mod device_ordinals {
245    pub const REGISTER_READ: u64 = 0x1b0f6eff7638b5;
246    pub const REGISTER_WRITE: u64 = 0xe7f4ed59770bb2b;
247    pub const GET_PROPERTIES: u64 = 0x1e946ec04006ffbb;
248    pub const WATCH_CONTROLLER_WRITE_COMMANDS: u64 = 0x41674c1eba4d05ac;
249    pub const CANCEL_WATCH_CONTROLLER_WRITE_COMMANDS: u64 = 0x5057c280e6f0d420;
250}
251
252mod internal {
253    use super::*;
254    unsafe impl fidl::encoding::TypeMarker for DriverError {
255        type Owned = Self;
256
257        #[inline(always)]
258        fn inline_align(_context: fidl::encoding::Context) -> usize {
259            std::mem::align_of::<u32>()
260        }
261
262        #[inline(always)]
263        fn inline_size(_context: fidl::encoding::Context) -> usize {
264            std::mem::size_of::<u32>()
265        }
266
267        #[inline(always)]
268        fn encode_is_copy() -> bool {
269            false
270        }
271
272        #[inline(always)]
273        fn decode_is_copy() -> bool {
274            false
275        }
276    }
277
278    impl fidl::encoding::ValueTypeMarker for DriverError {
279        type Borrowed<'a> = Self;
280        #[inline(always)]
281        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
282            *value
283        }
284    }
285
286    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for DriverError {
287        #[inline]
288        unsafe fn encode(
289            self,
290            encoder: &mut fidl::encoding::Encoder<'_, D>,
291            offset: usize,
292            _depth: fidl::encoding::Depth,
293        ) -> fidl::Result<()> {
294            encoder.debug_check_bounds::<Self>(offset);
295            encoder.write_num(self.into_primitive(), offset);
296            Ok(())
297        }
298    }
299
300    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DriverError {
301        #[inline(always)]
302        fn new_empty() -> Self {
303            Self::unknown()
304        }
305
306        #[inline]
307        unsafe fn decode(
308            &mut self,
309            decoder: &mut fidl::encoding::Decoder<'_, D>,
310            offset: usize,
311            _depth: fidl::encoding::Depth,
312        ) -> fidl::Result<()> {
313            decoder.debug_check_bounds::<Self>(offset);
314            let prim = decoder.read_num::<u32>(offset);
315
316            *self = Self::from_primitive_allow_unknown(prim);
317            Ok(())
318        }
319    }
320
321    impl fidl::encoding::ValueTypeMarker for DeviceCancelWatchControllerWriteCommandsRequest {
322        type Borrowed<'a> = &'a Self;
323        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
324            value
325        }
326    }
327
328    unsafe impl fidl::encoding::TypeMarker for DeviceCancelWatchControllerWriteCommandsRequest {
329        type Owned = Self;
330
331        #[inline(always)]
332        fn inline_align(_context: fidl::encoding::Context) -> usize {
333            2
334        }
335
336        #[inline(always)]
337        fn inline_size(_context: fidl::encoding::Context) -> usize {
338            4
339        }
340    }
341
342    unsafe impl<D: fidl::encoding::ResourceDialect>
343        fidl::encoding::Encode<DeviceCancelWatchControllerWriteCommandsRequest, D>
344        for &DeviceCancelWatchControllerWriteCommandsRequest
345    {
346        #[inline]
347        unsafe fn encode(
348            self,
349            encoder: &mut fidl::encoding::Encoder<'_, D>,
350            offset: usize,
351            _depth: fidl::encoding::Depth,
352        ) -> fidl::Result<()> {
353            encoder.debug_check_bounds::<DeviceCancelWatchControllerWriteCommandsRequest>(offset);
354            unsafe {
355                // Copy the object into the buffer.
356                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
357                (buf_ptr as *mut DeviceCancelWatchControllerWriteCommandsRequest).write_unaligned(
358                    (self as *const DeviceCancelWatchControllerWriteCommandsRequest).read(),
359                );
360                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
361                // done second because the memcpy will write garbage to these bytes.
362                let padding_ptr = buf_ptr.offset(0) as *mut u16;
363                let padding_mask = 0xff00u16;
364                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
365            }
366            Ok(())
367        }
368    }
369    unsafe impl<
370        D: fidl::encoding::ResourceDialect,
371        T0: fidl::encoding::Encode<u8, D>,
372        T1: fidl::encoding::Encode<u16, D>,
373    > fidl::encoding::Encode<DeviceCancelWatchControllerWriteCommandsRequest, D> for (T0, T1)
374    {
375        #[inline]
376        unsafe fn encode(
377            self,
378            encoder: &mut fidl::encoding::Encoder<'_, D>,
379            offset: usize,
380            depth: fidl::encoding::Depth,
381        ) -> fidl::Result<()> {
382            encoder.debug_check_bounds::<DeviceCancelWatchControllerWriteCommandsRequest>(offset);
383            // Zero out padding regions. There's no need to apply masks
384            // because the unmasked parts will be overwritten by fields.
385            unsafe {
386                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
387                (ptr as *mut u16).write_unaligned(0);
388            }
389            // Write the fields.
390            self.0.encode(encoder, offset + 0, depth)?;
391            self.1.encode(encoder, offset + 2, depth)?;
392            Ok(())
393        }
394    }
395
396    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
397        for DeviceCancelWatchControllerWriteCommandsRequest
398    {
399        #[inline(always)]
400        fn new_empty() -> Self {
401            Self { address: fidl::new_empty!(u8, D), size: fidl::new_empty!(u16, D) }
402        }
403
404        #[inline]
405        unsafe fn decode(
406            &mut self,
407            decoder: &mut fidl::encoding::Decoder<'_, D>,
408            offset: usize,
409            _depth: fidl::encoding::Depth,
410        ) -> fidl::Result<()> {
411            decoder.debug_check_bounds::<Self>(offset);
412            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
413            // Verify that padding bytes are zero.
414            let ptr = unsafe { buf_ptr.offset(0) };
415            let padval = unsafe { (ptr as *const u16).read_unaligned() };
416            let mask = 0xff00u16;
417            let maskedval = padval & mask;
418            if maskedval != 0 {
419                return Err(fidl::Error::NonZeroPadding {
420                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
421                });
422            }
423            // Copy from the buffer into the object.
424            unsafe {
425                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
426            }
427            Ok(())
428        }
429    }
430
431    impl fidl::encoding::ValueTypeMarker for DeviceRegisterReadRequest {
432        type Borrowed<'a> = &'a Self;
433        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
434            value
435        }
436    }
437
438    unsafe impl fidl::encoding::TypeMarker for DeviceRegisterReadRequest {
439        type Owned = Self;
440
441        #[inline(always)]
442        fn inline_align(_context: fidl::encoding::Context) -> usize {
443            4
444        }
445
446        #[inline(always)]
447        fn inline_size(_context: fidl::encoding::Context) -> usize {
448            8
449        }
450    }
451
452    unsafe impl<D: fidl::encoding::ResourceDialect>
453        fidl::encoding::Encode<DeviceRegisterReadRequest, D> for &DeviceRegisterReadRequest
454    {
455        #[inline]
456        unsafe fn encode(
457            self,
458            encoder: &mut fidl::encoding::Encoder<'_, D>,
459            offset: usize,
460            _depth: fidl::encoding::Depth,
461        ) -> fidl::Result<()> {
462            encoder.debug_check_bounds::<DeviceRegisterReadRequest>(offset);
463            unsafe {
464                // Copy the object into the buffer.
465                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
466                (buf_ptr as *mut DeviceRegisterReadRequest)
467                    .write_unaligned((self as *const DeviceRegisterReadRequest).read());
468                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
469                // done second because the memcpy will write garbage to these bytes.
470                let padding_ptr = buf_ptr.offset(0) as *mut u32;
471                let padding_mask = 0xffff0000u32;
472                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
473            }
474            Ok(())
475        }
476    }
477    unsafe impl<
478        D: fidl::encoding::ResourceDialect,
479        T0: fidl::encoding::Encode<u16, D>,
480        T1: fidl::encoding::Encode<u32, D>,
481    > fidl::encoding::Encode<DeviceRegisterReadRequest, D> for (T0, T1)
482    {
483        #[inline]
484        unsafe fn encode(
485            self,
486            encoder: &mut fidl::encoding::Encoder<'_, D>,
487            offset: usize,
488            depth: fidl::encoding::Depth,
489        ) -> fidl::Result<()> {
490            encoder.debug_check_bounds::<DeviceRegisterReadRequest>(offset);
491            // Zero out padding regions. There's no need to apply masks
492            // because the unmasked parts will be overwritten by fields.
493            unsafe {
494                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
495                (ptr as *mut u32).write_unaligned(0);
496            }
497            // Write the fields.
498            self.0.encode(encoder, offset + 0, depth)?;
499            self.1.encode(encoder, offset + 4, depth)?;
500            Ok(())
501        }
502    }
503
504    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
505        for DeviceRegisterReadRequest
506    {
507        #[inline(always)]
508        fn new_empty() -> Self {
509            Self { address: fidl::new_empty!(u16, D), size_bytes: fidl::new_empty!(u32, D) }
510        }
511
512        #[inline]
513        unsafe fn decode(
514            &mut self,
515            decoder: &mut fidl::encoding::Decoder<'_, D>,
516            offset: usize,
517            _depth: fidl::encoding::Depth,
518        ) -> fidl::Result<()> {
519            decoder.debug_check_bounds::<Self>(offset);
520            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
521            // Verify that padding bytes are zero.
522            let ptr = unsafe { buf_ptr.offset(0) };
523            let padval = unsafe { (ptr as *const u32).read_unaligned() };
524            let mask = 0xffff0000u32;
525            let maskedval = padval & mask;
526            if maskedval != 0 {
527                return Err(fidl::Error::NonZeroPadding {
528                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
529                });
530            }
531            // Copy from the buffer into the object.
532            unsafe {
533                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
534            }
535            Ok(())
536        }
537    }
538
539    impl fidl::encoding::ValueTypeMarker for DeviceRegisterWriteRequest {
540        type Borrowed<'a> = &'a Self;
541        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
542            value
543        }
544    }
545
546    unsafe impl fidl::encoding::TypeMarker for DeviceRegisterWriteRequest {
547        type Owned = Self;
548
549        #[inline(always)]
550        fn inline_align(_context: fidl::encoding::Context) -> usize {
551            8
552        }
553
554        #[inline(always)]
555        fn inline_size(_context: fidl::encoding::Context) -> usize {
556            24
557        }
558    }
559
560    unsafe impl<D: fidl::encoding::ResourceDialect>
561        fidl::encoding::Encode<DeviceRegisterWriteRequest, D> for &DeviceRegisterWriteRequest
562    {
563        #[inline]
564        unsafe fn encode(
565            self,
566            encoder: &mut fidl::encoding::Encoder<'_, D>,
567            offset: usize,
568            _depth: fidl::encoding::Depth,
569        ) -> fidl::Result<()> {
570            encoder.debug_check_bounds::<DeviceRegisterWriteRequest>(offset);
571            // Delegate to tuple encoding.
572            fidl::encoding::Encode::<DeviceRegisterWriteRequest, D>::encode(
573                (
574                    <u16 as fidl::encoding::ValueTypeMarker>::borrow(&self.address),
575                    <fidl::encoding::UnboundedVector<u8> as fidl::encoding::ValueTypeMarker>::borrow(&self.data),
576                ),
577                encoder, offset, _depth
578            )
579        }
580    }
581    unsafe impl<
582        D: fidl::encoding::ResourceDialect,
583        T0: fidl::encoding::Encode<u16, D>,
584        T1: fidl::encoding::Encode<fidl::encoding::UnboundedVector<u8>, D>,
585    > fidl::encoding::Encode<DeviceRegisterWriteRequest, D> for (T0, T1)
586    {
587        #[inline]
588        unsafe fn encode(
589            self,
590            encoder: &mut fidl::encoding::Encoder<'_, D>,
591            offset: usize,
592            depth: fidl::encoding::Depth,
593        ) -> fidl::Result<()> {
594            encoder.debug_check_bounds::<DeviceRegisterWriteRequest>(offset);
595            // Zero out padding regions. There's no need to apply masks
596            // because the unmasked parts will be overwritten by fields.
597            unsafe {
598                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
599                (ptr as *mut u64).write_unaligned(0);
600            }
601            // Write the fields.
602            self.0.encode(encoder, offset + 0, depth)?;
603            self.1.encode(encoder, offset + 8, depth)?;
604            Ok(())
605        }
606    }
607
608    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
609        for DeviceRegisterWriteRequest
610    {
611        #[inline(always)]
612        fn new_empty() -> Self {
613            Self {
614                address: fidl::new_empty!(u16, D),
615                data: fidl::new_empty!(fidl::encoding::UnboundedVector<u8>, D),
616            }
617        }
618
619        #[inline]
620        unsafe fn decode(
621            &mut self,
622            decoder: &mut fidl::encoding::Decoder<'_, D>,
623            offset: usize,
624            _depth: fidl::encoding::Depth,
625        ) -> fidl::Result<()> {
626            decoder.debug_check_bounds::<Self>(offset);
627            // Verify that padding bytes are zero.
628            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
629            let padval = unsafe { (ptr as *const u64).read_unaligned() };
630            let mask = 0xffffffffffff0000u64;
631            let maskedval = padval & mask;
632            if maskedval != 0 {
633                return Err(fidl::Error::NonZeroPadding {
634                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
635                });
636            }
637            fidl::decode!(u16, D, &mut self.address, decoder, offset + 0, _depth)?;
638            fidl::decode!(
639                fidl::encoding::UnboundedVector<u8>,
640                D,
641                &mut self.data,
642                decoder,
643                offset + 8,
644                _depth
645            )?;
646            Ok(())
647        }
648    }
649
650    impl fidl::encoding::ValueTypeMarker for DeviceRegisterReadResponse {
651        type Borrowed<'a> = &'a Self;
652        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
653            value
654        }
655    }
656
657    unsafe impl fidl::encoding::TypeMarker for DeviceRegisterReadResponse {
658        type Owned = Self;
659
660        #[inline(always)]
661        fn inline_align(_context: fidl::encoding::Context) -> usize {
662            8
663        }
664
665        #[inline(always)]
666        fn inline_size(_context: fidl::encoding::Context) -> usize {
667            16
668        }
669    }
670
671    unsafe impl<D: fidl::encoding::ResourceDialect>
672        fidl::encoding::Encode<DeviceRegisterReadResponse, D> for &DeviceRegisterReadResponse
673    {
674        #[inline]
675        unsafe fn encode(
676            self,
677            encoder: &mut fidl::encoding::Encoder<'_, D>,
678            offset: usize,
679            _depth: fidl::encoding::Depth,
680        ) -> fidl::Result<()> {
681            encoder.debug_check_bounds::<DeviceRegisterReadResponse>(offset);
682            // Delegate to tuple encoding.
683            fidl::encoding::Encode::<DeviceRegisterReadResponse, D>::encode(
684                (<fidl::encoding::UnboundedVector<u8> as fidl::encoding::ValueTypeMarker>::borrow(
685                    &self.data,
686                ),),
687                encoder,
688                offset,
689                _depth,
690            )
691        }
692    }
693    unsafe impl<
694        D: fidl::encoding::ResourceDialect,
695        T0: fidl::encoding::Encode<fidl::encoding::UnboundedVector<u8>, D>,
696    > fidl::encoding::Encode<DeviceRegisterReadResponse, D> for (T0,)
697    {
698        #[inline]
699        unsafe fn encode(
700            self,
701            encoder: &mut fidl::encoding::Encoder<'_, D>,
702            offset: usize,
703            depth: fidl::encoding::Depth,
704        ) -> fidl::Result<()> {
705            encoder.debug_check_bounds::<DeviceRegisterReadResponse>(offset);
706            // Zero out padding regions. There's no need to apply masks
707            // because the unmasked parts will be overwritten by fields.
708            // Write the fields.
709            self.0.encode(encoder, offset + 0, depth)?;
710            Ok(())
711        }
712    }
713
714    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
715        for DeviceRegisterReadResponse
716    {
717        #[inline(always)]
718        fn new_empty() -> Self {
719            Self { data: fidl::new_empty!(fidl::encoding::UnboundedVector<u8>, D) }
720        }
721
722        #[inline]
723        unsafe fn decode(
724            &mut self,
725            decoder: &mut fidl::encoding::Decoder<'_, D>,
726            offset: usize,
727            _depth: fidl::encoding::Depth,
728        ) -> fidl::Result<()> {
729            decoder.debug_check_bounds::<Self>(offset);
730            // Verify that padding bytes are zero.
731            fidl::decode!(
732                fidl::encoding::UnboundedVector<u8>,
733                D,
734                &mut self.data,
735                decoder,
736                offset + 0,
737                _depth
738            )?;
739            Ok(())
740        }
741    }
742
743    impl fidl::encoding::ValueTypeMarker for Register8 {
744        type Borrowed<'a> = &'a Self;
745        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
746            value
747        }
748    }
749
750    unsafe impl fidl::encoding::TypeMarker for Register8 {
751        type Owned = Self;
752
753        #[inline(always)]
754        fn inline_align(_context: fidl::encoding::Context) -> usize {
755            1
756        }
757
758        #[inline(always)]
759        fn inline_size(_context: fidl::encoding::Context) -> usize {
760            2
761        }
762        #[inline(always)]
763        fn encode_is_copy() -> bool {
764            true
765        }
766
767        #[inline(always)]
768        fn decode_is_copy() -> bool {
769            true
770        }
771    }
772
773    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Register8, D>
774        for &Register8
775    {
776        #[inline]
777        unsafe fn encode(
778            self,
779            encoder: &mut fidl::encoding::Encoder<'_, D>,
780            offset: usize,
781            _depth: fidl::encoding::Depth,
782        ) -> fidl::Result<()> {
783            encoder.debug_check_bounds::<Register8>(offset);
784            unsafe {
785                // Copy the object into the buffer.
786                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
787                (buf_ptr as *mut Register8).write_unaligned((self as *const Register8).read());
788                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
789                // done second because the memcpy will write garbage to these bytes.
790            }
791            Ok(())
792        }
793    }
794    unsafe impl<
795        D: fidl::encoding::ResourceDialect,
796        T0: fidl::encoding::Encode<u8, D>,
797        T1: fidl::encoding::Encode<u8, D>,
798    > fidl::encoding::Encode<Register8, D> for (T0, T1)
799    {
800        #[inline]
801        unsafe fn encode(
802            self,
803            encoder: &mut fidl::encoding::Encoder<'_, D>,
804            offset: usize,
805            depth: fidl::encoding::Depth,
806        ) -> fidl::Result<()> {
807            encoder.debug_check_bounds::<Register8>(offset);
808            // Zero out padding regions. There's no need to apply masks
809            // because the unmasked parts will be overwritten by fields.
810            // Write the fields.
811            self.0.encode(encoder, offset + 0, depth)?;
812            self.1.encode(encoder, offset + 1, depth)?;
813            Ok(())
814        }
815    }
816
817    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Register8 {
818        #[inline(always)]
819        fn new_empty() -> Self {
820            Self { address: fidl::new_empty!(u8, D), data: fidl::new_empty!(u8, D) }
821        }
822
823        #[inline]
824        unsafe fn decode(
825            &mut self,
826            decoder: &mut fidl::encoding::Decoder<'_, D>,
827            offset: usize,
828            _depth: fidl::encoding::Depth,
829        ) -> fidl::Result<()> {
830            decoder.debug_check_bounds::<Self>(offset);
831            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
832            // Verify that padding bytes are zero.
833            // Copy from the buffer into the object.
834            unsafe {
835                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 2);
836            }
837            Ok(())
838        }
839    }
840
841    impl ControllerInfo {
842        #[inline(always)]
843        fn max_ordinal_present(&self) -> u64 {
844            if let Some(_) = self.targets {
845                return 2;
846            }
847            if let Some(_) = self.id {
848                return 1;
849            }
850            0
851        }
852    }
853
854    impl fidl::encoding::ValueTypeMarker for ControllerInfo {
855        type Borrowed<'a> = &'a Self;
856        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
857            value
858        }
859    }
860
861    unsafe impl fidl::encoding::TypeMarker for ControllerInfo {
862        type Owned = Self;
863
864        #[inline(always)]
865        fn inline_align(_context: fidl::encoding::Context) -> usize {
866            8
867        }
868
869        #[inline(always)]
870        fn inline_size(_context: fidl::encoding::Context) -> usize {
871            16
872        }
873    }
874
875    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ControllerInfo, D>
876        for &ControllerInfo
877    {
878        unsafe fn encode(
879            self,
880            encoder: &mut fidl::encoding::Encoder<'_, D>,
881            offset: usize,
882            mut depth: fidl::encoding::Depth,
883        ) -> fidl::Result<()> {
884            encoder.debug_check_bounds::<ControllerInfo>(offset);
885            // Vector header
886            let max_ordinal: u64 = self.max_ordinal_present();
887            encoder.write_num(max_ordinal, offset);
888            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
889            // Calling encoder.out_of_line_offset(0) is not allowed.
890            if max_ordinal == 0 {
891                return Ok(());
892            }
893            depth.increment()?;
894            let envelope_size = 8;
895            let bytes_len = max_ordinal as usize * envelope_size;
896            #[allow(unused_variables)]
897            let offset = encoder.out_of_line_offset(bytes_len);
898            let mut _prev_end_offset: usize = 0;
899            if 1 > max_ordinal {
900                return Ok(());
901            }
902
903            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
904            // are envelope_size bytes.
905            let cur_offset: usize = (1 - 1) * envelope_size;
906
907            // Zero reserved fields.
908            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
909
910            // Safety:
911            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
912            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
913            //   envelope_size bytes, there is always sufficient room.
914            fidl::encoding::encode_in_envelope_optional::<u32, D>(
915                self.id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
916                encoder,
917                offset + cur_offset,
918                depth,
919            )?;
920
921            _prev_end_offset = cur_offset + envelope_size;
922            if 2 > max_ordinal {
923                return Ok(());
924            }
925
926            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
927            // are envelope_size bytes.
928            let cur_offset: usize = (2 - 1) * envelope_size;
929
930            // Zero reserved fields.
931            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
932
933            // Safety:
934            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
935            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
936            //   envelope_size bytes, there is always sufficient room.
937            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<TargetInfo, 16>, D>(
938            self.targets.as_ref().map(<fidl::encoding::Vector<TargetInfo, 16> as fidl::encoding::ValueTypeMarker>::borrow),
939            encoder, offset + cur_offset, depth
940        )?;
941
942            _prev_end_offset = cur_offset + envelope_size;
943
944            Ok(())
945        }
946    }
947
948    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ControllerInfo {
949        #[inline(always)]
950        fn new_empty() -> Self {
951            Self::default()
952        }
953
954        unsafe fn decode(
955            &mut self,
956            decoder: &mut fidl::encoding::Decoder<'_, D>,
957            offset: usize,
958            mut depth: fidl::encoding::Depth,
959        ) -> fidl::Result<()> {
960            decoder.debug_check_bounds::<Self>(offset);
961            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
962                None => return Err(fidl::Error::NotNullable),
963                Some(len) => len,
964            };
965            // Calling decoder.out_of_line_offset(0) is not allowed.
966            if len == 0 {
967                return Ok(());
968            };
969            depth.increment()?;
970            let envelope_size = 8;
971            let bytes_len = len * envelope_size;
972            let offset = decoder.out_of_line_offset(bytes_len)?;
973            // Decode the envelope for each type.
974            let mut _next_ordinal_to_read = 0;
975            let mut next_offset = offset;
976            let end_offset = offset + bytes_len;
977            _next_ordinal_to_read += 1;
978            if next_offset >= end_offset {
979                return Ok(());
980            }
981
982            // Decode unknown envelopes for gaps in ordinals.
983            while _next_ordinal_to_read < 1 {
984                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
985                _next_ordinal_to_read += 1;
986                next_offset += envelope_size;
987            }
988
989            let next_out_of_line = decoder.next_out_of_line();
990            let handles_before = decoder.remaining_handles();
991            if let Some((inlined, num_bytes, num_handles)) =
992                fidl::encoding::decode_envelope_header(decoder, next_offset)?
993            {
994                let member_inline_size =
995                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
996                if inlined != (member_inline_size <= 4) {
997                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
998                }
999                let inner_offset;
1000                let mut inner_depth = depth.clone();
1001                if inlined {
1002                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1003                    inner_offset = next_offset;
1004                } else {
1005                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1006                    inner_depth.increment()?;
1007                }
1008                let val_ref = self.id.get_or_insert_with(|| fidl::new_empty!(u32, D));
1009                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1010                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1011                {
1012                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1013                }
1014                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1015                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1016                }
1017            }
1018
1019            next_offset += envelope_size;
1020            _next_ordinal_to_read += 1;
1021            if next_offset >= end_offset {
1022                return Ok(());
1023            }
1024
1025            // Decode unknown envelopes for gaps in ordinals.
1026            while _next_ordinal_to_read < 2 {
1027                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1028                _next_ordinal_to_read += 1;
1029                next_offset += envelope_size;
1030            }
1031
1032            let next_out_of_line = decoder.next_out_of_line();
1033            let handles_before = decoder.remaining_handles();
1034            if let Some((inlined, num_bytes, num_handles)) =
1035                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1036            {
1037                let member_inline_size = <fidl::encoding::Vector<TargetInfo, 16> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1038                if inlined != (member_inline_size <= 4) {
1039                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1040                }
1041                let inner_offset;
1042                let mut inner_depth = depth.clone();
1043                if inlined {
1044                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1045                    inner_offset = next_offset;
1046                } else {
1047                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1048                    inner_depth.increment()?;
1049                }
1050                let val_ref = self.targets.get_or_insert_with(
1051                    || fidl::new_empty!(fidl::encoding::Vector<TargetInfo, 16>, D),
1052                );
1053                fidl::decode!(fidl::encoding::Vector<TargetInfo, 16>, D, val_ref, decoder, inner_offset, inner_depth)?;
1054                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1055                {
1056                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1057                }
1058                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1059                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1060                }
1061            }
1062
1063            next_offset += envelope_size;
1064
1065            // Decode the remaining unknown envelopes.
1066            while next_offset < end_offset {
1067                _next_ordinal_to_read += 1;
1068                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1069                next_offset += envelope_size;
1070            }
1071
1072            Ok(())
1073        }
1074    }
1075
1076    impl DebugGetControllerPropertiesResponse {
1077        #[inline(always)]
1078        fn max_ordinal_present(&self) -> u64 {
1079            if let Some(_) = self.name {
1080                return 1;
1081            }
1082            0
1083        }
1084    }
1085
1086    impl fidl::encoding::ValueTypeMarker for DebugGetControllerPropertiesResponse {
1087        type Borrowed<'a> = &'a Self;
1088        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1089            value
1090        }
1091    }
1092
1093    unsafe impl fidl::encoding::TypeMarker for DebugGetControllerPropertiesResponse {
1094        type Owned = Self;
1095
1096        #[inline(always)]
1097        fn inline_align(_context: fidl::encoding::Context) -> usize {
1098            8
1099        }
1100
1101        #[inline(always)]
1102        fn inline_size(_context: fidl::encoding::Context) -> usize {
1103            16
1104        }
1105    }
1106
1107    unsafe impl<D: fidl::encoding::ResourceDialect>
1108        fidl::encoding::Encode<DebugGetControllerPropertiesResponse, D>
1109        for &DebugGetControllerPropertiesResponse
1110    {
1111        unsafe fn encode(
1112            self,
1113            encoder: &mut fidl::encoding::Encoder<'_, D>,
1114            offset: usize,
1115            mut depth: fidl::encoding::Depth,
1116        ) -> fidl::Result<()> {
1117            encoder.debug_check_bounds::<DebugGetControllerPropertiesResponse>(offset);
1118            // Vector header
1119            let max_ordinal: u64 = self.max_ordinal_present();
1120            encoder.write_num(max_ordinal, offset);
1121            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1122            // Calling encoder.out_of_line_offset(0) is not allowed.
1123            if max_ordinal == 0 {
1124                return Ok(());
1125            }
1126            depth.increment()?;
1127            let envelope_size = 8;
1128            let bytes_len = max_ordinal as usize * envelope_size;
1129            #[allow(unused_variables)]
1130            let offset = encoder.out_of_line_offset(bytes_len);
1131            let mut _prev_end_offset: usize = 0;
1132            if 1 > max_ordinal {
1133                return Ok(());
1134            }
1135
1136            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1137            // are envelope_size bytes.
1138            let cur_offset: usize = (1 - 1) * envelope_size;
1139
1140            // Zero reserved fields.
1141            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1142
1143            // Safety:
1144            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1145            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1146            //   envelope_size bytes, there is always sufficient room.
1147            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<64>, D>(
1148                self.name.as_ref().map(
1149                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
1150                ),
1151                encoder,
1152                offset + cur_offset,
1153                depth,
1154            )?;
1155
1156            _prev_end_offset = cur_offset + envelope_size;
1157
1158            Ok(())
1159        }
1160    }
1161
1162    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1163        for DebugGetControllerPropertiesResponse
1164    {
1165        #[inline(always)]
1166        fn new_empty() -> Self {
1167            Self::default()
1168        }
1169
1170        unsafe fn decode(
1171            &mut self,
1172            decoder: &mut fidl::encoding::Decoder<'_, D>,
1173            offset: usize,
1174            mut depth: fidl::encoding::Depth,
1175        ) -> fidl::Result<()> {
1176            decoder.debug_check_bounds::<Self>(offset);
1177            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1178                None => return Err(fidl::Error::NotNullable),
1179                Some(len) => len,
1180            };
1181            // Calling decoder.out_of_line_offset(0) is not allowed.
1182            if len == 0 {
1183                return Ok(());
1184            };
1185            depth.increment()?;
1186            let envelope_size = 8;
1187            let bytes_len = len * envelope_size;
1188            let offset = decoder.out_of_line_offset(bytes_len)?;
1189            // Decode the envelope for each type.
1190            let mut _next_ordinal_to_read = 0;
1191            let mut next_offset = offset;
1192            let end_offset = offset + bytes_len;
1193            _next_ordinal_to_read += 1;
1194            if next_offset >= end_offset {
1195                return Ok(());
1196            }
1197
1198            // Decode unknown envelopes for gaps in ordinals.
1199            while _next_ordinal_to_read < 1 {
1200                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1201                _next_ordinal_to_read += 1;
1202                next_offset += envelope_size;
1203            }
1204
1205            let next_out_of_line = decoder.next_out_of_line();
1206            let handles_before = decoder.remaining_handles();
1207            if let Some((inlined, num_bytes, num_handles)) =
1208                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1209            {
1210                let member_inline_size =
1211                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
1212                        decoder.context,
1213                    );
1214                if inlined != (member_inline_size <= 4) {
1215                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1216                }
1217                let inner_offset;
1218                let mut inner_depth = depth.clone();
1219                if inlined {
1220                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1221                    inner_offset = next_offset;
1222                } else {
1223                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1224                    inner_depth.increment()?;
1225                }
1226                let val_ref = self
1227                    .name
1228                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<64>, D));
1229                fidl::decode!(
1230                    fidl::encoding::BoundedString<64>,
1231                    D,
1232                    val_ref,
1233                    decoder,
1234                    inner_offset,
1235                    inner_depth
1236                )?;
1237                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1238                {
1239                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1240                }
1241                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1242                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1243                }
1244            }
1245
1246            next_offset += envelope_size;
1247
1248            // Decode the remaining unknown envelopes.
1249            while next_offset < end_offset {
1250                _next_ordinal_to_read += 1;
1251                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1252                next_offset += envelope_size;
1253            }
1254
1255            Ok(())
1256        }
1257    }
1258
1259    impl DeviceGetPropertiesResponse {
1260        #[inline(always)]
1261        fn max_ordinal_present(&self) -> u64 {
1262            if let Some(_) = self.register_width_bytes {
1263                return 3;
1264            }
1265            if let Some(_) = self.name {
1266                return 2;
1267            }
1268            if let Some(_) = self.sid {
1269                return 1;
1270            }
1271            0
1272        }
1273    }
1274
1275    impl fidl::encoding::ValueTypeMarker for DeviceGetPropertiesResponse {
1276        type Borrowed<'a> = &'a Self;
1277        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1278            value
1279        }
1280    }
1281
1282    unsafe impl fidl::encoding::TypeMarker for DeviceGetPropertiesResponse {
1283        type Owned = Self;
1284
1285        #[inline(always)]
1286        fn inline_align(_context: fidl::encoding::Context) -> usize {
1287            8
1288        }
1289
1290        #[inline(always)]
1291        fn inline_size(_context: fidl::encoding::Context) -> usize {
1292            16
1293        }
1294    }
1295
1296    unsafe impl<D: fidl::encoding::ResourceDialect>
1297        fidl::encoding::Encode<DeviceGetPropertiesResponse, D> for &DeviceGetPropertiesResponse
1298    {
1299        unsafe fn encode(
1300            self,
1301            encoder: &mut fidl::encoding::Encoder<'_, D>,
1302            offset: usize,
1303            mut depth: fidl::encoding::Depth,
1304        ) -> fidl::Result<()> {
1305            encoder.debug_check_bounds::<DeviceGetPropertiesResponse>(offset);
1306            // Vector header
1307            let max_ordinal: u64 = self.max_ordinal_present();
1308            encoder.write_num(max_ordinal, offset);
1309            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1310            // Calling encoder.out_of_line_offset(0) is not allowed.
1311            if max_ordinal == 0 {
1312                return Ok(());
1313            }
1314            depth.increment()?;
1315            let envelope_size = 8;
1316            let bytes_len = max_ordinal as usize * envelope_size;
1317            #[allow(unused_variables)]
1318            let offset = encoder.out_of_line_offset(bytes_len);
1319            let mut _prev_end_offset: usize = 0;
1320            if 1 > max_ordinal {
1321                return Ok(());
1322            }
1323
1324            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1325            // are envelope_size bytes.
1326            let cur_offset: usize = (1 - 1) * envelope_size;
1327
1328            // Zero reserved fields.
1329            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1330
1331            // Safety:
1332            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1333            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1334            //   envelope_size bytes, there is always sufficient room.
1335            fidl::encoding::encode_in_envelope_optional::<u8, D>(
1336                self.sid.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
1337                encoder,
1338                offset + cur_offset,
1339                depth,
1340            )?;
1341
1342            _prev_end_offset = cur_offset + envelope_size;
1343            if 2 > max_ordinal {
1344                return Ok(());
1345            }
1346
1347            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1348            // are envelope_size bytes.
1349            let cur_offset: usize = (2 - 1) * envelope_size;
1350
1351            // Zero reserved fields.
1352            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1353
1354            // Safety:
1355            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1356            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1357            //   envelope_size bytes, there is always sufficient room.
1358            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<64>, D>(
1359                self.name.as_ref().map(
1360                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
1361                ),
1362                encoder,
1363                offset + cur_offset,
1364                depth,
1365            )?;
1366
1367            _prev_end_offset = cur_offset + envelope_size;
1368            if 3 > max_ordinal {
1369                return Ok(());
1370            }
1371
1372            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1373            // are envelope_size bytes.
1374            let cur_offset: usize = (3 - 1) * envelope_size;
1375
1376            // Zero reserved fields.
1377            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1378
1379            // Safety:
1380            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1381            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1382            //   envelope_size bytes, there is always sufficient room.
1383            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1384                self.register_width_bytes
1385                    .as_ref()
1386                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1387                encoder,
1388                offset + cur_offset,
1389                depth,
1390            )?;
1391
1392            _prev_end_offset = cur_offset + envelope_size;
1393
1394            Ok(())
1395        }
1396    }
1397
1398    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1399        for DeviceGetPropertiesResponse
1400    {
1401        #[inline(always)]
1402        fn new_empty() -> Self {
1403            Self::default()
1404        }
1405
1406        unsafe fn decode(
1407            &mut self,
1408            decoder: &mut fidl::encoding::Decoder<'_, D>,
1409            offset: usize,
1410            mut depth: fidl::encoding::Depth,
1411        ) -> fidl::Result<()> {
1412            decoder.debug_check_bounds::<Self>(offset);
1413            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1414                None => return Err(fidl::Error::NotNullable),
1415                Some(len) => len,
1416            };
1417            // Calling decoder.out_of_line_offset(0) is not allowed.
1418            if len == 0 {
1419                return Ok(());
1420            };
1421            depth.increment()?;
1422            let envelope_size = 8;
1423            let bytes_len = len * envelope_size;
1424            let offset = decoder.out_of_line_offset(bytes_len)?;
1425            // Decode the envelope for each type.
1426            let mut _next_ordinal_to_read = 0;
1427            let mut next_offset = offset;
1428            let end_offset = offset + bytes_len;
1429            _next_ordinal_to_read += 1;
1430            if next_offset >= end_offset {
1431                return Ok(());
1432            }
1433
1434            // Decode unknown envelopes for gaps in ordinals.
1435            while _next_ordinal_to_read < 1 {
1436                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1437                _next_ordinal_to_read += 1;
1438                next_offset += envelope_size;
1439            }
1440
1441            let next_out_of_line = decoder.next_out_of_line();
1442            let handles_before = decoder.remaining_handles();
1443            if let Some((inlined, num_bytes, num_handles)) =
1444                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1445            {
1446                let member_inline_size =
1447                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1448                if inlined != (member_inline_size <= 4) {
1449                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1450                }
1451                let inner_offset;
1452                let mut inner_depth = depth.clone();
1453                if inlined {
1454                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1455                    inner_offset = next_offset;
1456                } else {
1457                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1458                    inner_depth.increment()?;
1459                }
1460                let val_ref = self.sid.get_or_insert_with(|| fidl::new_empty!(u8, D));
1461                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
1462                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1463                {
1464                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1465                }
1466                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1467                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1468                }
1469            }
1470
1471            next_offset += envelope_size;
1472            _next_ordinal_to_read += 1;
1473            if next_offset >= end_offset {
1474                return Ok(());
1475            }
1476
1477            // Decode unknown envelopes for gaps in ordinals.
1478            while _next_ordinal_to_read < 2 {
1479                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1480                _next_ordinal_to_read += 1;
1481                next_offset += envelope_size;
1482            }
1483
1484            let next_out_of_line = decoder.next_out_of_line();
1485            let handles_before = decoder.remaining_handles();
1486            if let Some((inlined, num_bytes, num_handles)) =
1487                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1488            {
1489                let member_inline_size =
1490                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
1491                        decoder.context,
1492                    );
1493                if inlined != (member_inline_size <= 4) {
1494                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1495                }
1496                let inner_offset;
1497                let mut inner_depth = depth.clone();
1498                if inlined {
1499                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1500                    inner_offset = next_offset;
1501                } else {
1502                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1503                    inner_depth.increment()?;
1504                }
1505                let val_ref = self
1506                    .name
1507                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<64>, D));
1508                fidl::decode!(
1509                    fidl::encoding::BoundedString<64>,
1510                    D,
1511                    val_ref,
1512                    decoder,
1513                    inner_offset,
1514                    inner_depth
1515                )?;
1516                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1517                {
1518                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1519                }
1520                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1521                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1522                }
1523            }
1524
1525            next_offset += envelope_size;
1526            _next_ordinal_to_read += 1;
1527            if next_offset >= end_offset {
1528                return Ok(());
1529            }
1530
1531            // Decode unknown envelopes for gaps in ordinals.
1532            while _next_ordinal_to_read < 3 {
1533                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1534                _next_ordinal_to_read += 1;
1535                next_offset += envelope_size;
1536            }
1537
1538            let next_out_of_line = decoder.next_out_of_line();
1539            let handles_before = decoder.remaining_handles();
1540            if let Some((inlined, num_bytes, num_handles)) =
1541                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1542            {
1543                let member_inline_size =
1544                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1545                if inlined != (member_inline_size <= 4) {
1546                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1547                }
1548                let inner_offset;
1549                let mut inner_depth = depth.clone();
1550                if inlined {
1551                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1552                    inner_offset = next_offset;
1553                } else {
1554                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1555                    inner_depth.increment()?;
1556                }
1557                let val_ref =
1558                    self.register_width_bytes.get_or_insert_with(|| fidl::new_empty!(u32, D));
1559                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1560                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1561                {
1562                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1563                }
1564                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1565                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1566                }
1567            }
1568
1569            next_offset += envelope_size;
1570
1571            // Decode the remaining unknown envelopes.
1572            while next_offset < end_offset {
1573                _next_ordinal_to_read += 1;
1574                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1575                next_offset += envelope_size;
1576            }
1577
1578            Ok(())
1579        }
1580    }
1581
1582    impl SubTargetInfo {
1583        #[inline(always)]
1584        fn max_ordinal_present(&self) -> u64 {
1585            if let Some(_) = self.display_name {
1586                return 4;
1587            }
1588            if let Some(_) = self.name {
1589                return 3;
1590            }
1591            if let Some(_) = self.size {
1592                return 2;
1593            }
1594            if let Some(_) = self.address {
1595                return 1;
1596            }
1597            0
1598        }
1599    }
1600
1601    impl fidl::encoding::ValueTypeMarker for SubTargetInfo {
1602        type Borrowed<'a> = &'a Self;
1603        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1604            value
1605        }
1606    }
1607
1608    unsafe impl fidl::encoding::TypeMarker for SubTargetInfo {
1609        type Owned = Self;
1610
1611        #[inline(always)]
1612        fn inline_align(_context: fidl::encoding::Context) -> usize {
1613            8
1614        }
1615
1616        #[inline(always)]
1617        fn inline_size(_context: fidl::encoding::Context) -> usize {
1618            16
1619        }
1620    }
1621
1622    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SubTargetInfo, D>
1623        for &SubTargetInfo
1624    {
1625        unsafe fn encode(
1626            self,
1627            encoder: &mut fidl::encoding::Encoder<'_, D>,
1628            offset: usize,
1629            mut depth: fidl::encoding::Depth,
1630        ) -> fidl::Result<()> {
1631            encoder.debug_check_bounds::<SubTargetInfo>(offset);
1632            // Vector header
1633            let max_ordinal: u64 = self.max_ordinal_present();
1634            encoder.write_num(max_ordinal, offset);
1635            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1636            // Calling encoder.out_of_line_offset(0) is not allowed.
1637            if max_ordinal == 0 {
1638                return Ok(());
1639            }
1640            depth.increment()?;
1641            let envelope_size = 8;
1642            let bytes_len = max_ordinal as usize * envelope_size;
1643            #[allow(unused_variables)]
1644            let offset = encoder.out_of_line_offset(bytes_len);
1645            let mut _prev_end_offset: usize = 0;
1646            if 1 > max_ordinal {
1647                return Ok(());
1648            }
1649
1650            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1651            // are envelope_size bytes.
1652            let cur_offset: usize = (1 - 1) * envelope_size;
1653
1654            // Zero reserved fields.
1655            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1656
1657            // Safety:
1658            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1659            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1660            //   envelope_size bytes, there is always sufficient room.
1661            fidl::encoding::encode_in_envelope_optional::<u16, D>(
1662                self.address.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
1663                encoder,
1664                offset + cur_offset,
1665                depth,
1666            )?;
1667
1668            _prev_end_offset = cur_offset + envelope_size;
1669            if 2 > max_ordinal {
1670                return Ok(());
1671            }
1672
1673            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1674            // are envelope_size bytes.
1675            let cur_offset: usize = (2 - 1) * envelope_size;
1676
1677            // Zero reserved fields.
1678            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1679
1680            // Safety:
1681            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1682            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1683            //   envelope_size bytes, there is always sufficient room.
1684            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1685                self.size.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1686                encoder,
1687                offset + cur_offset,
1688                depth,
1689            )?;
1690
1691            _prev_end_offset = cur_offset + envelope_size;
1692            if 3 > max_ordinal {
1693                return Ok(());
1694            }
1695
1696            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1697            // are envelope_size bytes.
1698            let cur_offset: usize = (3 - 1) * envelope_size;
1699
1700            // Zero reserved fields.
1701            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1702
1703            // Safety:
1704            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1705            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1706            //   envelope_size bytes, there is always sufficient room.
1707            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<64>, D>(
1708                self.name.as_ref().map(
1709                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
1710                ),
1711                encoder,
1712                offset + cur_offset,
1713                depth,
1714            )?;
1715
1716            _prev_end_offset = cur_offset + envelope_size;
1717            if 4 > max_ordinal {
1718                return Ok(());
1719            }
1720
1721            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1722            // are envelope_size bytes.
1723            let cur_offset: usize = (4 - 1) * envelope_size;
1724
1725            // Zero reserved fields.
1726            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1727
1728            // Safety:
1729            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1730            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1731            //   envelope_size bytes, there is always sufficient room.
1732            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
1733                self.display_name.as_ref().map(
1734                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
1735                ),
1736                encoder,
1737                offset + cur_offset,
1738                depth,
1739            )?;
1740
1741            _prev_end_offset = cur_offset + envelope_size;
1742
1743            Ok(())
1744        }
1745    }
1746
1747    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SubTargetInfo {
1748        #[inline(always)]
1749        fn new_empty() -> Self {
1750            Self::default()
1751        }
1752
1753        unsafe fn decode(
1754            &mut self,
1755            decoder: &mut fidl::encoding::Decoder<'_, D>,
1756            offset: usize,
1757            mut depth: fidl::encoding::Depth,
1758        ) -> fidl::Result<()> {
1759            decoder.debug_check_bounds::<Self>(offset);
1760            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1761                None => return Err(fidl::Error::NotNullable),
1762                Some(len) => len,
1763            };
1764            // Calling decoder.out_of_line_offset(0) is not allowed.
1765            if len == 0 {
1766                return Ok(());
1767            };
1768            depth.increment()?;
1769            let envelope_size = 8;
1770            let bytes_len = len * envelope_size;
1771            let offset = decoder.out_of_line_offset(bytes_len)?;
1772            // Decode the envelope for each type.
1773            let mut _next_ordinal_to_read = 0;
1774            let mut next_offset = offset;
1775            let end_offset = offset + bytes_len;
1776            _next_ordinal_to_read += 1;
1777            if next_offset >= end_offset {
1778                return Ok(());
1779            }
1780
1781            // Decode unknown envelopes for gaps in ordinals.
1782            while _next_ordinal_to_read < 1 {
1783                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1784                _next_ordinal_to_read += 1;
1785                next_offset += envelope_size;
1786            }
1787
1788            let next_out_of_line = decoder.next_out_of_line();
1789            let handles_before = decoder.remaining_handles();
1790            if let Some((inlined, num_bytes, num_handles)) =
1791                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1792            {
1793                let member_inline_size =
1794                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1795                if inlined != (member_inline_size <= 4) {
1796                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1797                }
1798                let inner_offset;
1799                let mut inner_depth = depth.clone();
1800                if inlined {
1801                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1802                    inner_offset = next_offset;
1803                } else {
1804                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1805                    inner_depth.increment()?;
1806                }
1807                let val_ref = self.address.get_or_insert_with(|| fidl::new_empty!(u16, D));
1808                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
1809                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1810                {
1811                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1812                }
1813                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1814                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1815                }
1816            }
1817
1818            next_offset += envelope_size;
1819            _next_ordinal_to_read += 1;
1820            if next_offset >= end_offset {
1821                return Ok(());
1822            }
1823
1824            // Decode unknown envelopes for gaps in ordinals.
1825            while _next_ordinal_to_read < 2 {
1826                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1827                _next_ordinal_to_read += 1;
1828                next_offset += envelope_size;
1829            }
1830
1831            let next_out_of_line = decoder.next_out_of_line();
1832            let handles_before = decoder.remaining_handles();
1833            if let Some((inlined, num_bytes, num_handles)) =
1834                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1835            {
1836                let member_inline_size =
1837                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1838                if inlined != (member_inline_size <= 4) {
1839                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1840                }
1841                let inner_offset;
1842                let mut inner_depth = depth.clone();
1843                if inlined {
1844                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1845                    inner_offset = next_offset;
1846                } else {
1847                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1848                    inner_depth.increment()?;
1849                }
1850                let val_ref = self.size.get_or_insert_with(|| fidl::new_empty!(u32, D));
1851                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1852                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1853                {
1854                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1855                }
1856                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1857                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1858                }
1859            }
1860
1861            next_offset += envelope_size;
1862            _next_ordinal_to_read += 1;
1863            if next_offset >= end_offset {
1864                return Ok(());
1865            }
1866
1867            // Decode unknown envelopes for gaps in ordinals.
1868            while _next_ordinal_to_read < 3 {
1869                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1870                _next_ordinal_to_read += 1;
1871                next_offset += envelope_size;
1872            }
1873
1874            let next_out_of_line = decoder.next_out_of_line();
1875            let handles_before = decoder.remaining_handles();
1876            if let Some((inlined, num_bytes, num_handles)) =
1877                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1878            {
1879                let member_inline_size =
1880                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
1881                        decoder.context,
1882                    );
1883                if inlined != (member_inline_size <= 4) {
1884                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1885                }
1886                let inner_offset;
1887                let mut inner_depth = depth.clone();
1888                if inlined {
1889                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1890                    inner_offset = next_offset;
1891                } else {
1892                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1893                    inner_depth.increment()?;
1894                }
1895                let val_ref = self
1896                    .name
1897                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<64>, D));
1898                fidl::decode!(
1899                    fidl::encoding::BoundedString<64>,
1900                    D,
1901                    val_ref,
1902                    decoder,
1903                    inner_offset,
1904                    inner_depth
1905                )?;
1906                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1907                {
1908                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1909                }
1910                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1911                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1912                }
1913            }
1914
1915            next_offset += envelope_size;
1916            _next_ordinal_to_read += 1;
1917            if next_offset >= end_offset {
1918                return Ok(());
1919            }
1920
1921            // Decode unknown envelopes for gaps in ordinals.
1922            while _next_ordinal_to_read < 4 {
1923                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1924                _next_ordinal_to_read += 1;
1925                next_offset += envelope_size;
1926            }
1927
1928            let next_out_of_line = decoder.next_out_of_line();
1929            let handles_before = decoder.remaining_handles();
1930            if let Some((inlined, num_bytes, num_handles)) =
1931                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1932            {
1933                let member_inline_size =
1934                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
1935                        decoder.context,
1936                    );
1937                if inlined != (member_inline_size <= 4) {
1938                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1939                }
1940                let inner_offset;
1941                let mut inner_depth = depth.clone();
1942                if inlined {
1943                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1944                    inner_offset = next_offset;
1945                } else {
1946                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1947                    inner_depth.increment()?;
1948                }
1949                let val_ref = self
1950                    .display_name
1951                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
1952                fidl::decode!(
1953                    fidl::encoding::UnboundedString,
1954                    D,
1955                    val_ref,
1956                    decoder,
1957                    inner_offset,
1958                    inner_depth
1959                )?;
1960                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1961                {
1962                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1963                }
1964                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1965                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1966                }
1967            }
1968
1969            next_offset += envelope_size;
1970
1971            // Decode the remaining unknown envelopes.
1972            while next_offset < end_offset {
1973                _next_ordinal_to_read += 1;
1974                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1975                next_offset += envelope_size;
1976            }
1977
1978            Ok(())
1979        }
1980    }
1981
1982    impl TargetInfo {
1983        #[inline(always)]
1984        fn max_ordinal_present(&self) -> u64 {
1985            if let Some(_) = self.display_name {
1986                return 4;
1987            }
1988            if let Some(_) = self.name {
1989                return 3;
1990            }
1991            if let Some(_) = self.sub_targets {
1992                return 2;
1993            }
1994            if let Some(_) = self.id {
1995                return 1;
1996            }
1997            0
1998        }
1999    }
2000
2001    impl fidl::encoding::ValueTypeMarker for TargetInfo {
2002        type Borrowed<'a> = &'a Self;
2003        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2004            value
2005        }
2006    }
2007
2008    unsafe impl fidl::encoding::TypeMarker for TargetInfo {
2009        type Owned = Self;
2010
2011        #[inline(always)]
2012        fn inline_align(_context: fidl::encoding::Context) -> usize {
2013            8
2014        }
2015
2016        #[inline(always)]
2017        fn inline_size(_context: fidl::encoding::Context) -> usize {
2018            16
2019        }
2020    }
2021
2022    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<TargetInfo, D>
2023        for &TargetInfo
2024    {
2025        unsafe fn encode(
2026            self,
2027            encoder: &mut fidl::encoding::Encoder<'_, D>,
2028            offset: usize,
2029            mut depth: fidl::encoding::Depth,
2030        ) -> fidl::Result<()> {
2031            encoder.debug_check_bounds::<TargetInfo>(offset);
2032            // Vector header
2033            let max_ordinal: u64 = self.max_ordinal_present();
2034            encoder.write_num(max_ordinal, offset);
2035            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2036            // Calling encoder.out_of_line_offset(0) is not allowed.
2037            if max_ordinal == 0 {
2038                return Ok(());
2039            }
2040            depth.increment()?;
2041            let envelope_size = 8;
2042            let bytes_len = max_ordinal as usize * envelope_size;
2043            #[allow(unused_variables)]
2044            let offset = encoder.out_of_line_offset(bytes_len);
2045            let mut _prev_end_offset: usize = 0;
2046            if 1 > max_ordinal {
2047                return Ok(());
2048            }
2049
2050            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2051            // are envelope_size bytes.
2052            let cur_offset: usize = (1 - 1) * envelope_size;
2053
2054            // Zero reserved fields.
2055            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2056
2057            // Safety:
2058            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2059            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2060            //   envelope_size bytes, there is always sufficient room.
2061            fidl::encoding::encode_in_envelope_optional::<u8, D>(
2062                self.id.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
2063                encoder,
2064                offset + cur_offset,
2065                depth,
2066            )?;
2067
2068            _prev_end_offset = cur_offset + envelope_size;
2069            if 2 > max_ordinal {
2070                return Ok(());
2071            }
2072
2073            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2074            // are envelope_size bytes.
2075            let cur_offset: usize = (2 - 1) * envelope_size;
2076
2077            // Zero reserved fields.
2078            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2079
2080            // Safety:
2081            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2082            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2083            //   envelope_size bytes, there is always sufficient room.
2084            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<SubTargetInfo, 65536>, D>(
2085            self.sub_targets.as_ref().map(<fidl::encoding::Vector<SubTargetInfo, 65536> as fidl::encoding::ValueTypeMarker>::borrow),
2086            encoder, offset + cur_offset, depth
2087        )?;
2088
2089            _prev_end_offset = cur_offset + envelope_size;
2090            if 3 > max_ordinal {
2091                return Ok(());
2092            }
2093
2094            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2095            // are envelope_size bytes.
2096            let cur_offset: usize = (3 - 1) * envelope_size;
2097
2098            // Zero reserved fields.
2099            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2100
2101            // Safety:
2102            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2103            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2104            //   envelope_size bytes, there is always sufficient room.
2105            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<64>, D>(
2106                self.name.as_ref().map(
2107                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
2108                ),
2109                encoder,
2110                offset + cur_offset,
2111                depth,
2112            )?;
2113
2114            _prev_end_offset = cur_offset + envelope_size;
2115            if 4 > max_ordinal {
2116                return Ok(());
2117            }
2118
2119            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2120            // are envelope_size bytes.
2121            let cur_offset: usize = (4 - 1) * envelope_size;
2122
2123            // Zero reserved fields.
2124            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2125
2126            // Safety:
2127            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2128            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2129            //   envelope_size bytes, there is always sufficient room.
2130            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
2131                self.display_name.as_ref().map(
2132                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
2133                ),
2134                encoder,
2135                offset + cur_offset,
2136                depth,
2137            )?;
2138
2139            _prev_end_offset = cur_offset + envelope_size;
2140
2141            Ok(())
2142        }
2143    }
2144
2145    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for TargetInfo {
2146        #[inline(always)]
2147        fn new_empty() -> Self {
2148            Self::default()
2149        }
2150
2151        unsafe fn decode(
2152            &mut self,
2153            decoder: &mut fidl::encoding::Decoder<'_, D>,
2154            offset: usize,
2155            mut depth: fidl::encoding::Depth,
2156        ) -> fidl::Result<()> {
2157            decoder.debug_check_bounds::<Self>(offset);
2158            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2159                None => return Err(fidl::Error::NotNullable),
2160                Some(len) => len,
2161            };
2162            // Calling decoder.out_of_line_offset(0) is not allowed.
2163            if len == 0 {
2164                return Ok(());
2165            };
2166            depth.increment()?;
2167            let envelope_size = 8;
2168            let bytes_len = len * envelope_size;
2169            let offset = decoder.out_of_line_offset(bytes_len)?;
2170            // Decode the envelope for each type.
2171            let mut _next_ordinal_to_read = 0;
2172            let mut next_offset = offset;
2173            let end_offset = offset + bytes_len;
2174            _next_ordinal_to_read += 1;
2175            if next_offset >= end_offset {
2176                return Ok(());
2177            }
2178
2179            // Decode unknown envelopes for gaps in ordinals.
2180            while _next_ordinal_to_read < 1 {
2181                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2182                _next_ordinal_to_read += 1;
2183                next_offset += envelope_size;
2184            }
2185
2186            let next_out_of_line = decoder.next_out_of_line();
2187            let handles_before = decoder.remaining_handles();
2188            if let Some((inlined, num_bytes, num_handles)) =
2189                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2190            {
2191                let member_inline_size =
2192                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2193                if inlined != (member_inline_size <= 4) {
2194                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2195                }
2196                let inner_offset;
2197                let mut inner_depth = depth.clone();
2198                if inlined {
2199                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2200                    inner_offset = next_offset;
2201                } else {
2202                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2203                    inner_depth.increment()?;
2204                }
2205                let val_ref = self.id.get_or_insert_with(|| fidl::new_empty!(u8, D));
2206                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
2207                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2208                {
2209                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2210                }
2211                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2212                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2213                }
2214            }
2215
2216            next_offset += envelope_size;
2217            _next_ordinal_to_read += 1;
2218            if next_offset >= end_offset {
2219                return Ok(());
2220            }
2221
2222            // Decode unknown envelopes for gaps in ordinals.
2223            while _next_ordinal_to_read < 2 {
2224                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2225                _next_ordinal_to_read += 1;
2226                next_offset += envelope_size;
2227            }
2228
2229            let next_out_of_line = decoder.next_out_of_line();
2230            let handles_before = decoder.remaining_handles();
2231            if let Some((inlined, num_bytes, num_handles)) =
2232                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2233            {
2234                let member_inline_size = <fidl::encoding::Vector<SubTargetInfo, 65536> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2235                if inlined != (member_inline_size <= 4) {
2236                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2237                }
2238                let inner_offset;
2239                let mut inner_depth = depth.clone();
2240                if inlined {
2241                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2242                    inner_offset = next_offset;
2243                } else {
2244                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2245                    inner_depth.increment()?;
2246                }
2247                let val_ref = self.sub_targets.get_or_insert_with(
2248                    || fidl::new_empty!(fidl::encoding::Vector<SubTargetInfo, 65536>, D),
2249                );
2250                fidl::decode!(fidl::encoding::Vector<SubTargetInfo, 65536>, D, val_ref, decoder, inner_offset, inner_depth)?;
2251                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2252                {
2253                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2254                }
2255                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2256                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2257                }
2258            }
2259
2260            next_offset += envelope_size;
2261            _next_ordinal_to_read += 1;
2262            if next_offset >= end_offset {
2263                return Ok(());
2264            }
2265
2266            // Decode unknown envelopes for gaps in ordinals.
2267            while _next_ordinal_to_read < 3 {
2268                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2269                _next_ordinal_to_read += 1;
2270                next_offset += envelope_size;
2271            }
2272
2273            let next_out_of_line = decoder.next_out_of_line();
2274            let handles_before = decoder.remaining_handles();
2275            if let Some((inlined, num_bytes, num_handles)) =
2276                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2277            {
2278                let member_inline_size =
2279                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
2280                        decoder.context,
2281                    );
2282                if inlined != (member_inline_size <= 4) {
2283                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2284                }
2285                let inner_offset;
2286                let mut inner_depth = depth.clone();
2287                if inlined {
2288                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2289                    inner_offset = next_offset;
2290                } else {
2291                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2292                    inner_depth.increment()?;
2293                }
2294                let val_ref = self
2295                    .name
2296                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<64>, D));
2297                fidl::decode!(
2298                    fidl::encoding::BoundedString<64>,
2299                    D,
2300                    val_ref,
2301                    decoder,
2302                    inner_offset,
2303                    inner_depth
2304                )?;
2305                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2306                {
2307                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2308                }
2309                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2310                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2311                }
2312            }
2313
2314            next_offset += envelope_size;
2315            _next_ordinal_to_read += 1;
2316            if next_offset >= end_offset {
2317                return Ok(());
2318            }
2319
2320            // Decode unknown envelopes for gaps in ordinals.
2321            while _next_ordinal_to_read < 4 {
2322                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2323                _next_ordinal_to_read += 1;
2324                next_offset += envelope_size;
2325            }
2326
2327            let next_out_of_line = decoder.next_out_of_line();
2328            let handles_before = decoder.remaining_handles();
2329            if let Some((inlined, num_bytes, num_handles)) =
2330                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2331            {
2332                let member_inline_size =
2333                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
2334                        decoder.context,
2335                    );
2336                if inlined != (member_inline_size <= 4) {
2337                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2338                }
2339                let inner_offset;
2340                let mut inner_depth = depth.clone();
2341                if inlined {
2342                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2343                    inner_offset = next_offset;
2344                } else {
2345                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2346                    inner_depth.increment()?;
2347                }
2348                let val_ref = self
2349                    .display_name
2350                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
2351                fidl::decode!(
2352                    fidl::encoding::UnboundedString,
2353                    D,
2354                    val_ref,
2355                    decoder,
2356                    inner_offset,
2357                    inner_depth
2358                )?;
2359                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2360                {
2361                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2362                }
2363                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2364                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2365                }
2366            }
2367
2368            next_offset += envelope_size;
2369
2370            // Decode the remaining unknown envelopes.
2371            while next_offset < end_offset {
2372                _next_ordinal_to_read += 1;
2373                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2374                next_offset += envelope_size;
2375            }
2376
2377            Ok(())
2378        }
2379    }
2380}