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