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