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/// Why the system reboots.
20///
21/// Replaced by `RebootReason2`.
22#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
23#[repr(u32)]
24pub enum RebootReason {
25    UserRequest = 1,
26    /// A new system update has been downloaded.
27    SystemUpdate = 2,
28    /// Applying the system update has failed.
29    RetrySystemUpdate = 8,
30    HighTemperature = 3,
31    FactoryDataReset = 6,
32    /// Sessionmgr has failed.
33    SessionFailure = 4,
34    /// sysmgr crashed.
35    SysmgrFailure = 5,
36    /// A critical system component has failed.
37    CriticalComponentFailure = 7,
38    /// A boot partition change was effected.
39    ZbiSwap = 9,
40    /// The system hit a critical low threshold of available memory.
41    OutOfMemory = 10,
42}
43
44impl RebootReason {
45    #[inline]
46    pub fn from_primitive(prim: u32) -> Option<Self> {
47        match prim {
48            1 => Some(Self::UserRequest),
49            2 => Some(Self::SystemUpdate),
50            8 => Some(Self::RetrySystemUpdate),
51            3 => Some(Self::HighTemperature),
52            6 => Some(Self::FactoryDataReset),
53            4 => Some(Self::SessionFailure),
54            5 => Some(Self::SysmgrFailure),
55            7 => Some(Self::CriticalComponentFailure),
56            9 => Some(Self::ZbiSwap),
57            10 => Some(Self::OutOfMemory),
58            _ => None,
59        }
60    }
61
62    #[inline]
63    pub const fn into_primitive(self) -> u32 {
64        self as u32
65    }
66}
67
68/// Why the system reboots.
69#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
70pub enum RebootReason2 {
71    UserRequest,
72    /// A new system update has been downloaded.
73    SystemUpdate,
74    /// Applying the system update has failed.
75    RetrySystemUpdate,
76    HighTemperature,
77    FactoryDataReset,
78    /// Sessionmgr has failed.
79    SessionFailure,
80    /// sysmgr crashed.
81    SysmgrFailure,
82    /// A critical system component has failed.
83    CriticalComponentFailure,
84    /// A boot partition change was effected.
85    ZbiSwap,
86    /// The system hit a critical low threshold of available memory.
87    OutOfMemory,
88    /// The Netstack component is changing versions.
89    NetstackMigration,
90    /// An Android-initiated reboot reason that Starnix doesn't recognize
91    AndroidUnexpectedReason,
92    #[doc(hidden)]
93    __SourceBreaking {
94        unknown_ordinal: u32,
95    },
96}
97
98/// Pattern that matches an unknown `RebootReason2` member.
99#[macro_export]
100macro_rules! RebootReason2Unknown {
101    () => {
102        _
103    };
104}
105
106impl RebootReason2 {
107    #[inline]
108    pub fn from_primitive(prim: u32) -> Option<Self> {
109        match prim {
110            1 => Some(Self::UserRequest),
111            2 => Some(Self::SystemUpdate),
112            8 => Some(Self::RetrySystemUpdate),
113            3 => Some(Self::HighTemperature),
114            6 => Some(Self::FactoryDataReset),
115            4 => Some(Self::SessionFailure),
116            5 => Some(Self::SysmgrFailure),
117            7 => Some(Self::CriticalComponentFailure),
118            9 => Some(Self::ZbiSwap),
119            10 => Some(Self::OutOfMemory),
120            11 => Some(Self::NetstackMigration),
121            12 => Some(Self::AndroidUnexpectedReason),
122            _ => None,
123        }
124    }
125
126    #[inline]
127    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
128        match prim {
129            1 => Self::UserRequest,
130            2 => Self::SystemUpdate,
131            8 => Self::RetrySystemUpdate,
132            3 => Self::HighTemperature,
133            6 => Self::FactoryDataReset,
134            4 => Self::SessionFailure,
135            5 => Self::SysmgrFailure,
136            7 => Self::CriticalComponentFailure,
137            9 => Self::ZbiSwap,
138            10 => Self::OutOfMemory,
139            11 => Self::NetstackMigration,
140            12 => Self::AndroidUnexpectedReason,
141            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
142        }
143    }
144
145    #[inline]
146    pub fn unknown() -> Self {
147        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
148    }
149
150    #[inline]
151    pub const fn into_primitive(self) -> u32 {
152        match self {
153            Self::UserRequest => 1,
154            Self::SystemUpdate => 2,
155            Self::RetrySystemUpdate => 8,
156            Self::HighTemperature => 3,
157            Self::FactoryDataReset => 6,
158            Self::SessionFailure => 4,
159            Self::SysmgrFailure => 5,
160            Self::CriticalComponentFailure => 7,
161            Self::ZbiSwap => 9,
162            Self::OutOfMemory => 10,
163            Self::NetstackMigration => 11,
164            Self::AndroidUnexpectedReason => 12,
165            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
166        }
167    }
168
169    #[inline]
170    pub fn is_unknown(&self) -> bool {
171        match self {
172            Self::__SourceBreaking { unknown_ordinal: _ } => true,
173            _ => false,
174        }
175    }
176}
177
178#[derive(Clone, Debug, PartialEq)]
179pub struct AdminPerformRebootRequest {
180    pub options: RebootOptions,
181}
182
183impl fidl::Persistable for AdminPerformRebootRequest {}
184
185#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
186pub struct AdminRebootRequest {
187    pub reason: RebootReason,
188}
189
190impl fidl::Persistable for AdminRebootRequest {}
191
192#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
193pub struct RebootMethodsWatcherOnRebootRequest {
194    pub reason: RebootReason,
195}
196
197impl fidl::Persistable for RebootMethodsWatcherOnRebootRequest {}
198
199#[derive(Clone, Debug, PartialEq)]
200pub struct RebootWatcherOnRebootRequest {
201    pub options: RebootOptions,
202}
203
204impl fidl::Persistable for RebootWatcherOnRebootRequest {}
205
206/// The options specified when a reboot is requested.
207#[derive(Clone, Debug, Default, PartialEq)]
208pub struct RebootOptions {
209    /// The set of reboot reasons that are responsible for this reboot request.
210    pub reasons: Option<Vec<RebootReason2>>,
211    #[doc(hidden)]
212    pub __source_breaking: fidl::marker::SourceBreaking,
213}
214
215impl fidl::Persistable for RebootOptions {}
216
217pub mod admin_ordinals {
218    pub const POWER_FULLY_ON: u64 = 0xb3272d15e00712f;
219    pub const REBOOT: u64 = 0x21f258bd20297368;
220    pub const PERFORM_REBOOT: u64 = 0x9416b4d36a80b4;
221    pub const REBOOT_TO_BOOTLOADER: u64 = 0x6dce331b33786aa;
222    pub const REBOOT_TO_RECOVERY: u64 = 0x1575c566be54f505;
223    pub const POWEROFF: u64 = 0x24101c5d0b439748;
224    pub const MEXEC: u64 = 0x1f91e77ec781a4c6;
225    pub const SUSPEND_TO_RAM: u64 = 0x3b0e356782e7620e;
226}
227
228pub mod reboot_methods_watcher_ordinals {
229    pub const ON_REBOOT: u64 = 0x225a5f32436a1b13;
230}
231
232pub mod reboot_methods_watcher_register_ordinals {
233    pub const REGISTER: u64 = 0x1fd793df8385f937;
234    pub const REGISTER_WITH_ACK: u64 = 0x243cbccabdac17ec;
235    pub const REGISTER_WATCHER: u64 = 0x3e6610e78471238;
236}
237
238pub mod reboot_watcher_ordinals {
239    pub const ON_REBOOT: u64 = 0x5334bbbe774f13c3;
240}
241
242mod internal {
243    use super::*;
244    unsafe impl fidl::encoding::TypeMarker for RebootReason {
245        type Owned = Self;
246
247        #[inline(always)]
248        fn inline_align(_context: fidl::encoding::Context) -> usize {
249            std::mem::align_of::<u32>()
250        }
251
252        #[inline(always)]
253        fn inline_size(_context: fidl::encoding::Context) -> usize {
254            std::mem::size_of::<u32>()
255        }
256
257        #[inline(always)]
258        fn encode_is_copy() -> bool {
259            true
260        }
261
262        #[inline(always)]
263        fn decode_is_copy() -> bool {
264            false
265        }
266    }
267
268    impl fidl::encoding::ValueTypeMarker for RebootReason {
269        type Borrowed<'a> = Self;
270        #[inline(always)]
271        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
272            *value
273        }
274    }
275
276    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for RebootReason {
277        #[inline]
278        unsafe fn encode(
279            self,
280            encoder: &mut fidl::encoding::Encoder<'_, D>,
281            offset: usize,
282            _depth: fidl::encoding::Depth,
283        ) -> fidl::Result<()> {
284            encoder.debug_check_bounds::<Self>(offset);
285            encoder.write_num(self.into_primitive(), offset);
286            Ok(())
287        }
288    }
289
290    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RebootReason {
291        #[inline(always)]
292        fn new_empty() -> Self {
293            Self::UserRequest
294        }
295
296        #[inline]
297        unsafe fn decode(
298            &mut self,
299            decoder: &mut fidl::encoding::Decoder<'_, D>,
300            offset: usize,
301            _depth: fidl::encoding::Depth,
302        ) -> fidl::Result<()> {
303            decoder.debug_check_bounds::<Self>(offset);
304            let prim = decoder.read_num::<u32>(offset);
305
306            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
307            Ok(())
308        }
309    }
310    unsafe impl fidl::encoding::TypeMarker for RebootReason2 {
311        type Owned = Self;
312
313        #[inline(always)]
314        fn inline_align(_context: fidl::encoding::Context) -> usize {
315            std::mem::align_of::<u32>()
316        }
317
318        #[inline(always)]
319        fn inline_size(_context: fidl::encoding::Context) -> usize {
320            std::mem::size_of::<u32>()
321        }
322
323        #[inline(always)]
324        fn encode_is_copy() -> bool {
325            false
326        }
327
328        #[inline(always)]
329        fn decode_is_copy() -> bool {
330            false
331        }
332    }
333
334    impl fidl::encoding::ValueTypeMarker for RebootReason2 {
335        type Borrowed<'a> = Self;
336        #[inline(always)]
337        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
338            *value
339        }
340    }
341
342    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for RebootReason2 {
343        #[inline]
344        unsafe fn encode(
345            self,
346            encoder: &mut fidl::encoding::Encoder<'_, D>,
347            offset: usize,
348            _depth: fidl::encoding::Depth,
349        ) -> fidl::Result<()> {
350            encoder.debug_check_bounds::<Self>(offset);
351            encoder.write_num(self.into_primitive(), offset);
352            Ok(())
353        }
354    }
355
356    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RebootReason2 {
357        #[inline(always)]
358        fn new_empty() -> Self {
359            Self::unknown()
360        }
361
362        #[inline]
363        unsafe fn decode(
364            &mut self,
365            decoder: &mut fidl::encoding::Decoder<'_, D>,
366            offset: usize,
367            _depth: fidl::encoding::Depth,
368        ) -> fidl::Result<()> {
369            decoder.debug_check_bounds::<Self>(offset);
370            let prim = decoder.read_num::<u32>(offset);
371
372            *self = Self::from_primitive_allow_unknown(prim);
373            Ok(())
374        }
375    }
376
377    impl fidl::encoding::ValueTypeMarker for AdminPerformRebootRequest {
378        type Borrowed<'a> = &'a Self;
379        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
380            value
381        }
382    }
383
384    unsafe impl fidl::encoding::TypeMarker for AdminPerformRebootRequest {
385        type Owned = Self;
386
387        #[inline(always)]
388        fn inline_align(_context: fidl::encoding::Context) -> usize {
389            8
390        }
391
392        #[inline(always)]
393        fn inline_size(_context: fidl::encoding::Context) -> usize {
394            16
395        }
396    }
397
398    unsafe impl<D: fidl::encoding::ResourceDialect>
399        fidl::encoding::Encode<AdminPerformRebootRequest, D> for &AdminPerformRebootRequest
400    {
401        #[inline]
402        unsafe fn encode(
403            self,
404            encoder: &mut fidl::encoding::Encoder<'_, D>,
405            offset: usize,
406            _depth: fidl::encoding::Depth,
407        ) -> fidl::Result<()> {
408            encoder.debug_check_bounds::<AdminPerformRebootRequest>(offset);
409            // Delegate to tuple encoding.
410            fidl::encoding::Encode::<AdminPerformRebootRequest, D>::encode(
411                (<RebootOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
412                encoder,
413                offset,
414                _depth,
415            )
416        }
417    }
418    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<RebootOptions, D>>
419        fidl::encoding::Encode<AdminPerformRebootRequest, D> for (T0,)
420    {
421        #[inline]
422        unsafe fn encode(
423            self,
424            encoder: &mut fidl::encoding::Encoder<'_, D>,
425            offset: usize,
426            depth: fidl::encoding::Depth,
427        ) -> fidl::Result<()> {
428            encoder.debug_check_bounds::<AdminPerformRebootRequest>(offset);
429            // Zero out padding regions. There's no need to apply masks
430            // because the unmasked parts will be overwritten by fields.
431            // Write the fields.
432            self.0.encode(encoder, offset + 0, depth)?;
433            Ok(())
434        }
435    }
436
437    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
438        for AdminPerformRebootRequest
439    {
440        #[inline(always)]
441        fn new_empty() -> Self {
442            Self { options: fidl::new_empty!(RebootOptions, D) }
443        }
444
445        #[inline]
446        unsafe fn decode(
447            &mut self,
448            decoder: &mut fidl::encoding::Decoder<'_, D>,
449            offset: usize,
450            _depth: fidl::encoding::Depth,
451        ) -> fidl::Result<()> {
452            decoder.debug_check_bounds::<Self>(offset);
453            // Verify that padding bytes are zero.
454            fidl::decode!(RebootOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
455            Ok(())
456        }
457    }
458
459    impl fidl::encoding::ValueTypeMarker for AdminRebootRequest {
460        type Borrowed<'a> = &'a Self;
461        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
462            value
463        }
464    }
465
466    unsafe impl fidl::encoding::TypeMarker for AdminRebootRequest {
467        type Owned = Self;
468
469        #[inline(always)]
470        fn inline_align(_context: fidl::encoding::Context) -> usize {
471            4
472        }
473
474        #[inline(always)]
475        fn inline_size(_context: fidl::encoding::Context) -> usize {
476            4
477        }
478    }
479
480    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<AdminRebootRequest, D>
481        for &AdminRebootRequest
482    {
483        #[inline]
484        unsafe fn encode(
485            self,
486            encoder: &mut fidl::encoding::Encoder<'_, D>,
487            offset: usize,
488            _depth: fidl::encoding::Depth,
489        ) -> fidl::Result<()> {
490            encoder.debug_check_bounds::<AdminRebootRequest>(offset);
491            // Delegate to tuple encoding.
492            fidl::encoding::Encode::<AdminRebootRequest, D>::encode(
493                (<RebootReason as fidl::encoding::ValueTypeMarker>::borrow(&self.reason),),
494                encoder,
495                offset,
496                _depth,
497            )
498        }
499    }
500    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<RebootReason, D>>
501        fidl::encoding::Encode<AdminRebootRequest, D> for (T0,)
502    {
503        #[inline]
504        unsafe fn encode(
505            self,
506            encoder: &mut fidl::encoding::Encoder<'_, D>,
507            offset: usize,
508            depth: fidl::encoding::Depth,
509        ) -> fidl::Result<()> {
510            encoder.debug_check_bounds::<AdminRebootRequest>(offset);
511            // Zero out padding regions. There's no need to apply masks
512            // because the unmasked parts will be overwritten by fields.
513            // Write the fields.
514            self.0.encode(encoder, offset + 0, depth)?;
515            Ok(())
516        }
517    }
518
519    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for AdminRebootRequest {
520        #[inline(always)]
521        fn new_empty() -> Self {
522            Self { reason: fidl::new_empty!(RebootReason, D) }
523        }
524
525        #[inline]
526        unsafe fn decode(
527            &mut self,
528            decoder: &mut fidl::encoding::Decoder<'_, D>,
529            offset: usize,
530            _depth: fidl::encoding::Depth,
531        ) -> fidl::Result<()> {
532            decoder.debug_check_bounds::<Self>(offset);
533            // Verify that padding bytes are zero.
534            fidl::decode!(RebootReason, D, &mut self.reason, decoder, offset + 0, _depth)?;
535            Ok(())
536        }
537    }
538
539    impl fidl::encoding::ValueTypeMarker for RebootMethodsWatcherOnRebootRequest {
540        type Borrowed<'a> = &'a Self;
541        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
542            value
543        }
544    }
545
546    unsafe impl fidl::encoding::TypeMarker for RebootMethodsWatcherOnRebootRequest {
547        type Owned = Self;
548
549        #[inline(always)]
550        fn inline_align(_context: fidl::encoding::Context) -> usize {
551            4
552        }
553
554        #[inline(always)]
555        fn inline_size(_context: fidl::encoding::Context) -> usize {
556            4
557        }
558    }
559
560    unsafe impl<D: fidl::encoding::ResourceDialect>
561        fidl::encoding::Encode<RebootMethodsWatcherOnRebootRequest, D>
562        for &RebootMethodsWatcherOnRebootRequest
563    {
564        #[inline]
565        unsafe fn encode(
566            self,
567            encoder: &mut fidl::encoding::Encoder<'_, D>,
568            offset: usize,
569            _depth: fidl::encoding::Depth,
570        ) -> fidl::Result<()> {
571            encoder.debug_check_bounds::<RebootMethodsWatcherOnRebootRequest>(offset);
572            // Delegate to tuple encoding.
573            fidl::encoding::Encode::<RebootMethodsWatcherOnRebootRequest, D>::encode(
574                (<RebootReason as fidl::encoding::ValueTypeMarker>::borrow(&self.reason),),
575                encoder,
576                offset,
577                _depth,
578            )
579        }
580    }
581    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<RebootReason, D>>
582        fidl::encoding::Encode<RebootMethodsWatcherOnRebootRequest, D> for (T0,)
583    {
584        #[inline]
585        unsafe fn encode(
586            self,
587            encoder: &mut fidl::encoding::Encoder<'_, D>,
588            offset: usize,
589            depth: fidl::encoding::Depth,
590        ) -> fidl::Result<()> {
591            encoder.debug_check_bounds::<RebootMethodsWatcherOnRebootRequest>(offset);
592            // Zero out padding regions. There's no need to apply masks
593            // because the unmasked parts will be overwritten by fields.
594            // Write the fields.
595            self.0.encode(encoder, offset + 0, depth)?;
596            Ok(())
597        }
598    }
599
600    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
601        for RebootMethodsWatcherOnRebootRequest
602    {
603        #[inline(always)]
604        fn new_empty() -> Self {
605            Self { reason: fidl::new_empty!(RebootReason, D) }
606        }
607
608        #[inline]
609        unsafe fn decode(
610            &mut self,
611            decoder: &mut fidl::encoding::Decoder<'_, D>,
612            offset: usize,
613            _depth: fidl::encoding::Depth,
614        ) -> fidl::Result<()> {
615            decoder.debug_check_bounds::<Self>(offset);
616            // Verify that padding bytes are zero.
617            fidl::decode!(RebootReason, D, &mut self.reason, decoder, offset + 0, _depth)?;
618            Ok(())
619        }
620    }
621
622    impl fidl::encoding::ValueTypeMarker for RebootWatcherOnRebootRequest {
623        type Borrowed<'a> = &'a Self;
624        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
625            value
626        }
627    }
628
629    unsafe impl fidl::encoding::TypeMarker for RebootWatcherOnRebootRequest {
630        type Owned = Self;
631
632        #[inline(always)]
633        fn inline_align(_context: fidl::encoding::Context) -> usize {
634            8
635        }
636
637        #[inline(always)]
638        fn inline_size(_context: fidl::encoding::Context) -> usize {
639            16
640        }
641    }
642
643    unsafe impl<D: fidl::encoding::ResourceDialect>
644        fidl::encoding::Encode<RebootWatcherOnRebootRequest, D> for &RebootWatcherOnRebootRequest
645    {
646        #[inline]
647        unsafe fn encode(
648            self,
649            encoder: &mut fidl::encoding::Encoder<'_, D>,
650            offset: usize,
651            _depth: fidl::encoding::Depth,
652        ) -> fidl::Result<()> {
653            encoder.debug_check_bounds::<RebootWatcherOnRebootRequest>(offset);
654            // Delegate to tuple encoding.
655            fidl::encoding::Encode::<RebootWatcherOnRebootRequest, D>::encode(
656                (<RebootOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
657                encoder,
658                offset,
659                _depth,
660            )
661        }
662    }
663    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<RebootOptions, D>>
664        fidl::encoding::Encode<RebootWatcherOnRebootRequest, D> for (T0,)
665    {
666        #[inline]
667        unsafe fn encode(
668            self,
669            encoder: &mut fidl::encoding::Encoder<'_, D>,
670            offset: usize,
671            depth: fidl::encoding::Depth,
672        ) -> fidl::Result<()> {
673            encoder.debug_check_bounds::<RebootWatcherOnRebootRequest>(offset);
674            // Zero out padding regions. There's no need to apply masks
675            // because the unmasked parts will be overwritten by fields.
676            // Write the fields.
677            self.0.encode(encoder, offset + 0, depth)?;
678            Ok(())
679        }
680    }
681
682    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
683        for RebootWatcherOnRebootRequest
684    {
685        #[inline(always)]
686        fn new_empty() -> Self {
687            Self { options: fidl::new_empty!(RebootOptions, D) }
688        }
689
690        #[inline]
691        unsafe fn decode(
692            &mut self,
693            decoder: &mut fidl::encoding::Decoder<'_, D>,
694            offset: usize,
695            _depth: fidl::encoding::Depth,
696        ) -> fidl::Result<()> {
697            decoder.debug_check_bounds::<Self>(offset);
698            // Verify that padding bytes are zero.
699            fidl::decode!(RebootOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
700            Ok(())
701        }
702    }
703
704    impl RebootOptions {
705        #[inline(always)]
706        fn max_ordinal_present(&self) -> u64 {
707            if let Some(_) = self.reasons {
708                return 1;
709            }
710            0
711        }
712    }
713
714    impl fidl::encoding::ValueTypeMarker for RebootOptions {
715        type Borrowed<'a> = &'a Self;
716        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
717            value
718        }
719    }
720
721    unsafe impl fidl::encoding::TypeMarker for RebootOptions {
722        type Owned = Self;
723
724        #[inline(always)]
725        fn inline_align(_context: fidl::encoding::Context) -> usize {
726            8
727        }
728
729        #[inline(always)]
730        fn inline_size(_context: fidl::encoding::Context) -> usize {
731            16
732        }
733    }
734
735    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<RebootOptions, D>
736        for &RebootOptions
737    {
738        unsafe fn encode(
739            self,
740            encoder: &mut fidl::encoding::Encoder<'_, D>,
741            offset: usize,
742            mut depth: fidl::encoding::Depth,
743        ) -> fidl::Result<()> {
744            encoder.debug_check_bounds::<RebootOptions>(offset);
745            // Vector header
746            let max_ordinal: u64 = self.max_ordinal_present();
747            encoder.write_num(max_ordinal, offset);
748            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
749            // Calling encoder.out_of_line_offset(0) is not allowed.
750            if max_ordinal == 0 {
751                return Ok(());
752            }
753            depth.increment()?;
754            let envelope_size = 8;
755            let bytes_len = max_ordinal as usize * envelope_size;
756            #[allow(unused_variables)]
757            let offset = encoder.out_of_line_offset(bytes_len);
758            let mut _prev_end_offset: usize = 0;
759            if 1 > max_ordinal {
760                return Ok(());
761            }
762
763            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
764            // are envelope_size bytes.
765            let cur_offset: usize = (1 - 1) * envelope_size;
766
767            // Zero reserved fields.
768            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
769
770            // Safety:
771            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
772            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
773            //   envelope_size bytes, there is always sufficient room.
774            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<RebootReason2, 100>, D>(
775            self.reasons.as_ref().map(<fidl::encoding::Vector<RebootReason2, 100> as fidl::encoding::ValueTypeMarker>::borrow),
776            encoder, offset + cur_offset, depth
777        )?;
778
779            _prev_end_offset = cur_offset + envelope_size;
780
781            Ok(())
782        }
783    }
784
785    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RebootOptions {
786        #[inline(always)]
787        fn new_empty() -> Self {
788            Self::default()
789        }
790
791        unsafe fn decode(
792            &mut self,
793            decoder: &mut fidl::encoding::Decoder<'_, D>,
794            offset: usize,
795            mut depth: fidl::encoding::Depth,
796        ) -> fidl::Result<()> {
797            decoder.debug_check_bounds::<Self>(offset);
798            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
799                None => return Err(fidl::Error::NotNullable),
800                Some(len) => len,
801            };
802            // Calling decoder.out_of_line_offset(0) is not allowed.
803            if len == 0 {
804                return Ok(());
805            };
806            depth.increment()?;
807            let envelope_size = 8;
808            let bytes_len = len * envelope_size;
809            let offset = decoder.out_of_line_offset(bytes_len)?;
810            // Decode the envelope for each type.
811            let mut _next_ordinal_to_read = 0;
812            let mut next_offset = offset;
813            let end_offset = offset + bytes_len;
814            _next_ordinal_to_read += 1;
815            if next_offset >= end_offset {
816                return Ok(());
817            }
818
819            // Decode unknown envelopes for gaps in ordinals.
820            while _next_ordinal_to_read < 1 {
821                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
822                _next_ordinal_to_read += 1;
823                next_offset += envelope_size;
824            }
825
826            let next_out_of_line = decoder.next_out_of_line();
827            let handles_before = decoder.remaining_handles();
828            if let Some((inlined, num_bytes, num_handles)) =
829                fidl::encoding::decode_envelope_header(decoder, next_offset)?
830            {
831                let member_inline_size = <fidl::encoding::Vector<RebootReason2, 100> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
832                if inlined != (member_inline_size <= 4) {
833                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
834                }
835                let inner_offset;
836                let mut inner_depth = depth.clone();
837                if inlined {
838                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
839                    inner_offset = next_offset;
840                } else {
841                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
842                    inner_depth.increment()?;
843                }
844                let val_ref = self.reasons.get_or_insert_with(
845                    || fidl::new_empty!(fidl::encoding::Vector<RebootReason2, 100>, D),
846                );
847                fidl::decode!(fidl::encoding::Vector<RebootReason2, 100>, D, val_ref, decoder, inner_offset, inner_depth)?;
848                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
849                {
850                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
851                }
852                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
853                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
854                }
855            }
856
857            next_offset += envelope_size;
858
859            // Decode the remaining unknown envelopes.
860            while next_offset < end_offset {
861                _next_ordinal_to_read += 1;
862                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
863                next_offset += envelope_size;
864            }
865
866            Ok(())
867        }
868    }
869}