Skip to main content

fidl_fuchsia_hardware_power_statecontrol__common/
fidl_fuchsia_hardware_power_statecontrol__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/// The maximum number of reboot reasons that can be attributed to a single
12/// reboot request.
13pub const MAX_REBOOT_REASONS: u8 = 100;
14
15/// The maxium number of seconds the server will wait for responses from all RebootMethodsWatchers
16/// before changing the system power state.
17pub const MAX_REBOOT_WATCHER_RESPONSE_TIME_SECONDS: u32 = 5;
18
19/// The maximum number of shutdown reasons that can be attributed to a single
20/// shutdown request.
21pub const MAX_SHUTDOWN_REASONS: u8 = 100;
22
23/// The maximum number of seconds the server will wait for responses from all ShutdownWatchers
24/// before changing the system power state.
25pub const MAX_SHUTDOWN_WATCHER_RESPONSE_TIME_SECONDS: u32 = 5;
26
27/// The maximum number of seconds the server will wait for responses from all TerminalStateWatchers
28/// before changing the system power state.
29pub const MAX_TERMINAL_STATE_WATCHER_RESPONSE_TIME_SECONDS: u32 = 5;
30
31/// Why the system reboots.
32///
33/// Replaced by `ShutdownReason`.
34#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
35pub enum RebootReason2 {
36    /// The device rebooted because the end user of the device initiated the reboot.
37    ///
38    /// DO NOT USE for any code path not directly related to an end user explicit reboot action.
39    /// Use DEVELOPER_REQUEST below instead.
40    UserRequest,
41    /// The device rebooted because a developer initiated the reboot, typically via a shell command
42    /// or similar interface, including within an automated test.
43    DeveloperRequest,
44    /// A new system update has been downloaded.
45    SystemUpdate,
46    /// Applying the system update has failed.
47    RetrySystemUpdate,
48    HighTemperature,
49    FactoryDataReset,
50    /// Sessionmgr has failed.
51    SessionFailure,
52    /// sysmgr crashed.
53    SysmgrFailure,
54    /// A critical system component has failed.
55    CriticalComponentFailure,
56    /// A boot partition change was effected.
57    ZbiSwap,
58    /// The system hit a critical low threshold of available memory.
59    OutOfMemory,
60    /// The Netstack component is changing versions.
61    NetstackMigration,
62    /// An Android-initiated reboot reason that Starnix doesn't recognize
63    AndroidUnexpectedReason,
64    /// Android called for the "RescueParty".
65    AndroidRescueParty,
66    /// A critical Android process failed.
67    AndroidCriticalProcessFailure,
68    #[doc(hidden)]
69    __SourceBreaking {
70        unknown_ordinal: u32,
71    },
72}
73
74/// Pattern that matches an unknown `RebootReason2` member.
75#[macro_export]
76macro_rules! RebootReason2Unknown {
77    () => {
78        _
79    };
80}
81
82impl RebootReason2 {
83    #[inline]
84    pub fn from_primitive(prim: u32) -> Option<Self> {
85        match prim {
86            1 => Some(Self::UserRequest),
87            13 => Some(Self::DeveloperRequest),
88            2 => Some(Self::SystemUpdate),
89            8 => Some(Self::RetrySystemUpdate),
90            3 => Some(Self::HighTemperature),
91            6 => Some(Self::FactoryDataReset),
92            4 => Some(Self::SessionFailure),
93            5 => Some(Self::SysmgrFailure),
94            7 => Some(Self::CriticalComponentFailure),
95            9 => Some(Self::ZbiSwap),
96            10 => Some(Self::OutOfMemory),
97            11 => Some(Self::NetstackMigration),
98            12 => Some(Self::AndroidUnexpectedReason),
99            14 => Some(Self::AndroidRescueParty),
100            15 => Some(Self::AndroidCriticalProcessFailure),
101            _ => None,
102        }
103    }
104
105    #[inline]
106    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
107        match prim {
108            1 => Self::UserRequest,
109            13 => Self::DeveloperRequest,
110            2 => Self::SystemUpdate,
111            8 => Self::RetrySystemUpdate,
112            3 => Self::HighTemperature,
113            6 => Self::FactoryDataReset,
114            4 => Self::SessionFailure,
115            5 => Self::SysmgrFailure,
116            7 => Self::CriticalComponentFailure,
117            9 => Self::ZbiSwap,
118            10 => Self::OutOfMemory,
119            11 => Self::NetstackMigration,
120            12 => Self::AndroidUnexpectedReason,
121            14 => Self::AndroidRescueParty,
122            15 => Self::AndroidCriticalProcessFailure,
123            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
124        }
125    }
126
127    #[inline]
128    pub fn unknown() -> Self {
129        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
130    }
131
132    #[inline]
133    pub const fn into_primitive(self) -> u32 {
134        match self {
135            Self::UserRequest => 1,
136            Self::DeveloperRequest => 13,
137            Self::SystemUpdate => 2,
138            Self::RetrySystemUpdate => 8,
139            Self::HighTemperature => 3,
140            Self::FactoryDataReset => 6,
141            Self::SessionFailure => 4,
142            Self::SysmgrFailure => 5,
143            Self::CriticalComponentFailure => 7,
144            Self::ZbiSwap => 9,
145            Self::OutOfMemory => 10,
146            Self::NetstackMigration => 11,
147            Self::AndroidUnexpectedReason => 12,
148            Self::AndroidRescueParty => 14,
149            Self::AndroidCriticalProcessFailure => 15,
150            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
151        }
152    }
153
154    #[inline]
155    pub fn is_unknown(&self) -> bool {
156        match self {
157            Self::__SourceBreaking { unknown_ordinal: _ } => true,
158            _ => false,
159        }
160    }
161}
162
163#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
164pub enum ShutdownAction {
165    Poweroff,
166    Reboot,
167    RebootToRecovery,
168    RebootToBootloader,
169    #[doc(hidden)]
170    __SourceBreaking {
171        unknown_ordinal: u32,
172    },
173}
174
175/// Pattern that matches an unknown `ShutdownAction` member.
176#[macro_export]
177macro_rules! ShutdownActionUnknown {
178    () => {
179        _
180    };
181}
182
183impl ShutdownAction {
184    #[inline]
185    pub fn from_primitive(prim: u32) -> Option<Self> {
186        match prim {
187            1 => Some(Self::Poweroff),
188            2 => Some(Self::Reboot),
189            3 => Some(Self::RebootToRecovery),
190            4 => Some(Self::RebootToBootloader),
191            _ => None,
192        }
193    }
194
195    #[inline]
196    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
197        match prim {
198            1 => Self::Poweroff,
199            2 => Self::Reboot,
200            3 => Self::RebootToRecovery,
201            4 => Self::RebootToBootloader,
202            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
203        }
204    }
205
206    #[inline]
207    pub fn unknown() -> Self {
208        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
209    }
210
211    #[inline]
212    pub const fn into_primitive(self) -> u32 {
213        match self {
214            Self::Poweroff => 1,
215            Self::Reboot => 2,
216            Self::RebootToRecovery => 3,
217            Self::RebootToBootloader => 4,
218            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
219        }
220    }
221
222    #[inline]
223    pub fn is_unknown(&self) -> bool {
224        match self {
225            Self::__SourceBreaking { unknown_ordinal: _ } => true,
226            _ => false,
227        }
228    }
229}
230
231/// Why the system is shutting down.
232#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
233pub enum ShutdownReason {
234    /// The end user of the device initiated the shutdown.
235    ///
236    /// DO NOT USE for any code path not directly related to an end user explicit shutdown action.
237    /// Use DEVELOPER_REQUEST below instead.
238    UserRequest,
239    /// The end user of the device initiated the shutdown because the device was stuck.
240    UserRequestDeviceStuck,
241    /// The developer initiated the shutdown, typically via a shell command or similar interface,
242    /// including within an automated test.
243    DeveloperRequest,
244    /// A new system update has been downloaded.
245    SystemUpdate,
246    /// Applying the system update has failed.
247    RetrySystemUpdate,
248    /// The device has crossed the high temperature threshold.
249    HighTemperature,
250    /// The device is about to perform an FDR.
251    FactoryDataReset,
252    /// Sessionmgr has failed.
253    SessionFailure,
254    /// A critical system component has failed.
255    CriticalComponentFailure,
256    /// A boot partition change was effected.
257    ZbiSwap,
258    /// The system hit a critical low threshold of available memory.
259    OutOfMemory,
260    /// The Netstack component is changing versions.
261    NetstackMigration,
262    /// An Android-initiated shutdown reason that Starnix doesn't recognize.
263    AndroidUnexpectedReason,
264    /// A Starnix container initiated the shutdown but Starnix doesn't know why.
265    StarnixContainerNoReason,
266    /// Android called for the "RescueParty".
267    AndroidRescueParty,
268    /// A critical Android process failed.
269    AndroidCriticalProcessFailure,
270    #[doc(hidden)]
271    __SourceBreaking { unknown_ordinal: u32 },
272}
273
274/// Pattern that matches an unknown `ShutdownReason` member.
275#[macro_export]
276macro_rules! ShutdownReasonUnknown {
277    () => {
278        _
279    };
280}
281
282impl ShutdownReason {
283    #[inline]
284    pub fn from_primitive(prim: u32) -> Option<Self> {
285        match prim {
286            1 => Some(Self::UserRequest),
287            16 => Some(Self::UserRequestDeviceStuck),
288            2 => Some(Self::DeveloperRequest),
289            3 => Some(Self::SystemUpdate),
290            4 => Some(Self::RetrySystemUpdate),
291            5 => Some(Self::HighTemperature),
292            6 => Some(Self::FactoryDataReset),
293            7 => Some(Self::SessionFailure),
294            8 => Some(Self::CriticalComponentFailure),
295            9 => Some(Self::ZbiSwap),
296            10 => Some(Self::OutOfMemory),
297            11 => Some(Self::NetstackMigration),
298            12 => Some(Self::AndroidUnexpectedReason),
299            15 => Some(Self::StarnixContainerNoReason),
300            13 => Some(Self::AndroidRescueParty),
301            14 => Some(Self::AndroidCriticalProcessFailure),
302            _ => None,
303        }
304    }
305
306    #[inline]
307    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
308        match prim {
309            1 => Self::UserRequest,
310            16 => Self::UserRequestDeviceStuck,
311            2 => Self::DeveloperRequest,
312            3 => Self::SystemUpdate,
313            4 => Self::RetrySystemUpdate,
314            5 => Self::HighTemperature,
315            6 => Self::FactoryDataReset,
316            7 => Self::SessionFailure,
317            8 => Self::CriticalComponentFailure,
318            9 => Self::ZbiSwap,
319            10 => Self::OutOfMemory,
320            11 => Self::NetstackMigration,
321            12 => Self::AndroidUnexpectedReason,
322            15 => Self::StarnixContainerNoReason,
323            13 => Self::AndroidRescueParty,
324            14 => Self::AndroidCriticalProcessFailure,
325            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
326        }
327    }
328
329    #[inline]
330    pub fn unknown() -> Self {
331        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
332    }
333
334    #[inline]
335    pub const fn into_primitive(self) -> u32 {
336        match self {
337            Self::UserRequest => 1,
338            Self::UserRequestDeviceStuck => 16,
339            Self::DeveloperRequest => 2,
340            Self::SystemUpdate => 3,
341            Self::RetrySystemUpdate => 4,
342            Self::HighTemperature => 5,
343            Self::FactoryDataReset => 6,
344            Self::SessionFailure => 7,
345            Self::CriticalComponentFailure => 8,
346            Self::ZbiSwap => 9,
347            Self::OutOfMemory => 10,
348            Self::NetstackMigration => 11,
349            Self::AndroidUnexpectedReason => 12,
350            Self::StarnixContainerNoReason => 15,
351            Self::AndroidRescueParty => 13,
352            Self::AndroidCriticalProcessFailure => 14,
353            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
354        }
355    }
356
357    #[inline]
358    pub fn is_unknown(&self) -> bool {
359        match self {
360            Self::__SourceBreaking { unknown_ordinal: _ } => true,
361            _ => false,
362        }
363    }
364}
365
366#[derive(Clone, Debug, PartialEq)]
367pub struct AdminPerformRebootRequest {
368    pub options: RebootOptions,
369}
370
371impl fidl::Persistable for AdminPerformRebootRequest {}
372
373#[derive(Clone, Debug, PartialEq)]
374pub struct AdminShutdownRequest {
375    pub options: ShutdownOptions,
376}
377
378impl fidl::Persistable for AdminShutdownRequest {}
379
380#[derive(Clone, Debug, PartialEq)]
381pub struct RebootWatcherOnRebootRequest {
382    pub options: RebootOptions,
383}
384
385impl fidl::Persistable for RebootWatcherOnRebootRequest {}
386
387#[derive(Clone, Debug, PartialEq)]
388pub struct ShutdownWatcherOnShutdownRequest {
389    pub options: ShutdownOptions,
390}
391
392impl fidl::Persistable for ShutdownWatcherOnShutdownRequest {}
393
394/// The options specified when a reboot is requested.
395#[derive(Clone, Debug, Default, PartialEq)]
396pub struct RebootOptions {
397    /// The set of reboot reasons that are responsible for this reboot request.
398    pub reasons: Option<Vec<RebootReason2>>,
399    #[doc(hidden)]
400    pub __source_breaking: fidl::marker::SourceBreaking,
401}
402
403impl fidl::Persistable for RebootOptions {}
404
405/// The options specified when a shutdown is requested.
406#[derive(Clone, Debug, Default, PartialEq)]
407pub struct ShutdownOptions {
408    pub action: Option<ShutdownAction>,
409    /// The set of shutdown reasons that are responsible for this shutdown request.
410    pub reasons: Option<Vec<ShutdownReason>>,
411    #[doc(hidden)]
412    pub __source_breaking: fidl::marker::SourceBreaking,
413}
414
415impl fidl::Persistable for ShutdownOptions {}
416
417pub mod admin_ordinals {
418    pub const POWER_FULLY_ON: u64 = 0xb3272d15e00712f;
419    pub const SHUTDOWN: u64 = 0x3722c53e45dc022f;
420    pub const PERFORM_REBOOT: u64 = 0x9416b4d36a80b4;
421    pub const REBOOT_TO_BOOTLOADER: u64 = 0x6dce331b33786aa;
422    pub const REBOOT_TO_RECOVERY: u64 = 0x1575c566be54f505;
423    pub const POWEROFF: u64 = 0x24101c5d0b439748;
424    pub const MEXEC: u64 = 0x1f91e77ec781a4c6;
425    pub const SUSPEND_TO_RAM: u64 = 0x3b0e356782e7620e;
426}
427
428pub mod reboot_methods_watcher_register_ordinals {
429    pub const REGISTER_WATCHER: u64 = 0x3e6610e78471238;
430}
431
432pub mod reboot_watcher_ordinals {
433    pub const ON_REBOOT: u64 = 0x5334bbbe774f13c3;
434}
435
436pub mod shutdown_watcher_ordinals {
437    pub const ON_SHUTDOWN: u64 = 0x1d9467990d7dc6db;
438}
439
440pub mod shutdown_watcher_register_ordinals {
441    pub const REGISTER_WATCHER: u64 = 0x3db6ce5d34810aff;
442    pub const REGISTER_TERMINAL_STATE_WATCHER: u64 = 0x1cce7216bb7869fc;
443}
444
445pub mod terminal_state_watcher_ordinals {
446    pub const ON_TERMINAL_STATE_TRANSITION_STARTED: u64 = 0x25d95d9d1ae60f10;
447}
448
449mod internal {
450    use super::*;
451    unsafe impl fidl::encoding::TypeMarker for RebootReason2 {
452        type Owned = Self;
453
454        #[inline(always)]
455        fn inline_align(_context: fidl::encoding::Context) -> usize {
456            std::mem::align_of::<u32>()
457        }
458
459        #[inline(always)]
460        fn inline_size(_context: fidl::encoding::Context) -> usize {
461            std::mem::size_of::<u32>()
462        }
463
464        #[inline(always)]
465        fn encode_is_copy() -> bool {
466            false
467        }
468
469        #[inline(always)]
470        fn decode_is_copy() -> bool {
471            false
472        }
473    }
474
475    impl fidl::encoding::ValueTypeMarker for RebootReason2 {
476        type Borrowed<'a> = Self;
477        #[inline(always)]
478        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
479            *value
480        }
481    }
482
483    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for RebootReason2 {
484        #[inline]
485        unsafe fn encode(
486            self,
487            encoder: &mut fidl::encoding::Encoder<'_, D>,
488            offset: usize,
489            _depth: fidl::encoding::Depth,
490        ) -> fidl::Result<()> {
491            encoder.debug_check_bounds::<Self>(offset);
492            encoder.write_num(self.into_primitive(), offset);
493            Ok(())
494        }
495    }
496
497    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RebootReason2 {
498        #[inline(always)]
499        fn new_empty() -> Self {
500            Self::unknown()
501        }
502
503        #[inline]
504        unsafe fn decode(
505            &mut self,
506            decoder: &mut fidl::encoding::Decoder<'_, D>,
507            offset: usize,
508            _depth: fidl::encoding::Depth,
509        ) -> fidl::Result<()> {
510            decoder.debug_check_bounds::<Self>(offset);
511            let prim = decoder.read_num::<u32>(offset);
512
513            *self = Self::from_primitive_allow_unknown(prim);
514            Ok(())
515        }
516    }
517    unsafe impl fidl::encoding::TypeMarker for ShutdownAction {
518        type Owned = Self;
519
520        #[inline(always)]
521        fn inline_align(_context: fidl::encoding::Context) -> usize {
522            std::mem::align_of::<u32>()
523        }
524
525        #[inline(always)]
526        fn inline_size(_context: fidl::encoding::Context) -> usize {
527            std::mem::size_of::<u32>()
528        }
529
530        #[inline(always)]
531        fn encode_is_copy() -> bool {
532            false
533        }
534
535        #[inline(always)]
536        fn decode_is_copy() -> bool {
537            false
538        }
539    }
540
541    impl fidl::encoding::ValueTypeMarker for ShutdownAction {
542        type Borrowed<'a> = Self;
543        #[inline(always)]
544        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
545            *value
546        }
547    }
548
549    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for ShutdownAction {
550        #[inline]
551        unsafe fn encode(
552            self,
553            encoder: &mut fidl::encoding::Encoder<'_, D>,
554            offset: usize,
555            _depth: fidl::encoding::Depth,
556        ) -> fidl::Result<()> {
557            encoder.debug_check_bounds::<Self>(offset);
558            encoder.write_num(self.into_primitive(), offset);
559            Ok(())
560        }
561    }
562
563    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ShutdownAction {
564        #[inline(always)]
565        fn new_empty() -> Self {
566            Self::unknown()
567        }
568
569        #[inline]
570        unsafe fn decode(
571            &mut self,
572            decoder: &mut fidl::encoding::Decoder<'_, D>,
573            offset: usize,
574            _depth: fidl::encoding::Depth,
575        ) -> fidl::Result<()> {
576            decoder.debug_check_bounds::<Self>(offset);
577            let prim = decoder.read_num::<u32>(offset);
578
579            *self = Self::from_primitive_allow_unknown(prim);
580            Ok(())
581        }
582    }
583    unsafe impl fidl::encoding::TypeMarker for ShutdownReason {
584        type Owned = Self;
585
586        #[inline(always)]
587        fn inline_align(_context: fidl::encoding::Context) -> usize {
588            std::mem::align_of::<u32>()
589        }
590
591        #[inline(always)]
592        fn inline_size(_context: fidl::encoding::Context) -> usize {
593            std::mem::size_of::<u32>()
594        }
595
596        #[inline(always)]
597        fn encode_is_copy() -> bool {
598            false
599        }
600
601        #[inline(always)]
602        fn decode_is_copy() -> bool {
603            false
604        }
605    }
606
607    impl fidl::encoding::ValueTypeMarker for ShutdownReason {
608        type Borrowed<'a> = Self;
609        #[inline(always)]
610        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
611            *value
612        }
613    }
614
615    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for ShutdownReason {
616        #[inline]
617        unsafe fn encode(
618            self,
619            encoder: &mut fidl::encoding::Encoder<'_, D>,
620            offset: usize,
621            _depth: fidl::encoding::Depth,
622        ) -> fidl::Result<()> {
623            encoder.debug_check_bounds::<Self>(offset);
624            encoder.write_num(self.into_primitive(), offset);
625            Ok(())
626        }
627    }
628
629    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ShutdownReason {
630        #[inline(always)]
631        fn new_empty() -> Self {
632            Self::unknown()
633        }
634
635        #[inline]
636        unsafe fn decode(
637            &mut self,
638            decoder: &mut fidl::encoding::Decoder<'_, D>,
639            offset: usize,
640            _depth: fidl::encoding::Depth,
641        ) -> fidl::Result<()> {
642            decoder.debug_check_bounds::<Self>(offset);
643            let prim = decoder.read_num::<u32>(offset);
644
645            *self = Self::from_primitive_allow_unknown(prim);
646            Ok(())
647        }
648    }
649
650    impl fidl::encoding::ValueTypeMarker for AdminPerformRebootRequest {
651        type Borrowed<'a> = &'a Self;
652        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
653            value
654        }
655    }
656
657    unsafe impl fidl::encoding::TypeMarker for AdminPerformRebootRequest {
658        type Owned = Self;
659
660        #[inline(always)]
661        fn inline_align(_context: fidl::encoding::Context) -> usize {
662            8
663        }
664
665        #[inline(always)]
666        fn inline_size(_context: fidl::encoding::Context) -> usize {
667            16
668        }
669    }
670
671    unsafe impl<D: fidl::encoding::ResourceDialect>
672        fidl::encoding::Encode<AdminPerformRebootRequest, D> for &AdminPerformRebootRequest
673    {
674        #[inline]
675        unsafe fn encode(
676            self,
677            encoder: &mut fidl::encoding::Encoder<'_, D>,
678            offset: usize,
679            _depth: fidl::encoding::Depth,
680        ) -> fidl::Result<()> {
681            encoder.debug_check_bounds::<AdminPerformRebootRequest>(offset);
682            // Delegate to tuple encoding.
683            fidl::encoding::Encode::<AdminPerformRebootRequest, D>::encode(
684                (<RebootOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
685                encoder,
686                offset,
687                _depth,
688            )
689        }
690    }
691    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<RebootOptions, D>>
692        fidl::encoding::Encode<AdminPerformRebootRequest, D> for (T0,)
693    {
694        #[inline]
695        unsafe fn encode(
696            self,
697            encoder: &mut fidl::encoding::Encoder<'_, D>,
698            offset: usize,
699            depth: fidl::encoding::Depth,
700        ) -> fidl::Result<()> {
701            encoder.debug_check_bounds::<AdminPerformRebootRequest>(offset);
702            // Zero out padding regions. There's no need to apply masks
703            // because the unmasked parts will be overwritten by fields.
704            // Write the fields.
705            self.0.encode(encoder, offset + 0, depth)?;
706            Ok(())
707        }
708    }
709
710    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
711        for AdminPerformRebootRequest
712    {
713        #[inline(always)]
714        fn new_empty() -> Self {
715            Self { options: fidl::new_empty!(RebootOptions, D) }
716        }
717
718        #[inline]
719        unsafe fn decode(
720            &mut self,
721            decoder: &mut fidl::encoding::Decoder<'_, D>,
722            offset: usize,
723            _depth: fidl::encoding::Depth,
724        ) -> fidl::Result<()> {
725            decoder.debug_check_bounds::<Self>(offset);
726            // Verify that padding bytes are zero.
727            fidl::decode!(RebootOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
728            Ok(())
729        }
730    }
731
732    impl fidl::encoding::ValueTypeMarker for AdminShutdownRequest {
733        type Borrowed<'a> = &'a Self;
734        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
735            value
736        }
737    }
738
739    unsafe impl fidl::encoding::TypeMarker for AdminShutdownRequest {
740        type Owned = Self;
741
742        #[inline(always)]
743        fn inline_align(_context: fidl::encoding::Context) -> usize {
744            8
745        }
746
747        #[inline(always)]
748        fn inline_size(_context: fidl::encoding::Context) -> usize {
749            16
750        }
751    }
752
753    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<AdminShutdownRequest, D>
754        for &AdminShutdownRequest
755    {
756        #[inline]
757        unsafe fn encode(
758            self,
759            encoder: &mut fidl::encoding::Encoder<'_, D>,
760            offset: usize,
761            _depth: fidl::encoding::Depth,
762        ) -> fidl::Result<()> {
763            encoder.debug_check_bounds::<AdminShutdownRequest>(offset);
764            // Delegate to tuple encoding.
765            fidl::encoding::Encode::<AdminShutdownRequest, D>::encode(
766                (<ShutdownOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
767                encoder,
768                offset,
769                _depth,
770            )
771        }
772    }
773    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<ShutdownOptions, D>>
774        fidl::encoding::Encode<AdminShutdownRequest, D> for (T0,)
775    {
776        #[inline]
777        unsafe fn encode(
778            self,
779            encoder: &mut fidl::encoding::Encoder<'_, D>,
780            offset: usize,
781            depth: fidl::encoding::Depth,
782        ) -> fidl::Result<()> {
783            encoder.debug_check_bounds::<AdminShutdownRequest>(offset);
784            // Zero out padding regions. There's no need to apply masks
785            // because the unmasked parts will be overwritten by fields.
786            // Write the fields.
787            self.0.encode(encoder, offset + 0, depth)?;
788            Ok(())
789        }
790    }
791
792    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for AdminShutdownRequest {
793        #[inline(always)]
794        fn new_empty() -> Self {
795            Self { options: fidl::new_empty!(ShutdownOptions, D) }
796        }
797
798        #[inline]
799        unsafe fn decode(
800            &mut self,
801            decoder: &mut fidl::encoding::Decoder<'_, D>,
802            offset: usize,
803            _depth: fidl::encoding::Depth,
804        ) -> fidl::Result<()> {
805            decoder.debug_check_bounds::<Self>(offset);
806            // Verify that padding bytes are zero.
807            fidl::decode!(ShutdownOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
808            Ok(())
809        }
810    }
811
812    impl fidl::encoding::ValueTypeMarker for RebootWatcherOnRebootRequest {
813        type Borrowed<'a> = &'a Self;
814        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
815            value
816        }
817    }
818
819    unsafe impl fidl::encoding::TypeMarker for RebootWatcherOnRebootRequest {
820        type Owned = Self;
821
822        #[inline(always)]
823        fn inline_align(_context: fidl::encoding::Context) -> usize {
824            8
825        }
826
827        #[inline(always)]
828        fn inline_size(_context: fidl::encoding::Context) -> usize {
829            16
830        }
831    }
832
833    unsafe impl<D: fidl::encoding::ResourceDialect>
834        fidl::encoding::Encode<RebootWatcherOnRebootRequest, D> for &RebootWatcherOnRebootRequest
835    {
836        #[inline]
837        unsafe fn encode(
838            self,
839            encoder: &mut fidl::encoding::Encoder<'_, D>,
840            offset: usize,
841            _depth: fidl::encoding::Depth,
842        ) -> fidl::Result<()> {
843            encoder.debug_check_bounds::<RebootWatcherOnRebootRequest>(offset);
844            // Delegate to tuple encoding.
845            fidl::encoding::Encode::<RebootWatcherOnRebootRequest, D>::encode(
846                (<RebootOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
847                encoder,
848                offset,
849                _depth,
850            )
851        }
852    }
853    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<RebootOptions, D>>
854        fidl::encoding::Encode<RebootWatcherOnRebootRequest, D> for (T0,)
855    {
856        #[inline]
857        unsafe fn encode(
858            self,
859            encoder: &mut fidl::encoding::Encoder<'_, D>,
860            offset: usize,
861            depth: fidl::encoding::Depth,
862        ) -> fidl::Result<()> {
863            encoder.debug_check_bounds::<RebootWatcherOnRebootRequest>(offset);
864            // Zero out padding regions. There's no need to apply masks
865            // because the unmasked parts will be overwritten by fields.
866            // Write the fields.
867            self.0.encode(encoder, offset + 0, depth)?;
868            Ok(())
869        }
870    }
871
872    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
873        for RebootWatcherOnRebootRequest
874    {
875        #[inline(always)]
876        fn new_empty() -> Self {
877            Self { options: fidl::new_empty!(RebootOptions, D) }
878        }
879
880        #[inline]
881        unsafe fn decode(
882            &mut self,
883            decoder: &mut fidl::encoding::Decoder<'_, D>,
884            offset: usize,
885            _depth: fidl::encoding::Depth,
886        ) -> fidl::Result<()> {
887            decoder.debug_check_bounds::<Self>(offset);
888            // Verify that padding bytes are zero.
889            fidl::decode!(RebootOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
890            Ok(())
891        }
892    }
893
894    impl fidl::encoding::ValueTypeMarker for ShutdownWatcherOnShutdownRequest {
895        type Borrowed<'a> = &'a Self;
896        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
897            value
898        }
899    }
900
901    unsafe impl fidl::encoding::TypeMarker for ShutdownWatcherOnShutdownRequest {
902        type Owned = Self;
903
904        #[inline(always)]
905        fn inline_align(_context: fidl::encoding::Context) -> usize {
906            8
907        }
908
909        #[inline(always)]
910        fn inline_size(_context: fidl::encoding::Context) -> usize {
911            16
912        }
913    }
914
915    unsafe impl<D: fidl::encoding::ResourceDialect>
916        fidl::encoding::Encode<ShutdownWatcherOnShutdownRequest, D>
917        for &ShutdownWatcherOnShutdownRequest
918    {
919        #[inline]
920        unsafe fn encode(
921            self,
922            encoder: &mut fidl::encoding::Encoder<'_, D>,
923            offset: usize,
924            _depth: fidl::encoding::Depth,
925        ) -> fidl::Result<()> {
926            encoder.debug_check_bounds::<ShutdownWatcherOnShutdownRequest>(offset);
927            // Delegate to tuple encoding.
928            fidl::encoding::Encode::<ShutdownWatcherOnShutdownRequest, D>::encode(
929                (<ShutdownOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
930                encoder,
931                offset,
932                _depth,
933            )
934        }
935    }
936    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<ShutdownOptions, D>>
937        fidl::encoding::Encode<ShutdownWatcherOnShutdownRequest, D> for (T0,)
938    {
939        #[inline]
940        unsafe fn encode(
941            self,
942            encoder: &mut fidl::encoding::Encoder<'_, D>,
943            offset: usize,
944            depth: fidl::encoding::Depth,
945        ) -> fidl::Result<()> {
946            encoder.debug_check_bounds::<ShutdownWatcherOnShutdownRequest>(offset);
947            // Zero out padding regions. There's no need to apply masks
948            // because the unmasked parts will be overwritten by fields.
949            // Write the fields.
950            self.0.encode(encoder, offset + 0, depth)?;
951            Ok(())
952        }
953    }
954
955    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
956        for ShutdownWatcherOnShutdownRequest
957    {
958        #[inline(always)]
959        fn new_empty() -> Self {
960            Self { options: fidl::new_empty!(ShutdownOptions, D) }
961        }
962
963        #[inline]
964        unsafe fn decode(
965            &mut self,
966            decoder: &mut fidl::encoding::Decoder<'_, D>,
967            offset: usize,
968            _depth: fidl::encoding::Depth,
969        ) -> fidl::Result<()> {
970            decoder.debug_check_bounds::<Self>(offset);
971            // Verify that padding bytes are zero.
972            fidl::decode!(ShutdownOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
973            Ok(())
974        }
975    }
976
977    impl RebootOptions {
978        #[inline(always)]
979        fn max_ordinal_present(&self) -> u64 {
980            if let Some(_) = self.reasons {
981                return 1;
982            }
983            0
984        }
985    }
986
987    impl fidl::encoding::ValueTypeMarker for RebootOptions {
988        type Borrowed<'a> = &'a Self;
989        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
990            value
991        }
992    }
993
994    unsafe impl fidl::encoding::TypeMarker for RebootOptions {
995        type Owned = Self;
996
997        #[inline(always)]
998        fn inline_align(_context: fidl::encoding::Context) -> usize {
999            8
1000        }
1001
1002        #[inline(always)]
1003        fn inline_size(_context: fidl::encoding::Context) -> usize {
1004            16
1005        }
1006    }
1007
1008    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<RebootOptions, D>
1009        for &RebootOptions
1010    {
1011        unsafe fn encode(
1012            self,
1013            encoder: &mut fidl::encoding::Encoder<'_, D>,
1014            offset: usize,
1015            mut depth: fidl::encoding::Depth,
1016        ) -> fidl::Result<()> {
1017            encoder.debug_check_bounds::<RebootOptions>(offset);
1018            // Vector header
1019            let max_ordinal: u64 = self.max_ordinal_present();
1020            encoder.write_num(max_ordinal, offset);
1021            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1022            // Calling encoder.out_of_line_offset(0) is not allowed.
1023            if max_ordinal == 0 {
1024                return Ok(());
1025            }
1026            depth.increment()?;
1027            let envelope_size = 8;
1028            let bytes_len = max_ordinal as usize * envelope_size;
1029            #[allow(unused_variables)]
1030            let offset = encoder.out_of_line_offset(bytes_len);
1031            let mut _prev_end_offset: usize = 0;
1032            if 1 > max_ordinal {
1033                return Ok(());
1034            }
1035
1036            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1037            // are envelope_size bytes.
1038            let cur_offset: usize = (1 - 1) * envelope_size;
1039
1040            // Zero reserved fields.
1041            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1042
1043            // Safety:
1044            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1045            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1046            //   envelope_size bytes, there is always sufficient room.
1047            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<RebootReason2, 100>, D>(
1048            self.reasons.as_ref().map(<fidl::encoding::Vector<RebootReason2, 100> as fidl::encoding::ValueTypeMarker>::borrow),
1049            encoder, offset + cur_offset, depth
1050        )?;
1051
1052            _prev_end_offset = cur_offset + envelope_size;
1053
1054            Ok(())
1055        }
1056    }
1057
1058    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RebootOptions {
1059        #[inline(always)]
1060        fn new_empty() -> Self {
1061            Self::default()
1062        }
1063
1064        unsafe fn decode(
1065            &mut self,
1066            decoder: &mut fidl::encoding::Decoder<'_, D>,
1067            offset: usize,
1068            mut depth: fidl::encoding::Depth,
1069        ) -> fidl::Result<()> {
1070            decoder.debug_check_bounds::<Self>(offset);
1071            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1072                None => return Err(fidl::Error::NotNullable),
1073                Some(len) => len,
1074            };
1075            // Calling decoder.out_of_line_offset(0) is not allowed.
1076            if len == 0 {
1077                return Ok(());
1078            };
1079            depth.increment()?;
1080            let envelope_size = 8;
1081            let bytes_len = len * envelope_size;
1082            let offset = decoder.out_of_line_offset(bytes_len)?;
1083            // Decode the envelope for each type.
1084            let mut _next_ordinal_to_read = 0;
1085            let mut next_offset = offset;
1086            let end_offset = offset + bytes_len;
1087            _next_ordinal_to_read += 1;
1088            if next_offset >= end_offset {
1089                return Ok(());
1090            }
1091
1092            // Decode unknown envelopes for gaps in ordinals.
1093            while _next_ordinal_to_read < 1 {
1094                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1095                _next_ordinal_to_read += 1;
1096                next_offset += envelope_size;
1097            }
1098
1099            let next_out_of_line = decoder.next_out_of_line();
1100            let handles_before = decoder.remaining_handles();
1101            if let Some((inlined, num_bytes, num_handles)) =
1102                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1103            {
1104                let member_inline_size = <fidl::encoding::Vector<RebootReason2, 100> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1105                if inlined != (member_inline_size <= 4) {
1106                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1107                }
1108                let inner_offset;
1109                let mut inner_depth = depth.clone();
1110                if inlined {
1111                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1112                    inner_offset = next_offset;
1113                } else {
1114                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1115                    inner_depth.increment()?;
1116                }
1117                let val_ref = self.reasons.get_or_insert_with(
1118                    || fidl::new_empty!(fidl::encoding::Vector<RebootReason2, 100>, D),
1119                );
1120                fidl::decode!(fidl::encoding::Vector<RebootReason2, 100>, D, val_ref, decoder, inner_offset, inner_depth)?;
1121                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1122                {
1123                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1124                }
1125                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1126                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1127                }
1128            }
1129
1130            next_offset += envelope_size;
1131
1132            // Decode the remaining unknown envelopes.
1133            while next_offset < end_offset {
1134                _next_ordinal_to_read += 1;
1135                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1136                next_offset += envelope_size;
1137            }
1138
1139            Ok(())
1140        }
1141    }
1142
1143    impl ShutdownOptions {
1144        #[inline(always)]
1145        fn max_ordinal_present(&self) -> u64 {
1146            if let Some(_) = self.reasons {
1147                return 2;
1148            }
1149            if let Some(_) = self.action {
1150                return 1;
1151            }
1152            0
1153        }
1154    }
1155
1156    impl fidl::encoding::ValueTypeMarker for ShutdownOptions {
1157        type Borrowed<'a> = &'a Self;
1158        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1159            value
1160        }
1161    }
1162
1163    unsafe impl fidl::encoding::TypeMarker for ShutdownOptions {
1164        type Owned = Self;
1165
1166        #[inline(always)]
1167        fn inline_align(_context: fidl::encoding::Context) -> usize {
1168            8
1169        }
1170
1171        #[inline(always)]
1172        fn inline_size(_context: fidl::encoding::Context) -> usize {
1173            16
1174        }
1175    }
1176
1177    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ShutdownOptions, D>
1178        for &ShutdownOptions
1179    {
1180        unsafe fn encode(
1181            self,
1182            encoder: &mut fidl::encoding::Encoder<'_, D>,
1183            offset: usize,
1184            mut depth: fidl::encoding::Depth,
1185        ) -> fidl::Result<()> {
1186            encoder.debug_check_bounds::<ShutdownOptions>(offset);
1187            // Vector header
1188            let max_ordinal: u64 = self.max_ordinal_present();
1189            encoder.write_num(max_ordinal, offset);
1190            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1191            // Calling encoder.out_of_line_offset(0) is not allowed.
1192            if max_ordinal == 0 {
1193                return Ok(());
1194            }
1195            depth.increment()?;
1196            let envelope_size = 8;
1197            let bytes_len = max_ordinal as usize * envelope_size;
1198            #[allow(unused_variables)]
1199            let offset = encoder.out_of_line_offset(bytes_len);
1200            let mut _prev_end_offset: usize = 0;
1201            if 1 > max_ordinal {
1202                return Ok(());
1203            }
1204
1205            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1206            // are envelope_size bytes.
1207            let cur_offset: usize = (1 - 1) * envelope_size;
1208
1209            // Zero reserved fields.
1210            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1211
1212            // Safety:
1213            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1214            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1215            //   envelope_size bytes, there is always sufficient room.
1216            fidl::encoding::encode_in_envelope_optional::<ShutdownAction, D>(
1217                self.action
1218                    .as_ref()
1219                    .map(<ShutdownAction as fidl::encoding::ValueTypeMarker>::borrow),
1220                encoder,
1221                offset + cur_offset,
1222                depth,
1223            )?;
1224
1225            _prev_end_offset = cur_offset + envelope_size;
1226            if 2 > max_ordinal {
1227                return Ok(());
1228            }
1229
1230            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1231            // are envelope_size bytes.
1232            let cur_offset: usize = (2 - 1) * envelope_size;
1233
1234            // Zero reserved fields.
1235            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1236
1237            // Safety:
1238            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1239            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1240            //   envelope_size bytes, there is always sufficient room.
1241            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<ShutdownReason, 100>, D>(
1242            self.reasons.as_ref().map(<fidl::encoding::Vector<ShutdownReason, 100> as fidl::encoding::ValueTypeMarker>::borrow),
1243            encoder, offset + cur_offset, depth
1244        )?;
1245
1246            _prev_end_offset = cur_offset + envelope_size;
1247
1248            Ok(())
1249        }
1250    }
1251
1252    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ShutdownOptions {
1253        #[inline(always)]
1254        fn new_empty() -> Self {
1255            Self::default()
1256        }
1257
1258        unsafe fn decode(
1259            &mut self,
1260            decoder: &mut fidl::encoding::Decoder<'_, D>,
1261            offset: usize,
1262            mut depth: fidl::encoding::Depth,
1263        ) -> fidl::Result<()> {
1264            decoder.debug_check_bounds::<Self>(offset);
1265            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1266                None => return Err(fidl::Error::NotNullable),
1267                Some(len) => len,
1268            };
1269            // Calling decoder.out_of_line_offset(0) is not allowed.
1270            if len == 0 {
1271                return Ok(());
1272            };
1273            depth.increment()?;
1274            let envelope_size = 8;
1275            let bytes_len = len * envelope_size;
1276            let offset = decoder.out_of_line_offset(bytes_len)?;
1277            // Decode the envelope for each type.
1278            let mut _next_ordinal_to_read = 0;
1279            let mut next_offset = offset;
1280            let end_offset = offset + bytes_len;
1281            _next_ordinal_to_read += 1;
1282            if next_offset >= end_offset {
1283                return Ok(());
1284            }
1285
1286            // Decode unknown envelopes for gaps in ordinals.
1287            while _next_ordinal_to_read < 1 {
1288                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1289                _next_ordinal_to_read += 1;
1290                next_offset += envelope_size;
1291            }
1292
1293            let next_out_of_line = decoder.next_out_of_line();
1294            let handles_before = decoder.remaining_handles();
1295            if let Some((inlined, num_bytes, num_handles)) =
1296                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1297            {
1298                let member_inline_size =
1299                    <ShutdownAction as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1300                if inlined != (member_inline_size <= 4) {
1301                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1302                }
1303                let inner_offset;
1304                let mut inner_depth = depth.clone();
1305                if inlined {
1306                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1307                    inner_offset = next_offset;
1308                } else {
1309                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1310                    inner_depth.increment()?;
1311                }
1312                let val_ref =
1313                    self.action.get_or_insert_with(|| fidl::new_empty!(ShutdownAction, D));
1314                fidl::decode!(ShutdownAction, D, val_ref, decoder, inner_offset, inner_depth)?;
1315                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1316                {
1317                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1318                }
1319                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1320                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1321                }
1322            }
1323
1324            next_offset += envelope_size;
1325            _next_ordinal_to_read += 1;
1326            if next_offset >= end_offset {
1327                return Ok(());
1328            }
1329
1330            // Decode unknown envelopes for gaps in ordinals.
1331            while _next_ordinal_to_read < 2 {
1332                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1333                _next_ordinal_to_read += 1;
1334                next_offset += envelope_size;
1335            }
1336
1337            let next_out_of_line = decoder.next_out_of_line();
1338            let handles_before = decoder.remaining_handles();
1339            if let Some((inlined, num_bytes, num_handles)) =
1340                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1341            {
1342                let member_inline_size = <fidl::encoding::Vector<ShutdownReason, 100> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1343                if inlined != (member_inline_size <= 4) {
1344                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1345                }
1346                let inner_offset;
1347                let mut inner_depth = depth.clone();
1348                if inlined {
1349                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1350                    inner_offset = next_offset;
1351                } else {
1352                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1353                    inner_depth.increment()?;
1354                }
1355                let val_ref = self.reasons.get_or_insert_with(
1356                    || fidl::new_empty!(fidl::encoding::Vector<ShutdownReason, 100>, D),
1357                );
1358                fidl::decode!(fidl::encoding::Vector<ShutdownReason, 100>, D, val_ref, decoder, inner_offset, inner_depth)?;
1359                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1360                {
1361                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1362                }
1363                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1364                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1365                }
1366            }
1367
1368            next_offset += envelope_size;
1369
1370            // Decode the remaining unknown envelopes.
1371            while next_offset < end_offset {
1372                _next_ordinal_to_read += 1;
1373                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1374                next_offset += envelope_size;
1375            }
1376
1377            Ok(())
1378        }
1379    }
1380}