fidl_fuchsia_power_battery__common/
fidl_fuchsia_power_battery__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 overall status of the battery, informing its general availability.
12#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
13#[repr(u32)]
14pub enum BatteryStatus {
15    /// Uninitialized battery status.
16    Unknown = 0,
17    /// Battery present and available.
18    Ok = 1,
19    /// Battery present, but not available (e.g. disabled).
20    NotAvailable = 2,
21    /// Battery not present (e.g. removed or no battery).
22    NotPresent = 3,
23}
24
25impl BatteryStatus {
26    #[inline]
27    pub fn from_primitive(prim: u32) -> Option<Self> {
28        match prim {
29            0 => Some(Self::Unknown),
30            1 => Some(Self::Ok),
31            2 => Some(Self::NotAvailable),
32            3 => Some(Self::NotPresent),
33            _ => None,
34        }
35    }
36
37    #[inline]
38    pub const fn into_primitive(self) -> u32 {
39        self as u32
40    }
41}
42
43/// The power source for an actively charging battery.
44#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
45#[repr(u32)]
46pub enum ChargeSource {
47    Unknown = 0,
48    None = 1,
49    AcAdapter = 2,
50    Usb = 3,
51    Wireless = 4,
52}
53
54impl ChargeSource {
55    #[inline]
56    pub fn from_primitive(prim: u32) -> Option<Self> {
57        match prim {
58            0 => Some(Self::Unknown),
59            1 => Some(Self::None),
60            2 => Some(Self::AcAdapter),
61            3 => Some(Self::Usb),
62            4 => Some(Self::Wireless),
63            _ => None,
64        }
65    }
66
67    #[inline]
68    pub const fn into_primitive(self) -> u32 {
69        self as u32
70    }
71}
72
73/// The status of the battery with respect to charging.
74#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
75#[repr(u32)]
76pub enum ChargeStatus {
77    Unknown = 0,
78    NotCharging = 1,
79    Charging = 2,
80    Discharging = 3,
81    Full = 4,
82}
83
84impl ChargeStatus {
85    #[inline]
86    pub fn from_primitive(prim: u32) -> Option<Self> {
87        match prim {
88            0 => Some(Self::Unknown),
89            1 => Some(Self::NotCharging),
90            2 => Some(Self::Charging),
91            3 => Some(Self::Discharging),
92            4 => Some(Self::Full),
93            _ => None,
94        }
95    }
96
97    #[inline]
98    pub const fn into_primitive(self) -> u32 {
99        self as u32
100    }
101}
102
103/// The general status related to the overall health of the battery.
104#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
105#[repr(u32)]
106pub enum HealthStatus {
107    Unknown = 0,
108    Good = 1,
109    Cold = 2,
110    Hot = 3,
111    Dead = 4,
112    OverVoltage = 5,
113    UnspecifiedFailure = 6,
114    Cool = 7,
115    Warm = 8,
116    Overheat = 9,
117}
118
119impl HealthStatus {
120    #[inline]
121    pub fn from_primitive(prim: u32) -> Option<Self> {
122        match prim {
123            0 => Some(Self::Unknown),
124            1 => Some(Self::Good),
125            2 => Some(Self::Cold),
126            3 => Some(Self::Hot),
127            4 => Some(Self::Dead),
128            5 => Some(Self::OverVoltage),
129            6 => Some(Self::UnspecifiedFailure),
130            7 => Some(Self::Cool),
131            8 => Some(Self::Warm),
132            9 => Some(Self::Overheat),
133            _ => None,
134        }
135    }
136
137    #[inline]
138    pub const fn into_primitive(self) -> u32 {
139        self as u32
140    }
141}
142
143/// The general status of the battery level.
144#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
145#[repr(u32)]
146pub enum LevelStatus {
147    Unknown = 0,
148    Ok = 1,
149    Warning = 2,
150    Low = 3,
151    Critical = 4,
152}
153
154impl LevelStatus {
155    #[inline]
156    pub fn from_primitive(prim: u32) -> Option<Self> {
157        match prim {
158            0 => Some(Self::Unknown),
159            1 => Some(Self::Ok),
160            2 => Some(Self::Warning),
161            3 => Some(Self::Low),
162            4 => Some(Self::Critical),
163            _ => None,
164        }
165    }
166
167    #[inline]
168    pub const fn into_primitive(self) -> u32 {
169        self as u32
170    }
171}
172
173#[derive(Clone, Debug, PartialEq)]
174pub struct BatteryInfoProviderGetBatteryInfoResponse {
175    pub info: BatteryInfo,
176}
177
178impl fidl::Persistable for BatteryInfoProviderGetBatteryInfoResponse {}
179
180/// Current battery state information.
181#[derive(Clone, Debug, Default, PartialEq)]
182pub struct BatteryInfo {
183    /// General battery status with respect to presence & availability.
184    pub status: Option<BatteryStatus>,
185    /// The current state of the battery with respect to charging.
186    pub charge_status: Option<ChargeStatus>,
187    /// The charge source while battery is actively charging.
188    /// When not actively charging, this will reflect that the source is
189    /// NONE (not charging) or UNKNOWN.
190    pub charge_source: Option<ChargeSource>,
191    /// Battery level in percentage. Level percent is only available if
192    /// level status is known.
193    pub level_percent: Option<f32>,
194    /// Battery level as a general status, including low and critical.
195    pub level_status: Option<LevelStatus>,
196    /// Overall battery health.
197    pub health: Option<HealthStatus>,
198    /// Time remaining relative to the current charge status.
199    pub time_remaining: Option<TimeRemaining>,
200    /// Timestamp to distinguish between latest and stale status.
201    pub timestamp: Option<i64>,
202    /// Forward the voltage level in mv.
203    pub present_voltage_mv: Option<u32>,
204    /// Forward the battery capqacity in uAh.
205    pub remaining_capacity_uah: Option<u32>,
206    /// Battery spec.
207    pub battery_spec: Option<BatterySpec>,
208    /// Full Charge Capacity in uAh.
209    pub full_capacity_uah: Option<i32>,
210    /// Temperature in MilliCelsius.
211    pub temperature_mc: Option<i32>,
212    /// Current in MilliAmps.
213    pub present_current_ma: Option<i32>,
214    /// Average Current in MilliAmps.
215    pub average_current_ma: Option<i32>,
216    #[doc(hidden)]
217    pub __source_breaking: fidl::marker::SourceBreaking,
218}
219
220impl fidl::Persistable for BatteryInfo {}
221
222/// Type of data that are determined by manufacturer.
223#[derive(Clone, Debug, Default, PartialEq)]
224pub struct BatterySpec {
225    /// Represent the battery's charging current spec in micro amps.
226    pub max_charging_current_ua: Option<i32>,
227    /// Represent the battery's charging voltage spec in micro volt.
228    pub max_charging_voltage_uv: Option<i32>,
229    /// Battery Full Charge Design Capacity in micro amp hour.
230    pub design_capacity_uah: Option<i32>,
231    #[doc(hidden)]
232    pub __source_breaking: fidl::marker::SourceBreaking,
233}
234
235impl fidl::Persistable for BatterySpec {}
236
237/// The time remaining while actively charging or discharging.
238#[derive(Clone, Debug)]
239pub enum TimeRemaining {
240    /// Representation of indeterminate state with zero duration.
241    Indeterminate(i64),
242    /// Remaining battery life while discharging.
243    BatteryLife(i64),
244    /// Remaining time until full while charging.
245    FullCharge(i64),
246    #[doc(hidden)]
247    __SourceBreaking { unknown_ordinal: u64 },
248}
249
250/// Pattern that matches an unknown `TimeRemaining` member.
251#[macro_export]
252macro_rules! TimeRemainingUnknown {
253    () => {
254        _
255    };
256}
257
258// Custom PartialEq so that unknown variants are not equal to themselves.
259impl PartialEq for TimeRemaining {
260    fn eq(&self, other: &Self) -> bool {
261        match (self, other) {
262            (Self::Indeterminate(x), Self::Indeterminate(y)) => *x == *y,
263            (Self::BatteryLife(x), Self::BatteryLife(y)) => *x == *y,
264            (Self::FullCharge(x), Self::FullCharge(y)) => *x == *y,
265            _ => false,
266        }
267    }
268}
269
270impl TimeRemaining {
271    #[inline]
272    pub fn ordinal(&self) -> u64 {
273        match *self {
274            Self::Indeterminate(_) => 1,
275            Self::BatteryLife(_) => 2,
276            Self::FullCharge(_) => 3,
277            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
278        }
279    }
280
281    #[inline]
282    pub fn unknown_variant_for_testing() -> Self {
283        Self::__SourceBreaking { unknown_ordinal: 0 }
284    }
285
286    #[inline]
287    pub fn is_unknown(&self) -> bool {
288        match self {
289            Self::__SourceBreaking { .. } => true,
290            _ => false,
291        }
292    }
293}
294
295impl fidl::Persistable for TimeRemaining {}
296
297pub mod battery_info_provider_ordinals {
298    pub const GET_BATTERY_INFO: u64 = 0x51ea101e4fe7a192;
299    pub const WATCH: u64 = 0x4d44a314cd3f5191;
300}
301
302pub mod battery_info_watcher_ordinals {
303    pub const ON_CHANGE_BATTERY_INFO: u64 = 0x2d1eb8ed2b619a7d;
304}
305
306pub mod battery_manager_ordinals {
307    pub const GET_BATTERY_INFO: u64 = 0x51ea101e4fe7a192;
308    pub const WATCH: u64 = 0x4d44a314cd3f5191;
309}
310
311mod internal {
312    use super::*;
313    unsafe impl fidl::encoding::TypeMarker for BatteryStatus {
314        type Owned = Self;
315
316        #[inline(always)]
317        fn inline_align(_context: fidl::encoding::Context) -> usize {
318            std::mem::align_of::<u32>()
319        }
320
321        #[inline(always)]
322        fn inline_size(_context: fidl::encoding::Context) -> usize {
323            std::mem::size_of::<u32>()
324        }
325
326        #[inline(always)]
327        fn encode_is_copy() -> bool {
328            true
329        }
330
331        #[inline(always)]
332        fn decode_is_copy() -> bool {
333            false
334        }
335    }
336
337    impl fidl::encoding::ValueTypeMarker for BatteryStatus {
338        type Borrowed<'a> = Self;
339        #[inline(always)]
340        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
341            *value
342        }
343    }
344
345    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for BatteryStatus {
346        #[inline]
347        unsafe fn encode(
348            self,
349            encoder: &mut fidl::encoding::Encoder<'_, D>,
350            offset: usize,
351            _depth: fidl::encoding::Depth,
352        ) -> fidl::Result<()> {
353            encoder.debug_check_bounds::<Self>(offset);
354            encoder.write_num(self.into_primitive(), offset);
355            Ok(())
356        }
357    }
358
359    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for BatteryStatus {
360        #[inline(always)]
361        fn new_empty() -> Self {
362            Self::Unknown
363        }
364
365        #[inline]
366        unsafe fn decode(
367            &mut self,
368            decoder: &mut fidl::encoding::Decoder<'_, D>,
369            offset: usize,
370            _depth: fidl::encoding::Depth,
371        ) -> fidl::Result<()> {
372            decoder.debug_check_bounds::<Self>(offset);
373            let prim = decoder.read_num::<u32>(offset);
374
375            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
376            Ok(())
377        }
378    }
379    unsafe impl fidl::encoding::TypeMarker for ChargeSource {
380        type Owned = Self;
381
382        #[inline(always)]
383        fn inline_align(_context: fidl::encoding::Context) -> usize {
384            std::mem::align_of::<u32>()
385        }
386
387        #[inline(always)]
388        fn inline_size(_context: fidl::encoding::Context) -> usize {
389            std::mem::size_of::<u32>()
390        }
391
392        #[inline(always)]
393        fn encode_is_copy() -> bool {
394            true
395        }
396
397        #[inline(always)]
398        fn decode_is_copy() -> bool {
399            false
400        }
401    }
402
403    impl fidl::encoding::ValueTypeMarker for ChargeSource {
404        type Borrowed<'a> = Self;
405        #[inline(always)]
406        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
407            *value
408        }
409    }
410
411    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for ChargeSource {
412        #[inline]
413        unsafe fn encode(
414            self,
415            encoder: &mut fidl::encoding::Encoder<'_, D>,
416            offset: usize,
417            _depth: fidl::encoding::Depth,
418        ) -> fidl::Result<()> {
419            encoder.debug_check_bounds::<Self>(offset);
420            encoder.write_num(self.into_primitive(), offset);
421            Ok(())
422        }
423    }
424
425    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ChargeSource {
426        #[inline(always)]
427        fn new_empty() -> Self {
428            Self::Unknown
429        }
430
431        #[inline]
432        unsafe fn decode(
433            &mut self,
434            decoder: &mut fidl::encoding::Decoder<'_, D>,
435            offset: usize,
436            _depth: fidl::encoding::Depth,
437        ) -> fidl::Result<()> {
438            decoder.debug_check_bounds::<Self>(offset);
439            let prim = decoder.read_num::<u32>(offset);
440
441            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
442            Ok(())
443        }
444    }
445    unsafe impl fidl::encoding::TypeMarker for ChargeStatus {
446        type Owned = Self;
447
448        #[inline(always)]
449        fn inline_align(_context: fidl::encoding::Context) -> usize {
450            std::mem::align_of::<u32>()
451        }
452
453        #[inline(always)]
454        fn inline_size(_context: fidl::encoding::Context) -> usize {
455            std::mem::size_of::<u32>()
456        }
457
458        #[inline(always)]
459        fn encode_is_copy() -> bool {
460            true
461        }
462
463        #[inline(always)]
464        fn decode_is_copy() -> bool {
465            false
466        }
467    }
468
469    impl fidl::encoding::ValueTypeMarker for ChargeStatus {
470        type Borrowed<'a> = Self;
471        #[inline(always)]
472        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
473            *value
474        }
475    }
476
477    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for ChargeStatus {
478        #[inline]
479        unsafe fn encode(
480            self,
481            encoder: &mut fidl::encoding::Encoder<'_, D>,
482            offset: usize,
483            _depth: fidl::encoding::Depth,
484        ) -> fidl::Result<()> {
485            encoder.debug_check_bounds::<Self>(offset);
486            encoder.write_num(self.into_primitive(), offset);
487            Ok(())
488        }
489    }
490
491    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ChargeStatus {
492        #[inline(always)]
493        fn new_empty() -> Self {
494            Self::Unknown
495        }
496
497        #[inline]
498        unsafe fn decode(
499            &mut self,
500            decoder: &mut fidl::encoding::Decoder<'_, D>,
501            offset: usize,
502            _depth: fidl::encoding::Depth,
503        ) -> fidl::Result<()> {
504            decoder.debug_check_bounds::<Self>(offset);
505            let prim = decoder.read_num::<u32>(offset);
506
507            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
508            Ok(())
509        }
510    }
511    unsafe impl fidl::encoding::TypeMarker for HealthStatus {
512        type Owned = Self;
513
514        #[inline(always)]
515        fn inline_align(_context: fidl::encoding::Context) -> usize {
516            std::mem::align_of::<u32>()
517        }
518
519        #[inline(always)]
520        fn inline_size(_context: fidl::encoding::Context) -> usize {
521            std::mem::size_of::<u32>()
522        }
523
524        #[inline(always)]
525        fn encode_is_copy() -> bool {
526            true
527        }
528
529        #[inline(always)]
530        fn decode_is_copy() -> bool {
531            false
532        }
533    }
534
535    impl fidl::encoding::ValueTypeMarker for HealthStatus {
536        type Borrowed<'a> = Self;
537        #[inline(always)]
538        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
539            *value
540        }
541    }
542
543    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for HealthStatus {
544        #[inline]
545        unsafe fn encode(
546            self,
547            encoder: &mut fidl::encoding::Encoder<'_, D>,
548            offset: usize,
549            _depth: fidl::encoding::Depth,
550        ) -> fidl::Result<()> {
551            encoder.debug_check_bounds::<Self>(offset);
552            encoder.write_num(self.into_primitive(), offset);
553            Ok(())
554        }
555    }
556
557    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for HealthStatus {
558        #[inline(always)]
559        fn new_empty() -> Self {
560            Self::Unknown
561        }
562
563        #[inline]
564        unsafe fn decode(
565            &mut self,
566            decoder: &mut fidl::encoding::Decoder<'_, D>,
567            offset: usize,
568            _depth: fidl::encoding::Depth,
569        ) -> fidl::Result<()> {
570            decoder.debug_check_bounds::<Self>(offset);
571            let prim = decoder.read_num::<u32>(offset);
572
573            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
574            Ok(())
575        }
576    }
577    unsafe impl fidl::encoding::TypeMarker for LevelStatus {
578        type Owned = Self;
579
580        #[inline(always)]
581        fn inline_align(_context: fidl::encoding::Context) -> usize {
582            std::mem::align_of::<u32>()
583        }
584
585        #[inline(always)]
586        fn inline_size(_context: fidl::encoding::Context) -> usize {
587            std::mem::size_of::<u32>()
588        }
589
590        #[inline(always)]
591        fn encode_is_copy() -> bool {
592            true
593        }
594
595        #[inline(always)]
596        fn decode_is_copy() -> bool {
597            false
598        }
599    }
600
601    impl fidl::encoding::ValueTypeMarker for LevelStatus {
602        type Borrowed<'a> = Self;
603        #[inline(always)]
604        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
605            *value
606        }
607    }
608
609    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for LevelStatus {
610        #[inline]
611        unsafe fn encode(
612            self,
613            encoder: &mut fidl::encoding::Encoder<'_, D>,
614            offset: usize,
615            _depth: fidl::encoding::Depth,
616        ) -> fidl::Result<()> {
617            encoder.debug_check_bounds::<Self>(offset);
618            encoder.write_num(self.into_primitive(), offset);
619            Ok(())
620        }
621    }
622
623    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for LevelStatus {
624        #[inline(always)]
625        fn new_empty() -> Self {
626            Self::Unknown
627        }
628
629        #[inline]
630        unsafe fn decode(
631            &mut self,
632            decoder: &mut fidl::encoding::Decoder<'_, D>,
633            offset: usize,
634            _depth: fidl::encoding::Depth,
635        ) -> fidl::Result<()> {
636            decoder.debug_check_bounds::<Self>(offset);
637            let prim = decoder.read_num::<u32>(offset);
638
639            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
640            Ok(())
641        }
642    }
643
644    impl fidl::encoding::ValueTypeMarker for BatteryInfoProviderGetBatteryInfoResponse {
645        type Borrowed<'a> = &'a Self;
646        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
647            value
648        }
649    }
650
651    unsafe impl fidl::encoding::TypeMarker for BatteryInfoProviderGetBatteryInfoResponse {
652        type Owned = Self;
653
654        #[inline(always)]
655        fn inline_align(_context: fidl::encoding::Context) -> usize {
656            8
657        }
658
659        #[inline(always)]
660        fn inline_size(_context: fidl::encoding::Context) -> usize {
661            16
662        }
663    }
664
665    unsafe impl<D: fidl::encoding::ResourceDialect>
666        fidl::encoding::Encode<BatteryInfoProviderGetBatteryInfoResponse, D>
667        for &BatteryInfoProviderGetBatteryInfoResponse
668    {
669        #[inline]
670        unsafe fn encode(
671            self,
672            encoder: &mut fidl::encoding::Encoder<'_, D>,
673            offset: usize,
674            _depth: fidl::encoding::Depth,
675        ) -> fidl::Result<()> {
676            encoder.debug_check_bounds::<BatteryInfoProviderGetBatteryInfoResponse>(offset);
677            // Delegate to tuple encoding.
678            fidl::encoding::Encode::<BatteryInfoProviderGetBatteryInfoResponse, D>::encode(
679                (<BatteryInfo as fidl::encoding::ValueTypeMarker>::borrow(&self.info),),
680                encoder,
681                offset,
682                _depth,
683            )
684        }
685    }
686    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<BatteryInfo, D>>
687        fidl::encoding::Encode<BatteryInfoProviderGetBatteryInfoResponse, D> for (T0,)
688    {
689        #[inline]
690        unsafe fn encode(
691            self,
692            encoder: &mut fidl::encoding::Encoder<'_, D>,
693            offset: usize,
694            depth: fidl::encoding::Depth,
695        ) -> fidl::Result<()> {
696            encoder.debug_check_bounds::<BatteryInfoProviderGetBatteryInfoResponse>(offset);
697            // Zero out padding regions. There's no need to apply masks
698            // because the unmasked parts will be overwritten by fields.
699            // Write the fields.
700            self.0.encode(encoder, offset + 0, depth)?;
701            Ok(())
702        }
703    }
704
705    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
706        for BatteryInfoProviderGetBatteryInfoResponse
707    {
708        #[inline(always)]
709        fn new_empty() -> Self {
710            Self { info: fidl::new_empty!(BatteryInfo, D) }
711        }
712
713        #[inline]
714        unsafe fn decode(
715            &mut self,
716            decoder: &mut fidl::encoding::Decoder<'_, D>,
717            offset: usize,
718            _depth: fidl::encoding::Depth,
719        ) -> fidl::Result<()> {
720            decoder.debug_check_bounds::<Self>(offset);
721            // Verify that padding bytes are zero.
722            fidl::decode!(BatteryInfo, D, &mut self.info, decoder, offset + 0, _depth)?;
723            Ok(())
724        }
725    }
726
727    impl BatteryInfo {
728        #[inline(always)]
729        fn max_ordinal_present(&self) -> u64 {
730            if let Some(_) = self.average_current_ma {
731                return 15;
732            }
733            if let Some(_) = self.present_current_ma {
734                return 14;
735            }
736            if let Some(_) = self.temperature_mc {
737                return 13;
738            }
739            if let Some(_) = self.full_capacity_uah {
740                return 12;
741            }
742            if let Some(_) = self.battery_spec {
743                return 11;
744            }
745            if let Some(_) = self.remaining_capacity_uah {
746                return 10;
747            }
748            if let Some(_) = self.present_voltage_mv {
749                return 9;
750            }
751            if let Some(_) = self.timestamp {
752                return 8;
753            }
754            if let Some(_) = self.time_remaining {
755                return 7;
756            }
757            if let Some(_) = self.health {
758                return 6;
759            }
760            if let Some(_) = self.level_status {
761                return 5;
762            }
763            if let Some(_) = self.level_percent {
764                return 4;
765            }
766            if let Some(_) = self.charge_source {
767                return 3;
768            }
769            if let Some(_) = self.charge_status {
770                return 2;
771            }
772            if let Some(_) = self.status {
773                return 1;
774            }
775            0
776        }
777    }
778
779    impl fidl::encoding::ValueTypeMarker for BatteryInfo {
780        type Borrowed<'a> = &'a Self;
781        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
782            value
783        }
784    }
785
786    unsafe impl fidl::encoding::TypeMarker for BatteryInfo {
787        type Owned = Self;
788
789        #[inline(always)]
790        fn inline_align(_context: fidl::encoding::Context) -> usize {
791            8
792        }
793
794        #[inline(always)]
795        fn inline_size(_context: fidl::encoding::Context) -> usize {
796            16
797        }
798    }
799
800    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<BatteryInfo, D>
801        for &BatteryInfo
802    {
803        unsafe fn encode(
804            self,
805            encoder: &mut fidl::encoding::Encoder<'_, D>,
806            offset: usize,
807            mut depth: fidl::encoding::Depth,
808        ) -> fidl::Result<()> {
809            encoder.debug_check_bounds::<BatteryInfo>(offset);
810            // Vector header
811            let max_ordinal: u64 = self.max_ordinal_present();
812            encoder.write_num(max_ordinal, offset);
813            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
814            // Calling encoder.out_of_line_offset(0) is not allowed.
815            if max_ordinal == 0 {
816                return Ok(());
817            }
818            depth.increment()?;
819            let envelope_size = 8;
820            let bytes_len = max_ordinal as usize * envelope_size;
821            #[allow(unused_variables)]
822            let offset = encoder.out_of_line_offset(bytes_len);
823            let mut _prev_end_offset: usize = 0;
824            if 1 > max_ordinal {
825                return Ok(());
826            }
827
828            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
829            // are envelope_size bytes.
830            let cur_offset: usize = (1 - 1) * envelope_size;
831
832            // Zero reserved fields.
833            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
834
835            // Safety:
836            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
837            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
838            //   envelope_size bytes, there is always sufficient room.
839            fidl::encoding::encode_in_envelope_optional::<BatteryStatus, D>(
840                self.status
841                    .as_ref()
842                    .map(<BatteryStatus as fidl::encoding::ValueTypeMarker>::borrow),
843                encoder,
844                offset + cur_offset,
845                depth,
846            )?;
847
848            _prev_end_offset = cur_offset + envelope_size;
849            if 2 > max_ordinal {
850                return Ok(());
851            }
852
853            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
854            // are envelope_size bytes.
855            let cur_offset: usize = (2 - 1) * envelope_size;
856
857            // Zero reserved fields.
858            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
859
860            // Safety:
861            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
862            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
863            //   envelope_size bytes, there is always sufficient room.
864            fidl::encoding::encode_in_envelope_optional::<ChargeStatus, D>(
865                self.charge_status
866                    .as_ref()
867                    .map(<ChargeStatus as fidl::encoding::ValueTypeMarker>::borrow),
868                encoder,
869                offset + cur_offset,
870                depth,
871            )?;
872
873            _prev_end_offset = cur_offset + envelope_size;
874            if 3 > max_ordinal {
875                return Ok(());
876            }
877
878            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
879            // are envelope_size bytes.
880            let cur_offset: usize = (3 - 1) * envelope_size;
881
882            // Zero reserved fields.
883            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
884
885            // Safety:
886            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
887            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
888            //   envelope_size bytes, there is always sufficient room.
889            fidl::encoding::encode_in_envelope_optional::<ChargeSource, D>(
890                self.charge_source
891                    .as_ref()
892                    .map(<ChargeSource as fidl::encoding::ValueTypeMarker>::borrow),
893                encoder,
894                offset + cur_offset,
895                depth,
896            )?;
897
898            _prev_end_offset = cur_offset + envelope_size;
899            if 4 > max_ordinal {
900                return Ok(());
901            }
902
903            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
904            // are envelope_size bytes.
905            let cur_offset: usize = (4 - 1) * envelope_size;
906
907            // Zero reserved fields.
908            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
909
910            // Safety:
911            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
912            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
913            //   envelope_size bytes, there is always sufficient room.
914            fidl::encoding::encode_in_envelope_optional::<f32, D>(
915                self.level_percent.as_ref().map(<f32 as fidl::encoding::ValueTypeMarker>::borrow),
916                encoder,
917                offset + cur_offset,
918                depth,
919            )?;
920
921            _prev_end_offset = cur_offset + envelope_size;
922            if 5 > max_ordinal {
923                return Ok(());
924            }
925
926            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
927            // are envelope_size bytes.
928            let cur_offset: usize = (5 - 1) * envelope_size;
929
930            // Zero reserved fields.
931            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
932
933            // Safety:
934            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
935            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
936            //   envelope_size bytes, there is always sufficient room.
937            fidl::encoding::encode_in_envelope_optional::<LevelStatus, D>(
938                self.level_status
939                    .as_ref()
940                    .map(<LevelStatus as fidl::encoding::ValueTypeMarker>::borrow),
941                encoder,
942                offset + cur_offset,
943                depth,
944            )?;
945
946            _prev_end_offset = cur_offset + envelope_size;
947            if 6 > max_ordinal {
948                return Ok(());
949            }
950
951            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
952            // are envelope_size bytes.
953            let cur_offset: usize = (6 - 1) * envelope_size;
954
955            // Zero reserved fields.
956            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
957
958            // Safety:
959            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
960            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
961            //   envelope_size bytes, there is always sufficient room.
962            fidl::encoding::encode_in_envelope_optional::<HealthStatus, D>(
963                self.health.as_ref().map(<HealthStatus as fidl::encoding::ValueTypeMarker>::borrow),
964                encoder,
965                offset + cur_offset,
966                depth,
967            )?;
968
969            _prev_end_offset = cur_offset + envelope_size;
970            if 7 > max_ordinal {
971                return Ok(());
972            }
973
974            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
975            // are envelope_size bytes.
976            let cur_offset: usize = (7 - 1) * envelope_size;
977
978            // Zero reserved fields.
979            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
980
981            // Safety:
982            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
983            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
984            //   envelope_size bytes, there is always sufficient room.
985            fidl::encoding::encode_in_envelope_optional::<TimeRemaining, D>(
986                self.time_remaining
987                    .as_ref()
988                    .map(<TimeRemaining as fidl::encoding::ValueTypeMarker>::borrow),
989                encoder,
990                offset + cur_offset,
991                depth,
992            )?;
993
994            _prev_end_offset = cur_offset + envelope_size;
995            if 8 > max_ordinal {
996                return Ok(());
997            }
998
999            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1000            // are envelope_size bytes.
1001            let cur_offset: usize = (8 - 1) * envelope_size;
1002
1003            // Zero reserved fields.
1004            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1005
1006            // Safety:
1007            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1008            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1009            //   envelope_size bytes, there is always sufficient room.
1010            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1011                self.timestamp.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1012                encoder,
1013                offset + cur_offset,
1014                depth,
1015            )?;
1016
1017            _prev_end_offset = cur_offset + envelope_size;
1018            if 9 > max_ordinal {
1019                return Ok(());
1020            }
1021
1022            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1023            // are envelope_size bytes.
1024            let cur_offset: usize = (9 - 1) * envelope_size;
1025
1026            // Zero reserved fields.
1027            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1028
1029            // Safety:
1030            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1031            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1032            //   envelope_size bytes, there is always sufficient room.
1033            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1034                self.present_voltage_mv
1035                    .as_ref()
1036                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1037                encoder,
1038                offset + cur_offset,
1039                depth,
1040            )?;
1041
1042            _prev_end_offset = cur_offset + envelope_size;
1043            if 10 > max_ordinal {
1044                return Ok(());
1045            }
1046
1047            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1048            // are envelope_size bytes.
1049            let cur_offset: usize = (10 - 1) * envelope_size;
1050
1051            // Zero reserved fields.
1052            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1053
1054            // Safety:
1055            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1056            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1057            //   envelope_size bytes, there is always sufficient room.
1058            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1059                self.remaining_capacity_uah
1060                    .as_ref()
1061                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1062                encoder,
1063                offset + cur_offset,
1064                depth,
1065            )?;
1066
1067            _prev_end_offset = cur_offset + envelope_size;
1068            if 11 > max_ordinal {
1069                return Ok(());
1070            }
1071
1072            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1073            // are envelope_size bytes.
1074            let cur_offset: usize = (11 - 1) * envelope_size;
1075
1076            // Zero reserved fields.
1077            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1078
1079            // Safety:
1080            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1081            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1082            //   envelope_size bytes, there is always sufficient room.
1083            fidl::encoding::encode_in_envelope_optional::<BatterySpec, D>(
1084                self.battery_spec
1085                    .as_ref()
1086                    .map(<BatterySpec as fidl::encoding::ValueTypeMarker>::borrow),
1087                encoder,
1088                offset + cur_offset,
1089                depth,
1090            )?;
1091
1092            _prev_end_offset = cur_offset + envelope_size;
1093            if 12 > max_ordinal {
1094                return Ok(());
1095            }
1096
1097            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1098            // are envelope_size bytes.
1099            let cur_offset: usize = (12 - 1) * envelope_size;
1100
1101            // Zero reserved fields.
1102            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1103
1104            // Safety:
1105            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1106            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1107            //   envelope_size bytes, there is always sufficient room.
1108            fidl::encoding::encode_in_envelope_optional::<i32, D>(
1109                self.full_capacity_uah
1110                    .as_ref()
1111                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
1112                encoder,
1113                offset + cur_offset,
1114                depth,
1115            )?;
1116
1117            _prev_end_offset = cur_offset + envelope_size;
1118            if 13 > max_ordinal {
1119                return Ok(());
1120            }
1121
1122            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1123            // are envelope_size bytes.
1124            let cur_offset: usize = (13 - 1) * envelope_size;
1125
1126            // Zero reserved fields.
1127            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1128
1129            // Safety:
1130            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1131            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1132            //   envelope_size bytes, there is always sufficient room.
1133            fidl::encoding::encode_in_envelope_optional::<i32, D>(
1134                self.temperature_mc.as_ref().map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
1135                encoder,
1136                offset + cur_offset,
1137                depth,
1138            )?;
1139
1140            _prev_end_offset = cur_offset + envelope_size;
1141            if 14 > max_ordinal {
1142                return Ok(());
1143            }
1144
1145            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1146            // are envelope_size bytes.
1147            let cur_offset: usize = (14 - 1) * envelope_size;
1148
1149            // Zero reserved fields.
1150            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1151
1152            // Safety:
1153            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1154            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1155            //   envelope_size bytes, there is always sufficient room.
1156            fidl::encoding::encode_in_envelope_optional::<i32, D>(
1157                self.present_current_ma
1158                    .as_ref()
1159                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
1160                encoder,
1161                offset + cur_offset,
1162                depth,
1163            )?;
1164
1165            _prev_end_offset = cur_offset + envelope_size;
1166            if 15 > max_ordinal {
1167                return Ok(());
1168            }
1169
1170            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1171            // are envelope_size bytes.
1172            let cur_offset: usize = (15 - 1) * envelope_size;
1173
1174            // Zero reserved fields.
1175            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1176
1177            // Safety:
1178            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1179            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1180            //   envelope_size bytes, there is always sufficient room.
1181            fidl::encoding::encode_in_envelope_optional::<i32, D>(
1182                self.average_current_ma
1183                    .as_ref()
1184                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
1185                encoder,
1186                offset + cur_offset,
1187                depth,
1188            )?;
1189
1190            _prev_end_offset = cur_offset + envelope_size;
1191
1192            Ok(())
1193        }
1194    }
1195
1196    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for BatteryInfo {
1197        #[inline(always)]
1198        fn new_empty() -> Self {
1199            Self::default()
1200        }
1201
1202        unsafe fn decode(
1203            &mut self,
1204            decoder: &mut fidl::encoding::Decoder<'_, D>,
1205            offset: usize,
1206            mut depth: fidl::encoding::Depth,
1207        ) -> fidl::Result<()> {
1208            decoder.debug_check_bounds::<Self>(offset);
1209            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1210                None => return Err(fidl::Error::NotNullable),
1211                Some(len) => len,
1212            };
1213            // Calling decoder.out_of_line_offset(0) is not allowed.
1214            if len == 0 {
1215                return Ok(());
1216            };
1217            depth.increment()?;
1218            let envelope_size = 8;
1219            let bytes_len = len * envelope_size;
1220            let offset = decoder.out_of_line_offset(bytes_len)?;
1221            // Decode the envelope for each type.
1222            let mut _next_ordinal_to_read = 0;
1223            let mut next_offset = offset;
1224            let end_offset = offset + bytes_len;
1225            _next_ordinal_to_read += 1;
1226            if next_offset >= end_offset {
1227                return Ok(());
1228            }
1229
1230            // Decode unknown envelopes for gaps in ordinals.
1231            while _next_ordinal_to_read < 1 {
1232                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1233                _next_ordinal_to_read += 1;
1234                next_offset += envelope_size;
1235            }
1236
1237            let next_out_of_line = decoder.next_out_of_line();
1238            let handles_before = decoder.remaining_handles();
1239            if let Some((inlined, num_bytes, num_handles)) =
1240                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1241            {
1242                let member_inline_size =
1243                    <BatteryStatus as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1244                if inlined != (member_inline_size <= 4) {
1245                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1246                }
1247                let inner_offset;
1248                let mut inner_depth = depth.clone();
1249                if inlined {
1250                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1251                    inner_offset = next_offset;
1252                } else {
1253                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1254                    inner_depth.increment()?;
1255                }
1256                let val_ref = self.status.get_or_insert_with(|| fidl::new_empty!(BatteryStatus, D));
1257                fidl::decode!(BatteryStatus, D, val_ref, decoder, inner_offset, inner_depth)?;
1258                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1259                {
1260                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1261                }
1262                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1263                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1264                }
1265            }
1266
1267            next_offset += envelope_size;
1268            _next_ordinal_to_read += 1;
1269            if next_offset >= end_offset {
1270                return Ok(());
1271            }
1272
1273            // Decode unknown envelopes for gaps in ordinals.
1274            while _next_ordinal_to_read < 2 {
1275                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1276                _next_ordinal_to_read += 1;
1277                next_offset += envelope_size;
1278            }
1279
1280            let next_out_of_line = decoder.next_out_of_line();
1281            let handles_before = decoder.remaining_handles();
1282            if let Some((inlined, num_bytes, num_handles)) =
1283                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1284            {
1285                let member_inline_size =
1286                    <ChargeStatus as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1287                if inlined != (member_inline_size <= 4) {
1288                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1289                }
1290                let inner_offset;
1291                let mut inner_depth = depth.clone();
1292                if inlined {
1293                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1294                    inner_offset = next_offset;
1295                } else {
1296                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1297                    inner_depth.increment()?;
1298                }
1299                let val_ref =
1300                    self.charge_status.get_or_insert_with(|| fidl::new_empty!(ChargeStatus, D));
1301                fidl::decode!(ChargeStatus, D, val_ref, decoder, inner_offset, inner_depth)?;
1302                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1303                {
1304                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1305                }
1306                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1307                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1308                }
1309            }
1310
1311            next_offset += envelope_size;
1312            _next_ordinal_to_read += 1;
1313            if next_offset >= end_offset {
1314                return Ok(());
1315            }
1316
1317            // Decode unknown envelopes for gaps in ordinals.
1318            while _next_ordinal_to_read < 3 {
1319                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1320                _next_ordinal_to_read += 1;
1321                next_offset += envelope_size;
1322            }
1323
1324            let next_out_of_line = decoder.next_out_of_line();
1325            let handles_before = decoder.remaining_handles();
1326            if let Some((inlined, num_bytes, num_handles)) =
1327                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1328            {
1329                let member_inline_size =
1330                    <ChargeSource as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1331                if inlined != (member_inline_size <= 4) {
1332                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1333                }
1334                let inner_offset;
1335                let mut inner_depth = depth.clone();
1336                if inlined {
1337                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1338                    inner_offset = next_offset;
1339                } else {
1340                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1341                    inner_depth.increment()?;
1342                }
1343                let val_ref =
1344                    self.charge_source.get_or_insert_with(|| fidl::new_empty!(ChargeSource, D));
1345                fidl::decode!(ChargeSource, D, val_ref, decoder, inner_offset, inner_depth)?;
1346                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1347                {
1348                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1349                }
1350                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1351                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1352                }
1353            }
1354
1355            next_offset += envelope_size;
1356            _next_ordinal_to_read += 1;
1357            if next_offset >= end_offset {
1358                return Ok(());
1359            }
1360
1361            // Decode unknown envelopes for gaps in ordinals.
1362            while _next_ordinal_to_read < 4 {
1363                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1364                _next_ordinal_to_read += 1;
1365                next_offset += envelope_size;
1366            }
1367
1368            let next_out_of_line = decoder.next_out_of_line();
1369            let handles_before = decoder.remaining_handles();
1370            if let Some((inlined, num_bytes, num_handles)) =
1371                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1372            {
1373                let member_inline_size =
1374                    <f32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1375                if inlined != (member_inline_size <= 4) {
1376                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1377                }
1378                let inner_offset;
1379                let mut inner_depth = depth.clone();
1380                if inlined {
1381                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1382                    inner_offset = next_offset;
1383                } else {
1384                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1385                    inner_depth.increment()?;
1386                }
1387                let val_ref = self.level_percent.get_or_insert_with(|| fidl::new_empty!(f32, D));
1388                fidl::decode!(f32, D, val_ref, decoder, inner_offset, inner_depth)?;
1389                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1390                {
1391                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1392                }
1393                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1394                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1395                }
1396            }
1397
1398            next_offset += envelope_size;
1399            _next_ordinal_to_read += 1;
1400            if next_offset >= end_offset {
1401                return Ok(());
1402            }
1403
1404            // Decode unknown envelopes for gaps in ordinals.
1405            while _next_ordinal_to_read < 5 {
1406                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1407                _next_ordinal_to_read += 1;
1408                next_offset += envelope_size;
1409            }
1410
1411            let next_out_of_line = decoder.next_out_of_line();
1412            let handles_before = decoder.remaining_handles();
1413            if let Some((inlined, num_bytes, num_handles)) =
1414                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1415            {
1416                let member_inline_size =
1417                    <LevelStatus as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1418                if inlined != (member_inline_size <= 4) {
1419                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1420                }
1421                let inner_offset;
1422                let mut inner_depth = depth.clone();
1423                if inlined {
1424                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1425                    inner_offset = next_offset;
1426                } else {
1427                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1428                    inner_depth.increment()?;
1429                }
1430                let val_ref =
1431                    self.level_status.get_or_insert_with(|| fidl::new_empty!(LevelStatus, D));
1432                fidl::decode!(LevelStatus, D, val_ref, decoder, inner_offset, inner_depth)?;
1433                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1434                {
1435                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1436                }
1437                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1438                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1439                }
1440            }
1441
1442            next_offset += envelope_size;
1443            _next_ordinal_to_read += 1;
1444            if next_offset >= end_offset {
1445                return Ok(());
1446            }
1447
1448            // Decode unknown envelopes for gaps in ordinals.
1449            while _next_ordinal_to_read < 6 {
1450                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1451                _next_ordinal_to_read += 1;
1452                next_offset += envelope_size;
1453            }
1454
1455            let next_out_of_line = decoder.next_out_of_line();
1456            let handles_before = decoder.remaining_handles();
1457            if let Some((inlined, num_bytes, num_handles)) =
1458                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1459            {
1460                let member_inline_size =
1461                    <HealthStatus as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1462                if inlined != (member_inline_size <= 4) {
1463                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1464                }
1465                let inner_offset;
1466                let mut inner_depth = depth.clone();
1467                if inlined {
1468                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1469                    inner_offset = next_offset;
1470                } else {
1471                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1472                    inner_depth.increment()?;
1473                }
1474                let val_ref = self.health.get_or_insert_with(|| fidl::new_empty!(HealthStatus, D));
1475                fidl::decode!(HealthStatus, D, val_ref, decoder, inner_offset, inner_depth)?;
1476                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1477                {
1478                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1479                }
1480                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1481                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1482                }
1483            }
1484
1485            next_offset += envelope_size;
1486            _next_ordinal_to_read += 1;
1487            if next_offset >= end_offset {
1488                return Ok(());
1489            }
1490
1491            // Decode unknown envelopes for gaps in ordinals.
1492            while _next_ordinal_to_read < 7 {
1493                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1494                _next_ordinal_to_read += 1;
1495                next_offset += envelope_size;
1496            }
1497
1498            let next_out_of_line = decoder.next_out_of_line();
1499            let handles_before = decoder.remaining_handles();
1500            if let Some((inlined, num_bytes, num_handles)) =
1501                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1502            {
1503                let member_inline_size =
1504                    <TimeRemaining as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1505                if inlined != (member_inline_size <= 4) {
1506                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1507                }
1508                let inner_offset;
1509                let mut inner_depth = depth.clone();
1510                if inlined {
1511                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1512                    inner_offset = next_offset;
1513                } else {
1514                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1515                    inner_depth.increment()?;
1516                }
1517                let val_ref =
1518                    self.time_remaining.get_or_insert_with(|| fidl::new_empty!(TimeRemaining, D));
1519                fidl::decode!(TimeRemaining, D, val_ref, decoder, inner_offset, inner_depth)?;
1520                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1521                {
1522                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1523                }
1524                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1525                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1526                }
1527            }
1528
1529            next_offset += envelope_size;
1530            _next_ordinal_to_read += 1;
1531            if next_offset >= end_offset {
1532                return Ok(());
1533            }
1534
1535            // Decode unknown envelopes for gaps in ordinals.
1536            while _next_ordinal_to_read < 8 {
1537                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1538                _next_ordinal_to_read += 1;
1539                next_offset += envelope_size;
1540            }
1541
1542            let next_out_of_line = decoder.next_out_of_line();
1543            let handles_before = decoder.remaining_handles();
1544            if let Some((inlined, num_bytes, num_handles)) =
1545                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1546            {
1547                let member_inline_size =
1548                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1549                if inlined != (member_inline_size <= 4) {
1550                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1551                }
1552                let inner_offset;
1553                let mut inner_depth = depth.clone();
1554                if inlined {
1555                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1556                    inner_offset = next_offset;
1557                } else {
1558                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1559                    inner_depth.increment()?;
1560                }
1561                let val_ref = self.timestamp.get_or_insert_with(|| fidl::new_empty!(i64, D));
1562                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1563                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1564                {
1565                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1566                }
1567                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1568                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1569                }
1570            }
1571
1572            next_offset += envelope_size;
1573            _next_ordinal_to_read += 1;
1574            if next_offset >= end_offset {
1575                return Ok(());
1576            }
1577
1578            // Decode unknown envelopes for gaps in ordinals.
1579            while _next_ordinal_to_read < 9 {
1580                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1581                _next_ordinal_to_read += 1;
1582                next_offset += envelope_size;
1583            }
1584
1585            let next_out_of_line = decoder.next_out_of_line();
1586            let handles_before = decoder.remaining_handles();
1587            if let Some((inlined, num_bytes, num_handles)) =
1588                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1589            {
1590                let member_inline_size =
1591                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1592                if inlined != (member_inline_size <= 4) {
1593                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1594                }
1595                let inner_offset;
1596                let mut inner_depth = depth.clone();
1597                if inlined {
1598                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1599                    inner_offset = next_offset;
1600                } else {
1601                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1602                    inner_depth.increment()?;
1603                }
1604                let val_ref =
1605                    self.present_voltage_mv.get_or_insert_with(|| fidl::new_empty!(u32, D));
1606                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1607                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1608                {
1609                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1610                }
1611                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1612                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1613                }
1614            }
1615
1616            next_offset += envelope_size;
1617            _next_ordinal_to_read += 1;
1618            if next_offset >= end_offset {
1619                return Ok(());
1620            }
1621
1622            // Decode unknown envelopes for gaps in ordinals.
1623            while _next_ordinal_to_read < 10 {
1624                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1625                _next_ordinal_to_read += 1;
1626                next_offset += envelope_size;
1627            }
1628
1629            let next_out_of_line = decoder.next_out_of_line();
1630            let handles_before = decoder.remaining_handles();
1631            if let Some((inlined, num_bytes, num_handles)) =
1632                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1633            {
1634                let member_inline_size =
1635                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1636                if inlined != (member_inline_size <= 4) {
1637                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1638                }
1639                let inner_offset;
1640                let mut inner_depth = depth.clone();
1641                if inlined {
1642                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1643                    inner_offset = next_offset;
1644                } else {
1645                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1646                    inner_depth.increment()?;
1647                }
1648                let val_ref =
1649                    self.remaining_capacity_uah.get_or_insert_with(|| fidl::new_empty!(u32, D));
1650                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1651                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1652                {
1653                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1654                }
1655                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1656                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1657                }
1658            }
1659
1660            next_offset += envelope_size;
1661            _next_ordinal_to_read += 1;
1662            if next_offset >= end_offset {
1663                return Ok(());
1664            }
1665
1666            // Decode unknown envelopes for gaps in ordinals.
1667            while _next_ordinal_to_read < 11 {
1668                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1669                _next_ordinal_to_read += 1;
1670                next_offset += envelope_size;
1671            }
1672
1673            let next_out_of_line = decoder.next_out_of_line();
1674            let handles_before = decoder.remaining_handles();
1675            if let Some((inlined, num_bytes, num_handles)) =
1676                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1677            {
1678                let member_inline_size =
1679                    <BatterySpec as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1680                if inlined != (member_inline_size <= 4) {
1681                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1682                }
1683                let inner_offset;
1684                let mut inner_depth = depth.clone();
1685                if inlined {
1686                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1687                    inner_offset = next_offset;
1688                } else {
1689                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1690                    inner_depth.increment()?;
1691                }
1692                let val_ref =
1693                    self.battery_spec.get_or_insert_with(|| fidl::new_empty!(BatterySpec, D));
1694                fidl::decode!(BatterySpec, D, val_ref, decoder, inner_offset, inner_depth)?;
1695                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1696                {
1697                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1698                }
1699                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1700                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1701                }
1702            }
1703
1704            next_offset += envelope_size;
1705            _next_ordinal_to_read += 1;
1706            if next_offset >= end_offset {
1707                return Ok(());
1708            }
1709
1710            // Decode unknown envelopes for gaps in ordinals.
1711            while _next_ordinal_to_read < 12 {
1712                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1713                _next_ordinal_to_read += 1;
1714                next_offset += envelope_size;
1715            }
1716
1717            let next_out_of_line = decoder.next_out_of_line();
1718            let handles_before = decoder.remaining_handles();
1719            if let Some((inlined, num_bytes, num_handles)) =
1720                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1721            {
1722                let member_inline_size =
1723                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1724                if inlined != (member_inline_size <= 4) {
1725                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1726                }
1727                let inner_offset;
1728                let mut inner_depth = depth.clone();
1729                if inlined {
1730                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1731                    inner_offset = next_offset;
1732                } else {
1733                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1734                    inner_depth.increment()?;
1735                }
1736                let val_ref =
1737                    self.full_capacity_uah.get_or_insert_with(|| fidl::new_empty!(i32, D));
1738                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
1739                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1740                {
1741                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1742                }
1743                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1744                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1745                }
1746            }
1747
1748            next_offset += envelope_size;
1749            _next_ordinal_to_read += 1;
1750            if next_offset >= end_offset {
1751                return Ok(());
1752            }
1753
1754            // Decode unknown envelopes for gaps in ordinals.
1755            while _next_ordinal_to_read < 13 {
1756                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1757                _next_ordinal_to_read += 1;
1758                next_offset += envelope_size;
1759            }
1760
1761            let next_out_of_line = decoder.next_out_of_line();
1762            let handles_before = decoder.remaining_handles();
1763            if let Some((inlined, num_bytes, num_handles)) =
1764                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1765            {
1766                let member_inline_size =
1767                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1768                if inlined != (member_inline_size <= 4) {
1769                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1770                }
1771                let inner_offset;
1772                let mut inner_depth = depth.clone();
1773                if inlined {
1774                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1775                    inner_offset = next_offset;
1776                } else {
1777                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1778                    inner_depth.increment()?;
1779                }
1780                let val_ref = self.temperature_mc.get_or_insert_with(|| fidl::new_empty!(i32, D));
1781                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
1782                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1783                {
1784                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1785                }
1786                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1787                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1788                }
1789            }
1790
1791            next_offset += envelope_size;
1792            _next_ordinal_to_read += 1;
1793            if next_offset >= end_offset {
1794                return Ok(());
1795            }
1796
1797            // Decode unknown envelopes for gaps in ordinals.
1798            while _next_ordinal_to_read < 14 {
1799                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1800                _next_ordinal_to_read += 1;
1801                next_offset += envelope_size;
1802            }
1803
1804            let next_out_of_line = decoder.next_out_of_line();
1805            let handles_before = decoder.remaining_handles();
1806            if let Some((inlined, num_bytes, num_handles)) =
1807                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1808            {
1809                let member_inline_size =
1810                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1811                if inlined != (member_inline_size <= 4) {
1812                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1813                }
1814                let inner_offset;
1815                let mut inner_depth = depth.clone();
1816                if inlined {
1817                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1818                    inner_offset = next_offset;
1819                } else {
1820                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1821                    inner_depth.increment()?;
1822                }
1823                let val_ref =
1824                    self.present_current_ma.get_or_insert_with(|| fidl::new_empty!(i32, D));
1825                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
1826                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1827                {
1828                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1829                }
1830                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1831                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1832                }
1833            }
1834
1835            next_offset += envelope_size;
1836            _next_ordinal_to_read += 1;
1837            if next_offset >= end_offset {
1838                return Ok(());
1839            }
1840
1841            // Decode unknown envelopes for gaps in ordinals.
1842            while _next_ordinal_to_read < 15 {
1843                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1844                _next_ordinal_to_read += 1;
1845                next_offset += envelope_size;
1846            }
1847
1848            let next_out_of_line = decoder.next_out_of_line();
1849            let handles_before = decoder.remaining_handles();
1850            if let Some((inlined, num_bytes, num_handles)) =
1851                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1852            {
1853                let member_inline_size =
1854                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1855                if inlined != (member_inline_size <= 4) {
1856                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1857                }
1858                let inner_offset;
1859                let mut inner_depth = depth.clone();
1860                if inlined {
1861                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1862                    inner_offset = next_offset;
1863                } else {
1864                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1865                    inner_depth.increment()?;
1866                }
1867                let val_ref =
1868                    self.average_current_ma.get_or_insert_with(|| fidl::new_empty!(i32, D));
1869                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
1870                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1871                {
1872                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1873                }
1874                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1875                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1876                }
1877            }
1878
1879            next_offset += envelope_size;
1880
1881            // Decode the remaining unknown envelopes.
1882            while next_offset < end_offset {
1883                _next_ordinal_to_read += 1;
1884                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1885                next_offset += envelope_size;
1886            }
1887
1888            Ok(())
1889        }
1890    }
1891
1892    impl BatterySpec {
1893        #[inline(always)]
1894        fn max_ordinal_present(&self) -> u64 {
1895            if let Some(_) = self.design_capacity_uah {
1896                return 3;
1897            }
1898            if let Some(_) = self.max_charging_voltage_uv {
1899                return 2;
1900            }
1901            if let Some(_) = self.max_charging_current_ua {
1902                return 1;
1903            }
1904            0
1905        }
1906    }
1907
1908    impl fidl::encoding::ValueTypeMarker for BatterySpec {
1909        type Borrowed<'a> = &'a Self;
1910        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1911            value
1912        }
1913    }
1914
1915    unsafe impl fidl::encoding::TypeMarker for BatterySpec {
1916        type Owned = Self;
1917
1918        #[inline(always)]
1919        fn inline_align(_context: fidl::encoding::Context) -> usize {
1920            8
1921        }
1922
1923        #[inline(always)]
1924        fn inline_size(_context: fidl::encoding::Context) -> usize {
1925            16
1926        }
1927    }
1928
1929    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<BatterySpec, D>
1930        for &BatterySpec
1931    {
1932        unsafe fn encode(
1933            self,
1934            encoder: &mut fidl::encoding::Encoder<'_, D>,
1935            offset: usize,
1936            mut depth: fidl::encoding::Depth,
1937        ) -> fidl::Result<()> {
1938            encoder.debug_check_bounds::<BatterySpec>(offset);
1939            // Vector header
1940            let max_ordinal: u64 = self.max_ordinal_present();
1941            encoder.write_num(max_ordinal, offset);
1942            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1943            // Calling encoder.out_of_line_offset(0) is not allowed.
1944            if max_ordinal == 0 {
1945                return Ok(());
1946            }
1947            depth.increment()?;
1948            let envelope_size = 8;
1949            let bytes_len = max_ordinal as usize * envelope_size;
1950            #[allow(unused_variables)]
1951            let offset = encoder.out_of_line_offset(bytes_len);
1952            let mut _prev_end_offset: usize = 0;
1953            if 1 > max_ordinal {
1954                return Ok(());
1955            }
1956
1957            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1958            // are envelope_size bytes.
1959            let cur_offset: usize = (1 - 1) * envelope_size;
1960
1961            // Zero reserved fields.
1962            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1963
1964            // Safety:
1965            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1966            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1967            //   envelope_size bytes, there is always sufficient room.
1968            fidl::encoding::encode_in_envelope_optional::<i32, D>(
1969                self.max_charging_current_ua
1970                    .as_ref()
1971                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
1972                encoder,
1973                offset + cur_offset,
1974                depth,
1975            )?;
1976
1977            _prev_end_offset = cur_offset + envelope_size;
1978            if 2 > max_ordinal {
1979                return Ok(());
1980            }
1981
1982            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1983            // are envelope_size bytes.
1984            let cur_offset: usize = (2 - 1) * envelope_size;
1985
1986            // Zero reserved fields.
1987            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1988
1989            // Safety:
1990            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1991            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1992            //   envelope_size bytes, there is always sufficient room.
1993            fidl::encoding::encode_in_envelope_optional::<i32, D>(
1994                self.max_charging_voltage_uv
1995                    .as_ref()
1996                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
1997                encoder,
1998                offset + cur_offset,
1999                depth,
2000            )?;
2001
2002            _prev_end_offset = cur_offset + envelope_size;
2003            if 3 > max_ordinal {
2004                return Ok(());
2005            }
2006
2007            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2008            // are envelope_size bytes.
2009            let cur_offset: usize = (3 - 1) * envelope_size;
2010
2011            // Zero reserved fields.
2012            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2013
2014            // Safety:
2015            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2016            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2017            //   envelope_size bytes, there is always sufficient room.
2018            fidl::encoding::encode_in_envelope_optional::<i32, D>(
2019                self.design_capacity_uah
2020                    .as_ref()
2021                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
2022                encoder,
2023                offset + cur_offset,
2024                depth,
2025            )?;
2026
2027            _prev_end_offset = cur_offset + envelope_size;
2028
2029            Ok(())
2030        }
2031    }
2032
2033    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for BatterySpec {
2034        #[inline(always)]
2035        fn new_empty() -> Self {
2036            Self::default()
2037        }
2038
2039        unsafe fn decode(
2040            &mut self,
2041            decoder: &mut fidl::encoding::Decoder<'_, D>,
2042            offset: usize,
2043            mut depth: fidl::encoding::Depth,
2044        ) -> fidl::Result<()> {
2045            decoder.debug_check_bounds::<Self>(offset);
2046            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2047                None => return Err(fidl::Error::NotNullable),
2048                Some(len) => len,
2049            };
2050            // Calling decoder.out_of_line_offset(0) is not allowed.
2051            if len == 0 {
2052                return Ok(());
2053            };
2054            depth.increment()?;
2055            let envelope_size = 8;
2056            let bytes_len = len * envelope_size;
2057            let offset = decoder.out_of_line_offset(bytes_len)?;
2058            // Decode the envelope for each type.
2059            let mut _next_ordinal_to_read = 0;
2060            let mut next_offset = offset;
2061            let end_offset = offset + bytes_len;
2062            _next_ordinal_to_read += 1;
2063            if next_offset >= end_offset {
2064                return Ok(());
2065            }
2066
2067            // Decode unknown envelopes for gaps in ordinals.
2068            while _next_ordinal_to_read < 1 {
2069                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2070                _next_ordinal_to_read += 1;
2071                next_offset += envelope_size;
2072            }
2073
2074            let next_out_of_line = decoder.next_out_of_line();
2075            let handles_before = decoder.remaining_handles();
2076            if let Some((inlined, num_bytes, num_handles)) =
2077                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2078            {
2079                let member_inline_size =
2080                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2081                if inlined != (member_inline_size <= 4) {
2082                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2083                }
2084                let inner_offset;
2085                let mut inner_depth = depth.clone();
2086                if inlined {
2087                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2088                    inner_offset = next_offset;
2089                } else {
2090                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2091                    inner_depth.increment()?;
2092                }
2093                let val_ref =
2094                    self.max_charging_current_ua.get_or_insert_with(|| fidl::new_empty!(i32, D));
2095                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
2096                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2097                {
2098                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2099                }
2100                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2101                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2102                }
2103            }
2104
2105            next_offset += envelope_size;
2106            _next_ordinal_to_read += 1;
2107            if next_offset >= end_offset {
2108                return Ok(());
2109            }
2110
2111            // Decode unknown envelopes for gaps in ordinals.
2112            while _next_ordinal_to_read < 2 {
2113                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2114                _next_ordinal_to_read += 1;
2115                next_offset += envelope_size;
2116            }
2117
2118            let next_out_of_line = decoder.next_out_of_line();
2119            let handles_before = decoder.remaining_handles();
2120            if let Some((inlined, num_bytes, num_handles)) =
2121                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2122            {
2123                let member_inline_size =
2124                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2125                if inlined != (member_inline_size <= 4) {
2126                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2127                }
2128                let inner_offset;
2129                let mut inner_depth = depth.clone();
2130                if inlined {
2131                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2132                    inner_offset = next_offset;
2133                } else {
2134                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2135                    inner_depth.increment()?;
2136                }
2137                let val_ref =
2138                    self.max_charging_voltage_uv.get_or_insert_with(|| fidl::new_empty!(i32, D));
2139                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
2140                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2141                {
2142                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2143                }
2144                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2145                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2146                }
2147            }
2148
2149            next_offset += envelope_size;
2150            _next_ordinal_to_read += 1;
2151            if next_offset >= end_offset {
2152                return Ok(());
2153            }
2154
2155            // Decode unknown envelopes for gaps in ordinals.
2156            while _next_ordinal_to_read < 3 {
2157                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2158                _next_ordinal_to_read += 1;
2159                next_offset += envelope_size;
2160            }
2161
2162            let next_out_of_line = decoder.next_out_of_line();
2163            let handles_before = decoder.remaining_handles();
2164            if let Some((inlined, num_bytes, num_handles)) =
2165                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2166            {
2167                let member_inline_size =
2168                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2169                if inlined != (member_inline_size <= 4) {
2170                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2171                }
2172                let inner_offset;
2173                let mut inner_depth = depth.clone();
2174                if inlined {
2175                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2176                    inner_offset = next_offset;
2177                } else {
2178                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2179                    inner_depth.increment()?;
2180                }
2181                let val_ref =
2182                    self.design_capacity_uah.get_or_insert_with(|| fidl::new_empty!(i32, D));
2183                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
2184                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2185                {
2186                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2187                }
2188                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2189                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2190                }
2191            }
2192
2193            next_offset += envelope_size;
2194
2195            // Decode the remaining unknown envelopes.
2196            while next_offset < end_offset {
2197                _next_ordinal_to_read += 1;
2198                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2199                next_offset += envelope_size;
2200            }
2201
2202            Ok(())
2203        }
2204    }
2205
2206    impl fidl::encoding::ValueTypeMarker for TimeRemaining {
2207        type Borrowed<'a> = &'a Self;
2208        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2209            value
2210        }
2211    }
2212
2213    unsafe impl fidl::encoding::TypeMarker for TimeRemaining {
2214        type Owned = Self;
2215
2216        #[inline(always)]
2217        fn inline_align(_context: fidl::encoding::Context) -> usize {
2218            8
2219        }
2220
2221        #[inline(always)]
2222        fn inline_size(_context: fidl::encoding::Context) -> usize {
2223            16
2224        }
2225    }
2226
2227    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<TimeRemaining, D>
2228        for &TimeRemaining
2229    {
2230        #[inline]
2231        unsafe fn encode(
2232            self,
2233            encoder: &mut fidl::encoding::Encoder<'_, D>,
2234            offset: usize,
2235            _depth: fidl::encoding::Depth,
2236        ) -> fidl::Result<()> {
2237            encoder.debug_check_bounds::<TimeRemaining>(offset);
2238            encoder.write_num::<u64>(self.ordinal(), offset);
2239            match self {
2240                TimeRemaining::Indeterminate(ref val) => {
2241                    fidl::encoding::encode_in_envelope::<i64, D>(
2242                        <i64 as fidl::encoding::ValueTypeMarker>::borrow(val),
2243                        encoder,
2244                        offset + 8,
2245                        _depth,
2246                    )
2247                }
2248                TimeRemaining::BatteryLife(ref val) => {
2249                    fidl::encoding::encode_in_envelope::<i64, D>(
2250                        <i64 as fidl::encoding::ValueTypeMarker>::borrow(val),
2251                        encoder,
2252                        offset + 8,
2253                        _depth,
2254                    )
2255                }
2256                TimeRemaining::FullCharge(ref val) => fidl::encoding::encode_in_envelope::<i64, D>(
2257                    <i64 as fidl::encoding::ValueTypeMarker>::borrow(val),
2258                    encoder,
2259                    offset + 8,
2260                    _depth,
2261                ),
2262                TimeRemaining::__SourceBreaking { .. } => Err(fidl::Error::UnknownUnionTag),
2263            }
2264        }
2265    }
2266
2267    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for TimeRemaining {
2268        #[inline(always)]
2269        fn new_empty() -> Self {
2270            Self::__SourceBreaking { unknown_ordinal: 0 }
2271        }
2272
2273        #[inline]
2274        unsafe fn decode(
2275            &mut self,
2276            decoder: &mut fidl::encoding::Decoder<'_, D>,
2277            offset: usize,
2278            mut depth: fidl::encoding::Depth,
2279        ) -> fidl::Result<()> {
2280            decoder.debug_check_bounds::<Self>(offset);
2281            #[allow(unused_variables)]
2282            let next_out_of_line = decoder.next_out_of_line();
2283            let handles_before = decoder.remaining_handles();
2284            let (ordinal, inlined, num_bytes, num_handles) =
2285                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
2286
2287            let member_inline_size = match ordinal {
2288                1 => <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2289                2 => <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2290                3 => <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2291                0 => return Err(fidl::Error::UnknownUnionTag),
2292                _ => num_bytes as usize,
2293            };
2294
2295            if inlined != (member_inline_size <= 4) {
2296                return Err(fidl::Error::InvalidInlineBitInEnvelope);
2297            }
2298            let _inner_offset;
2299            if inlined {
2300                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
2301                _inner_offset = offset + 8;
2302            } else {
2303                depth.increment()?;
2304                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2305            }
2306            match ordinal {
2307                1 => {
2308                    #[allow(irrefutable_let_patterns)]
2309                    if let TimeRemaining::Indeterminate(_) = self {
2310                        // Do nothing, read the value into the object
2311                    } else {
2312                        // Initialize `self` to the right variant
2313                        *self = TimeRemaining::Indeterminate(fidl::new_empty!(i64, D));
2314                    }
2315                    #[allow(irrefutable_let_patterns)]
2316                    if let TimeRemaining::Indeterminate(ref mut val) = self {
2317                        fidl::decode!(i64, D, val, decoder, _inner_offset, depth)?;
2318                    } else {
2319                        unreachable!()
2320                    }
2321                }
2322                2 => {
2323                    #[allow(irrefutable_let_patterns)]
2324                    if let TimeRemaining::BatteryLife(_) = self {
2325                        // Do nothing, read the value into the object
2326                    } else {
2327                        // Initialize `self` to the right variant
2328                        *self = TimeRemaining::BatteryLife(fidl::new_empty!(i64, D));
2329                    }
2330                    #[allow(irrefutable_let_patterns)]
2331                    if let TimeRemaining::BatteryLife(ref mut val) = self {
2332                        fidl::decode!(i64, D, val, decoder, _inner_offset, depth)?;
2333                    } else {
2334                        unreachable!()
2335                    }
2336                }
2337                3 => {
2338                    #[allow(irrefutable_let_patterns)]
2339                    if let TimeRemaining::FullCharge(_) = self {
2340                        // Do nothing, read the value into the object
2341                    } else {
2342                        // Initialize `self` to the right variant
2343                        *self = TimeRemaining::FullCharge(fidl::new_empty!(i64, D));
2344                    }
2345                    #[allow(irrefutable_let_patterns)]
2346                    if let TimeRemaining::FullCharge(ref mut val) = self {
2347                        fidl::decode!(i64, D, val, decoder, _inner_offset, depth)?;
2348                    } else {
2349                        unreachable!()
2350                    }
2351                }
2352                #[allow(deprecated)]
2353                ordinal => {
2354                    for _ in 0..num_handles {
2355                        decoder.drop_next_handle()?;
2356                    }
2357                    *self = TimeRemaining::__SourceBreaking { unknown_ordinal: ordinal };
2358                }
2359            }
2360            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
2361                return Err(fidl::Error::InvalidNumBytesInEnvelope);
2362            }
2363            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2364                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2365            }
2366            Ok(())
2367        }
2368    }
2369}