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