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