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