Skip to main content

fidl_fuchsia_hardware_power_charger_common/
fidl_fuchsia_hardware_power_charger_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/// Describes the active charging phase of the charger hardware.
12///
13/// Lithium-ion battery charging typically transitions across distinct stages:
14/// Pre-conditioning/Trickle -> Constant Current (Fast) -> Constant Voltage (Taper) -> Top-off ->
15/// Done.
16#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
17pub enum ChargePhase {
18    /// The charger is idle, off, or not supplying charging power to the battery (including during
19    /// passthrough, bypass, or charge-inhibit mode).
20    None,
21    /// Pre-qualification / trickle charging phase.
22    /// Used when the battery is deeply depleted below the pre-charge voltage threshold; current is
23    /// limited to a small, safe level to restore cell voltage before fast charge.
24    Trickle,
25    /// Constant Current (CC) fast charging phase.
26    /// The charger acts as a regulated current source supplying maximum programmed fast charge
27    /// current.
28    Fast,
29    /// Constant Voltage (CV) taper phase.
30    /// The battery voltage has reached the regulation target limit; current naturally tapers down
31    /// as the cell saturates.
32    Taper,
33    /// Top-off charging phase.
34    /// Low-current charging stage right after the CV termination threshold is reached, providing a
35    /// timed saturation before stopping.
36    TopOff,
37    /// Charge termination complete.
38    /// The charger has completed its charging cycle (e.g. top-off timer or termination-current
39    /// threshold reached) and has cut off charge current to the battery while continuing to supply
40    /// system load. The charger may automatically re-enter `FAST` if battery voltage decays below
41    /// the recharge threshold.
42    Done,
43    #[doc(hidden)]
44    __SourceBreaking { unknown_ordinal: u32 },
45}
46
47/// Pattern that matches an unknown `ChargePhase` member.
48#[macro_export]
49macro_rules! ChargePhaseUnknown {
50    () => {
51        _
52    };
53}
54
55impl ChargePhase {
56    #[inline]
57    pub fn from_primitive(prim: u32) -> Option<Self> {
58        match prim {
59            1 => Some(Self::None),
60            2 => Some(Self::Trickle),
61            3 => Some(Self::Fast),
62            4 => Some(Self::Taper),
63            5 => Some(Self::TopOff),
64            6 => Some(Self::Done),
65            _ => None,
66        }
67    }
68
69    #[inline]
70    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
71        match prim {
72            1 => Self::None,
73            2 => Self::Trickle,
74            3 => Self::Fast,
75            4 => Self::Taper,
76            5 => Self::TopOff,
77            6 => Self::Done,
78            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
79        }
80    }
81
82    #[inline]
83    pub fn unknown() -> Self {
84        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
85    }
86
87    #[inline]
88    pub const fn into_primitive(self) -> u32 {
89        match self {
90            Self::None => 1,
91            Self::Trickle => 2,
92            Self::Fast => 3,
93            Self::Taper => 4,
94            Self::TopOff => 5,
95            Self::Done => 6,
96            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
97        }
98    }
99
100    #[inline]
101    pub fn is_unknown(&self) -> bool {
102        match self {
103            Self::__SourceBreaking { unknown_ordinal: _ } => true,
104            _ => false,
105        }
106    }
107}
108
109/// Errors returned by the charger protocols.
110#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
111pub enum Error {
112    /// An unexpected error occurred within the driver.
113    Internal,
114    /// The requested operation, field, or mode is not supported by this hardware.
115    NotSupported,
116    /// One or more arguments provided to the method were invalid, or a requested value lies outside
117    /// the range the hardware can program.
118    InvalidArgs,
119    /// Communication with the charger hardware failed (e.g. a bus transfer error).
120    Io,
121    /// A `Watch` call is already pending on this connection.
122    AlreadyWatching,
123    #[doc(hidden)]
124    __SourceBreaking { unknown_ordinal: u32 },
125}
126
127/// Pattern that matches an unknown `Error` member.
128#[macro_export]
129macro_rules! ErrorUnknown {
130    () => {
131        _
132    };
133}
134
135impl Error {
136    #[inline]
137    pub fn from_primitive(prim: u32) -> Option<Self> {
138        match prim {
139            1 => Some(Self::Internal),
140            2 => Some(Self::NotSupported),
141            3 => Some(Self::InvalidArgs),
142            4 => Some(Self::Io),
143            5 => Some(Self::AlreadyWatching),
144            _ => None,
145        }
146    }
147
148    #[inline]
149    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
150        match prim {
151            1 => Self::Internal,
152            2 => Self::NotSupported,
153            3 => Self::InvalidArgs,
154            4 => Self::Io,
155            5 => Self::AlreadyWatching,
156            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
157        }
158    }
159
160    #[inline]
161    pub fn unknown() -> Self {
162        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
163    }
164
165    #[inline]
166    pub const fn into_primitive(self) -> u32 {
167        match self {
168            Self::Internal => 1,
169            Self::NotSupported => 2,
170            Self::InvalidArgs => 3,
171            Self::Io => 4,
172            Self::AlreadyWatching => 5,
173            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
174        }
175    }
176
177    #[inline]
178    pub fn is_unknown(&self) -> bool {
179        match self {
180            Self::__SourceBreaking { unknown_ordinal: _ } => true,
181            _ => false,
182        }
183    }
184}
185
186/// Hardware health and fault conditions of the charging converter.
187#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
188pub enum Health {
189    /// Normal operation; no faults or converter thermal throttling detected.
190    Good,
191    /// Input voltage on the charger supply rail exceeds the over-voltage lockout (OVLO) limit.
192    InputOverVoltage,
193    /// Input voltage on the charger supply rail fell below the under-voltage lockout (UVLO)
194    /// operational floor.
195    InputUnderVoltage,
196    /// Internal charger die temperature reached the thermal regulation (TREG) threshold; the
197    /// converter is still operating but actively folding back current to limit die heating.
198    ThermalWarning,
199    /// Internal charger die or input connector temperature exceeded thermal shutdown (TSHDN)
200    /// protection limits and the converter has suspended operation.
201    ThermalShutdown,
202    /// Hardware charge safety timer expired before reaching the target charge state.
203    SafetyTimerExpired,
204    /// Voltage sensed at the charger output rail exceeded the converter's over-voltage threshold.
205    BatteryOverVoltage,
206    /// Hardware watchdog timer expired (`WDT`), suspending converter operation.
207    WatchdogTimerExpired,
208    /// Unspecified charger hardware fault.
209    UnspecifiedFailure,
210    #[doc(hidden)]
211    __SourceBreaking { unknown_ordinal: u32 },
212}
213
214/// Pattern that matches an unknown `Health` member.
215#[macro_export]
216macro_rules! HealthUnknown {
217    () => {
218        _
219    };
220}
221
222impl Health {
223    #[inline]
224    pub fn from_primitive(prim: u32) -> Option<Self> {
225        match prim {
226            1 => Some(Self::Good),
227            2 => Some(Self::InputOverVoltage),
228            3 => Some(Self::InputUnderVoltage),
229            4 => Some(Self::ThermalWarning),
230            5 => Some(Self::ThermalShutdown),
231            6 => Some(Self::SafetyTimerExpired),
232            7 => Some(Self::BatteryOverVoltage),
233            8 => Some(Self::WatchdogTimerExpired),
234            9 => Some(Self::UnspecifiedFailure),
235            _ => None,
236        }
237    }
238
239    #[inline]
240    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
241        match prim {
242            1 => Self::Good,
243            2 => Self::InputOverVoltage,
244            3 => Self::InputUnderVoltage,
245            4 => Self::ThermalWarning,
246            5 => Self::ThermalShutdown,
247            6 => Self::SafetyTimerExpired,
248            7 => Self::BatteryOverVoltage,
249            8 => Self::WatchdogTimerExpired,
250            9 => Self::UnspecifiedFailure,
251            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
252        }
253    }
254
255    #[inline]
256    pub fn unknown() -> Self {
257        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
258    }
259
260    #[inline]
261    pub const fn into_primitive(self) -> u32 {
262        match self {
263            Self::Good => 1,
264            Self::InputOverVoltage => 2,
265            Self::InputUnderVoltage => 3,
266            Self::ThermalWarning => 4,
267            Self::ThermalShutdown => 5,
268            Self::SafetyTimerExpired => 6,
269            Self::BatteryOverVoltage => 7,
270            Self::WatchdogTimerExpired => 8,
271            Self::UnspecifiedFailure => 9,
272            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
273        }
274    }
275
276    #[inline]
277    pub fn is_unknown(&self) -> bool {
278        match self {
279            Self::__SourceBreaking { unknown_ordinal: _ } => true,
280            _ => false,
281        }
282    }
283}
284
285/// Describes the primary power converter operating state across the power path and battery
286/// interface.
287///
288/// Reported as state in `Status` and requested as a target in `ControlOptions`. A requested mode
289/// selects the converter configuration; the state subsequently reported also accounts for whether
290/// external power is actually present, so a charger left in `CHARGING` reports `DISCHARGING` once
291/// the input goes away.
292#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
293pub enum OperatingMode {
294    /// Normal operation: External power supplies system rails and charges the battery.
295    /// Requesting this mode resumes normal charging after `PASSTHROUGH` or `DISCHARGING`.
296    Charging,
297    /// Inhibit charge / passthrough: External power supplies system rails, but battery charging is
298    /// disabled (cell rests at current state of charge).
299    Passthrough,
300    /// As a request: force discharge. External power draw is suspended; the system runs
301    /// exclusively on battery while external communication (e.g. USB data) remains active.
302    ///
303    /// As reported state: the battery is supplying the system, either because discharge was
304    /// requested or because no external power is present. Use `Status.online` to tell these
305    /// apart. A configured `PASSTHROUGH` is not separately observable while offline.
306    Discharging,
307    /// OTG / Reverse Boost: Power is sourced outward from the battery to the external port.
308    Otg,
309    #[doc(hidden)]
310    __SourceBreaking { unknown_ordinal: u32 },
311}
312
313/// Pattern that matches an unknown `OperatingMode` member.
314#[macro_export]
315macro_rules! OperatingModeUnknown {
316    () => {
317        _
318    };
319}
320
321impl OperatingMode {
322    #[inline]
323    pub fn from_primitive(prim: u32) -> Option<Self> {
324        match prim {
325            1 => Some(Self::Charging),
326            2 => Some(Self::Passthrough),
327            3 => Some(Self::Discharging),
328            4 => Some(Self::Otg),
329            _ => None,
330        }
331    }
332
333    #[inline]
334    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
335        match prim {
336            1 => Self::Charging,
337            2 => Self::Passthrough,
338            3 => Self::Discharging,
339            4 => Self::Otg,
340            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
341        }
342    }
343
344    #[inline]
345    pub fn unknown() -> Self {
346        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
347    }
348
349    #[inline]
350    pub const fn into_primitive(self) -> u32 {
351        match self {
352            Self::Charging => 1,
353            Self::Passthrough => 2,
354            Self::Discharging => 3,
355            Self::Otg => 4,
356            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
357        }
358    }
359
360    #[inline]
361    pub fn is_unknown(&self) -> bool {
362        match self {
363            Self::__SourceBreaking { unknown_ordinal: _ } => true,
364            _ => false,
365        }
366    }
367}
368
369/// Describes the external power source type feeding the charger.
370#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
371pub enum SourceType {
372    /// Standard wall-plug adapter or dedicated charger (e.g. BC1.2 DCP).
373    Ac,
374    /// Standard USB host or charging downstream port (e.g. BC1.2 SDP / CDP).
375    Usb,
376    /// Inductive or magnetic resonance wireless charging pad (e.g. WCIN / Qi).
377    Wireless,
378    #[doc(hidden)]
379    __SourceBreaking { unknown_ordinal: u32 },
380}
381
382/// Pattern that matches an unknown `SourceType` member.
383#[macro_export]
384macro_rules! SourceTypeUnknown {
385    () => {
386        _
387    };
388}
389
390impl SourceType {
391    #[inline]
392    pub fn from_primitive(prim: u32) -> Option<Self> {
393        match prim {
394            1 => Some(Self::Ac),
395            2 => Some(Self::Usb),
396            3 => Some(Self::Wireless),
397            _ => None,
398        }
399    }
400
401    #[inline]
402    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
403        match prim {
404            1 => Self::Ac,
405            2 => Self::Usb,
406            3 => Self::Wireless,
407            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
408        }
409    }
410
411    #[inline]
412    pub fn unknown() -> Self {
413        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
414    }
415
416    #[inline]
417    pub const fn into_primitive(self) -> u32 {
418        match self {
419            Self::Ac => 1,
420            Self::Usb => 2,
421            Self::Wireless => 3,
422            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
423        }
424    }
425
426    #[inline]
427    pub fn is_unknown(&self) -> bool {
428        match self {
429            Self::__SourceBreaking { unknown_ordinal: _ } => true,
430            _ => false,
431        }
432    }
433}
434
435#[derive(Clone, Debug, PartialEq)]
436pub struct ChargerConfigureWatchRequest {
437    pub options: WatchOptions,
438}
439
440impl fidl::Persistable for ChargerConfigureWatchRequest {}
441
442#[derive(Clone, Debug, PartialEq)]
443pub struct ChargerConfigureWatchResponse {
444    pub effective_options: WatchOptions,
445}
446
447impl fidl::Persistable for ChargerConfigureWatchResponse {}
448
449#[derive(Clone, Debug, PartialEq)]
450pub struct ChargerGetSpecResponse {
451    pub spec: Spec,
452}
453
454impl fidl::Persistable for ChargerGetSpecResponse {}
455
456#[derive(Clone, Debug, PartialEq)]
457pub struct ChargerGetStatusResponse {
458    pub status: Status,
459}
460
461impl fidl::Persistable for ChargerGetStatusResponse {}
462
463#[derive(Clone, Debug, PartialEq)]
464pub struct ControllerClearControlRequest {
465    pub options: ControlOptions,
466}
467
468impl fidl::Persistable for ControllerClearControlRequest {}
469
470#[derive(Clone, Debug, PartialEq)]
471pub struct ControllerSetControlRequest {
472    pub options: ControlOptions,
473}
474
475impl fidl::Persistable for ControllerSetControlRequest {}
476
477/// Operational and electrical constraints applicable to the charger converter.
478///
479/// This is a partial update: only the fields present are applied, and any omitted field leaves the
480/// corresponding hardware setting unchanged. While the `Controller` connection remains open, to
481/// relax or withdraw a previously applied limit, set the field again to the desired value, call
482/// [`Controller.ClearControl`] with a mask of fields to withdraw, or close the `Controller`
483/// channel to withdraw all constraints and restore driver defaults.
484///
485/// When a value falls between discrete hardware steps, or when votes from several clients conflict,
486/// less charging is preferred. Lower values charge less, except for `charge_term_current_ua` and
487/// `input_voltage_limit_uv`, where higher values do.
488#[derive(Clone, Debug, Default, PartialEq)]
489pub struct ControlOptions {
490    /// Desired operational mode of the power converter.
491    pub operating_mode: Option<OperatingMode>,
492    /// Input current limit (ICL), in microamps.
493    pub input_current_limit_ua: Option<u32>,
494    /// Fast charge current (FCC) limit for the battery, in microamps.
495    pub charge_current_limit_ua: Option<u32>,
496    /// Float (CV) regulation voltage for the battery, in microvolts (bounded by
497    /// `Spec.max_charge_voltage_uv`). Note that writing a float voltage target may cause the
498    /// hardware charge state machine to exit `ChargePhase::TOP_OFF` and re-evaluate CV regulation.
499    pub float_voltage_uv: Option<u32>,
500    /// Charge termination (top-off / taper cutoff) current threshold, in microamps: when the charge
501    /// current falls to it, the charger ends constant-voltage charging.
502    pub charge_term_current_ua: Option<u32>,
503    /// Input voltage regulation floor (VINDPM), in microvolts, below which the converter throttles
504    /// input current draw to prevent source collapse.
505    pub input_voltage_limit_uv: Option<u32>,
506    /// How long the charger stays in `ChargePhase::TOP_OFF`, after the charge current falls below
507    /// the termination threshold, before it enters `ChargePhase::DONE`.
508    pub top_off_duration: Option<i64>,
509    #[doc(hidden)]
510    pub __source_breaking: fidl::marker::SourceBreaking,
511}
512
513impl fidl::Persistable for ControlOptions {}
514
515/// Static hardware characteristics and driver capabilities.
516#[derive(Clone, Debug, Default, PartialEq)]
517pub struct Spec {
518    /// Optional. Maximum current the charger hardware can supply to the battery, in microamps.
519    /// Omitted if unsupported by hardware.
520    pub max_charge_current_ua: Option<u32>,
521    /// Optional. Maximum voltage the charger hardware can regulate across the battery, in
522    /// microvolts.
523    /// Omitted if unsupported by hardware.
524    pub max_charge_voltage_uv: Option<u32>,
525    /// Optional. Maximum input current the charger input power path can draw, in microamps.
526    /// Omitted if unsupported by hardware.
527    pub max_input_current_ua: Option<u32>,
528    /// Optional. Informational charger model string or manufacturer part number.
529    /// Omitted if unknown or unprogrammed in hardware.
530    pub model: Option<String>,
531    /// Optional. List of operating modes supported by this charger hardware implementation.
532    /// Omitted if unsupported or unconfigurable by hardware.
533    pub supported_modes: Option<Vec<OperatingMode>>,
534    /// Required. The interest and wake options supported by this driver/hardware.
535    ///
536    /// Drivers must populate this table so clients know which fields support active change
537    /// notifications. If omitted by the driver, clients should assume no active interrupt watching
538    /// is supported.
539    ///
540    /// - `supported_options.interest`: Telemetry fields that can actively trigger hanging-get watch
541    ///   notifications on change. Fields omitted are passive measurements that do not generate
542    ///   hardware interrupts; their freshest values are returned during active state changes or via
543    ///   [`Charger.GetStatus`].
544    /// - `supported_options.wake_on`: Telemetry fields capable of actively waking the system from
545    ///   suspend via hardware interrupt lines etc.
546    /// - `supported_options.max_interval`: Present if the server supports periodic sampling; its
547    ///   value is the shortest interval the server will honor.
548    /// - `supported_options.wake_on_max_interval`: True if the server can wake the system from
549    ///   suspend to take a `max_interval` sample.
550    pub supported_options: Option<WatchOptions>,
551    /// Optional. Trickle/precharge current supplied when battery voltage is below the fast-charge
552    /// threshold, in microamps.
553    /// Omitted if unsupported by hardware.
554    pub precharge_current_ua: Option<u32>,
555    /// Optional. Default or minimum charge termination (top-off / taper cutoff) current threshold,
556    /// in microamps.
557    /// Omitted if unsupported by hardware.
558    pub charge_term_current_ua: Option<u32>,
559    /// Optional. Battery voltage threshold (or drop below float voltage) at which the charger
560    /// automatically initiates a recharge cycle after reaching `ChargePhase::DONE`, in microvolts.
561    /// Omitted if unsupported by hardware.
562    pub recharge_voltage_uv: Option<u32>,
563    /// Optional. Minimum programmable input voltage regulation floor (VINDPM), in microvolts.
564    /// Omitted if unsupported by hardware.
565    pub min_input_voltage_uv: Option<u32>,
566    /// Optional. Maximum programmable input voltage regulation floor (VINDPM), in microvolts.
567    /// Omitted if unsupported by hardware.
568    pub max_input_voltage_uv: Option<u32>,
569    #[doc(hidden)]
570    pub __source_breaking: fidl::marker::SourceBreaking,
571}
572
573impl fidl::Persistable for Spec {}
574
575/// Primary telemetry snapshot of the charging regulator and its power inputs.
576#[derive(Clone, Debug, Default, PartialEq)]
577pub struct Status {
578    /// Whether an external power supply or adapter (e.g. VBUS / USB-C / wireless)
579    /// is physically attached and supplying valid power.
580    /// If false, no external source is detected. Omitted if attachment status is indeterminate.
581    pub online: Option<bool>,
582    /// The measured input voltage from the external power source in microvolts.
583    /// Omitted if unsupported by hardware or unavailable.
584    pub input_voltage_uv: Option<u32>,
585    /// The measured input current drawn from the external power source in microamps.
586    /// Positive (+) indicates current drawn into the charger from the external power source;
587    /// negative (-) indicates current sourced outward to the external port (e.g. during
588    /// `OperatingMode::OTG` reverse boost, if the hardware senses reverse port current).
589    /// Omitted if unsupported by hardware or unavailable.
590    pub input_current_ua: Option<i32>,
591    /// Active operational mode of the power converter and battery interface.
592    /// Omitted if indeterminate or unsupported by hardware.
593    pub operating_mode: Option<OperatingMode>,
594    /// Current charging phase.
595    /// Omitted if indeterminate or unsupported by hardware.
596    pub charge_phase: Option<ChargePhase>,
597    /// Active Input Current Limit (ICL) programmed into the input power path, in microamps.
598    /// Represents the maximum current the charger is permitted to draw from the external input.
599    /// Omitted if indeterminate or unsupported by hardware.
600    pub input_current_limit_ua: Option<u32>,
601    /// Active Fast Charge Current (FCC) regulation limit programmed for the battery, in microamps.
602    /// Represents the target constant-current delivered to the battery terminals during fast charge.
603    /// Omitted if indeterminate or unsupported by hardware.
604    pub charge_current_limit_ua: Option<u32>,
605    /// Active float (constant voltage / CV) regulation target programmed for the battery, in
606    /// microvolts. Represents the maximum terminal voltage across the battery pack (as distinct
607    /// from the static hardware ceiling `Spec.max_charge_voltage_uv`).
608    /// Omitted if indeterminate or unsupported by hardware.
609    pub float_voltage_uv: Option<u32>,
610    /// The detected external power supply type feeding the charger.
611    /// Omitted if indeterminate or disconnected.
612    pub source_type: Option<SourceType>,
613    /// Hardware health and fault condition of the charging converter.
614    /// Omitted if indeterminate or unsupported by hardware.
615    pub health: Option<Health>,
616    /// Active charge termination (top-off / taper cutoff) current threshold programmed into the
617    /// charger, in microamps.
618    /// Omitted if indeterminate or unsupported by hardware.
619    pub charge_term_current_ua: Option<u32>,
620    /// Active minimum input voltage regulation floor (VINDPM) programmed into the input power
621    /// path, in microvolts.
622    /// Omitted if indeterminate or unsupported by hardware.
623    pub input_voltage_limit_uv: Option<u32>,
624    /// Active top-off duration programmed into the charger: how long it stays in
625    /// `ChargePhase::TOP_OFF` before entering `ChargePhase::DONE`.
626    /// Omitted if indeterminate or unsupported by hardware.
627    pub top_off_duration: Option<i64>,
628    #[doc(hidden)]
629    pub __source_breaking: fidl::marker::SourceBreaking,
630}
631
632impl fidl::Persistable for Status {}
633
634/// Configuration options for charger state watching.
635///
636/// `interest` and `wake_on` are optional masks: the actual field values within the `Status` table
637/// are ignored; only field presence (set vs. unset) determines the mask.
638///
639/// An absent mask means "use this field's default"; a present but empty mask means "no fields".
640/// The two defaults differ because the safe choice differs: `interest` defaults to everything the
641/// driver supports watching, so a client that never configures anything still makes progress,
642/// while `wake_on` defaults to nothing, since waking the system is a cost a client must opt into.
643#[derive(Clone, Debug, Default, PartialEq)]
644pub struct WatchOptions {
645    /// Fields the client wants to receive change notifications for.
646    /// Defaults to every field the driver supports watching, as reported by
647    /// `Spec.supported_options`. Pass an explicitly empty table to be notified only for the
648    /// fields named in `wake_on`.
649    pub interest: Option<Status>,
650    /// Fields that should actively wake the system from suspend.
651    /// Any field present in `wake_on` is implicitly included in `interest`.
652    /// Defaults to no fields: changes occurring during suspend are deferred until the next system
653    /// wakeup and do not wake the device.
654    pub wake_on: Option<Status>,
655    /// Maximum time between `Watch` responses. When set, the server completes a pending `Watch`
656    /// with a freshly sampled `Status` once this much time has passed since the previous response,
657    /// even if no field in `interest` changed.
658    /// The time is measured on the boot timeline, so time spent suspended counts towards it.
659    /// Defaults to absent: `Watch` only completes on changes.
660    /// Servers that do not support periodic sampling omit this field from the effective options
661    /// returned by `ConfigureWatch` and from `Spec.supported_options`. Servers may clamp the value,
662    /// and report the interval they will honor in the effective options.
663    /// Samples do not wake the system from suspend unless `wake_on_max_interval` is set: a sample
664    /// that falls due while the system is suspended is taken once the system resumes.
665    pub max_interval: Option<i64>,
666    /// Whether a `max_interval` sample that falls due while the system is suspended wakes the
667    /// system. Defaults to false; like `wake_on`, waking the system is a cost the client opts into.
668    /// Ignored if `max_interval` is absent.
669    /// Servers that cannot wake the system omit this field from the effective options returned by
670    /// `ConfigureWatch` and from `Spec.supported_options`.
671    pub wake_on_max_interval: Option<bool>,
672    #[doc(hidden)]
673    pub __source_breaking: fidl::marker::SourceBreaking,
674}
675
676impl fidl::Persistable for WatchOptions {}
677
678pub mod charger_ordinals {
679    pub const GET_SPEC: u64 = 0x4f1a5fc6df415db3;
680    pub const GET_STATUS: u64 = 0x3c67651b7ec14d5e;
681    pub const CONFIGURE_WATCH: u64 = 0x739a314e3494d695;
682    pub const WATCH: u64 = 0x5a52d95d33d7c66e;
683}
684
685pub mod controller_ordinals {
686    pub const SET_CONTROL: u64 = 0x363a64b0c8d45594;
687    pub const CLEAR_CONTROL: u64 = 0x2b2a45d9fa0cd3c1;
688}
689
690pub mod debug_ordinals {
691    pub const SET_CONTROL: u64 = 0x363a64b0c8d45594;
692    pub const CLEAR_CONTROL: u64 = 0x2b2a45d9fa0cd3c1;
693}
694
695mod internal {
696    use super::*;
697    unsafe impl fidl::encoding::TypeMarker for ChargePhase {
698        type Owned = Self;
699
700        #[inline(always)]
701        fn inline_align(_context: fidl::encoding::Context) -> usize {
702            std::mem::align_of::<u32>()
703        }
704
705        #[inline(always)]
706        fn inline_size(_context: fidl::encoding::Context) -> usize {
707            std::mem::size_of::<u32>()
708        }
709
710        #[inline(always)]
711        fn encode_is_copy() -> bool {
712            false
713        }
714
715        #[inline(always)]
716        fn decode_is_copy() -> bool {
717            false
718        }
719    }
720
721    impl fidl::encoding::ValueTypeMarker for ChargePhase {
722        type Borrowed<'a> = Self;
723        #[inline(always)]
724        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
725            *value
726        }
727    }
728
729    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for ChargePhase {
730        #[inline]
731        unsafe fn encode(
732            self,
733            encoder: &mut fidl::encoding::Encoder<'_, D>,
734            offset: usize,
735            _depth: fidl::encoding::Depth,
736        ) -> fidl::Result<()> {
737            encoder.debug_check_bounds::<Self>(offset);
738            encoder.write_num(self.into_primitive(), offset);
739            Ok(())
740        }
741    }
742
743    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ChargePhase {
744        #[inline(always)]
745        fn new_empty() -> Self {
746            Self::unknown()
747        }
748
749        #[inline]
750        unsafe fn decode(
751            &mut self,
752            decoder: &mut fidl::encoding::Decoder<'_, D>,
753            offset: usize,
754            _depth: fidl::encoding::Depth,
755        ) -> fidl::Result<()> {
756            decoder.debug_check_bounds::<Self>(offset);
757            let prim = decoder.read_num::<u32>(offset);
758
759            *self = Self::from_primitive_allow_unknown(prim);
760            Ok(())
761        }
762    }
763    unsafe impl fidl::encoding::TypeMarker for Error {
764        type Owned = Self;
765
766        #[inline(always)]
767        fn inline_align(_context: fidl::encoding::Context) -> usize {
768            std::mem::align_of::<u32>()
769        }
770
771        #[inline(always)]
772        fn inline_size(_context: fidl::encoding::Context) -> usize {
773            std::mem::size_of::<u32>()
774        }
775
776        #[inline(always)]
777        fn encode_is_copy() -> bool {
778            false
779        }
780
781        #[inline(always)]
782        fn decode_is_copy() -> bool {
783            false
784        }
785    }
786
787    impl fidl::encoding::ValueTypeMarker for Error {
788        type Borrowed<'a> = Self;
789        #[inline(always)]
790        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
791            *value
792        }
793    }
794
795    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for Error {
796        #[inline]
797        unsafe fn encode(
798            self,
799            encoder: &mut fidl::encoding::Encoder<'_, D>,
800            offset: usize,
801            _depth: fidl::encoding::Depth,
802        ) -> fidl::Result<()> {
803            encoder.debug_check_bounds::<Self>(offset);
804            encoder.write_num(self.into_primitive(), offset);
805            Ok(())
806        }
807    }
808
809    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Error {
810        #[inline(always)]
811        fn new_empty() -> Self {
812            Self::unknown()
813        }
814
815        #[inline]
816        unsafe fn decode(
817            &mut self,
818            decoder: &mut fidl::encoding::Decoder<'_, D>,
819            offset: usize,
820            _depth: fidl::encoding::Depth,
821        ) -> fidl::Result<()> {
822            decoder.debug_check_bounds::<Self>(offset);
823            let prim = decoder.read_num::<u32>(offset);
824
825            *self = Self::from_primitive_allow_unknown(prim);
826            Ok(())
827        }
828    }
829    unsafe impl fidl::encoding::TypeMarker for Health {
830        type Owned = Self;
831
832        #[inline(always)]
833        fn inline_align(_context: fidl::encoding::Context) -> usize {
834            std::mem::align_of::<u32>()
835        }
836
837        #[inline(always)]
838        fn inline_size(_context: fidl::encoding::Context) -> usize {
839            std::mem::size_of::<u32>()
840        }
841
842        #[inline(always)]
843        fn encode_is_copy() -> bool {
844            false
845        }
846
847        #[inline(always)]
848        fn decode_is_copy() -> bool {
849            false
850        }
851    }
852
853    impl fidl::encoding::ValueTypeMarker for Health {
854        type Borrowed<'a> = Self;
855        #[inline(always)]
856        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
857            *value
858        }
859    }
860
861    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for Health {
862        #[inline]
863        unsafe fn encode(
864            self,
865            encoder: &mut fidl::encoding::Encoder<'_, D>,
866            offset: usize,
867            _depth: fidl::encoding::Depth,
868        ) -> fidl::Result<()> {
869            encoder.debug_check_bounds::<Self>(offset);
870            encoder.write_num(self.into_primitive(), offset);
871            Ok(())
872        }
873    }
874
875    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Health {
876        #[inline(always)]
877        fn new_empty() -> Self {
878            Self::unknown()
879        }
880
881        #[inline]
882        unsafe fn decode(
883            &mut self,
884            decoder: &mut fidl::encoding::Decoder<'_, D>,
885            offset: usize,
886            _depth: fidl::encoding::Depth,
887        ) -> fidl::Result<()> {
888            decoder.debug_check_bounds::<Self>(offset);
889            let prim = decoder.read_num::<u32>(offset);
890
891            *self = Self::from_primitive_allow_unknown(prim);
892            Ok(())
893        }
894    }
895    unsafe impl fidl::encoding::TypeMarker for OperatingMode {
896        type Owned = Self;
897
898        #[inline(always)]
899        fn inline_align(_context: fidl::encoding::Context) -> usize {
900            std::mem::align_of::<u32>()
901        }
902
903        #[inline(always)]
904        fn inline_size(_context: fidl::encoding::Context) -> usize {
905            std::mem::size_of::<u32>()
906        }
907
908        #[inline(always)]
909        fn encode_is_copy() -> bool {
910            false
911        }
912
913        #[inline(always)]
914        fn decode_is_copy() -> bool {
915            false
916        }
917    }
918
919    impl fidl::encoding::ValueTypeMarker for OperatingMode {
920        type Borrowed<'a> = Self;
921        #[inline(always)]
922        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
923            *value
924        }
925    }
926
927    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for OperatingMode {
928        #[inline]
929        unsafe fn encode(
930            self,
931            encoder: &mut fidl::encoding::Encoder<'_, D>,
932            offset: usize,
933            _depth: fidl::encoding::Depth,
934        ) -> fidl::Result<()> {
935            encoder.debug_check_bounds::<Self>(offset);
936            encoder.write_num(self.into_primitive(), offset);
937            Ok(())
938        }
939    }
940
941    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for OperatingMode {
942        #[inline(always)]
943        fn new_empty() -> Self {
944            Self::unknown()
945        }
946
947        #[inline]
948        unsafe fn decode(
949            &mut self,
950            decoder: &mut fidl::encoding::Decoder<'_, D>,
951            offset: usize,
952            _depth: fidl::encoding::Depth,
953        ) -> fidl::Result<()> {
954            decoder.debug_check_bounds::<Self>(offset);
955            let prim = decoder.read_num::<u32>(offset);
956
957            *self = Self::from_primitive_allow_unknown(prim);
958            Ok(())
959        }
960    }
961    unsafe impl fidl::encoding::TypeMarker for SourceType {
962        type Owned = Self;
963
964        #[inline(always)]
965        fn inline_align(_context: fidl::encoding::Context) -> usize {
966            std::mem::align_of::<u32>()
967        }
968
969        #[inline(always)]
970        fn inline_size(_context: fidl::encoding::Context) -> usize {
971            std::mem::size_of::<u32>()
972        }
973
974        #[inline(always)]
975        fn encode_is_copy() -> bool {
976            false
977        }
978
979        #[inline(always)]
980        fn decode_is_copy() -> bool {
981            false
982        }
983    }
984
985    impl fidl::encoding::ValueTypeMarker for SourceType {
986        type Borrowed<'a> = Self;
987        #[inline(always)]
988        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
989            *value
990        }
991    }
992
993    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for SourceType {
994        #[inline]
995        unsafe fn encode(
996            self,
997            encoder: &mut fidl::encoding::Encoder<'_, D>,
998            offset: usize,
999            _depth: fidl::encoding::Depth,
1000        ) -> fidl::Result<()> {
1001            encoder.debug_check_bounds::<Self>(offset);
1002            encoder.write_num(self.into_primitive(), offset);
1003            Ok(())
1004        }
1005    }
1006
1007    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SourceType {
1008        #[inline(always)]
1009        fn new_empty() -> Self {
1010            Self::unknown()
1011        }
1012
1013        #[inline]
1014        unsafe fn decode(
1015            &mut self,
1016            decoder: &mut fidl::encoding::Decoder<'_, D>,
1017            offset: usize,
1018            _depth: fidl::encoding::Depth,
1019        ) -> fidl::Result<()> {
1020            decoder.debug_check_bounds::<Self>(offset);
1021            let prim = decoder.read_num::<u32>(offset);
1022
1023            *self = Self::from_primitive_allow_unknown(prim);
1024            Ok(())
1025        }
1026    }
1027
1028    impl fidl::encoding::ValueTypeMarker for ChargerConfigureWatchRequest {
1029        type Borrowed<'a> = &'a Self;
1030        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1031            value
1032        }
1033    }
1034
1035    unsafe impl fidl::encoding::TypeMarker for ChargerConfigureWatchRequest {
1036        type Owned = Self;
1037
1038        #[inline(always)]
1039        fn inline_align(_context: fidl::encoding::Context) -> usize {
1040            8
1041        }
1042
1043        #[inline(always)]
1044        fn inline_size(_context: fidl::encoding::Context) -> usize {
1045            16
1046        }
1047    }
1048
1049    unsafe impl<D: fidl::encoding::ResourceDialect>
1050        fidl::encoding::Encode<ChargerConfigureWatchRequest, D> for &ChargerConfigureWatchRequest
1051    {
1052        #[inline]
1053        unsafe fn encode(
1054            self,
1055            encoder: &mut fidl::encoding::Encoder<'_, D>,
1056            offset: usize,
1057            _depth: fidl::encoding::Depth,
1058        ) -> fidl::Result<()> {
1059            encoder.debug_check_bounds::<ChargerConfigureWatchRequest>(offset);
1060            // Delegate to tuple encoding.
1061            fidl::encoding::Encode::<ChargerConfigureWatchRequest, D>::encode(
1062                (<WatchOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
1063                encoder,
1064                offset,
1065                _depth,
1066            )
1067        }
1068    }
1069    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<WatchOptions, D>>
1070        fidl::encoding::Encode<ChargerConfigureWatchRequest, D> for (T0,)
1071    {
1072        #[inline]
1073        unsafe fn encode(
1074            self,
1075            encoder: &mut fidl::encoding::Encoder<'_, D>,
1076            offset: usize,
1077            depth: fidl::encoding::Depth,
1078        ) -> fidl::Result<()> {
1079            encoder.debug_check_bounds::<ChargerConfigureWatchRequest>(offset);
1080            // Zero out padding regions. There's no need to apply masks
1081            // because the unmasked parts will be overwritten by fields.
1082            // Write the fields.
1083            self.0.encode(encoder, offset + 0, depth)?;
1084            Ok(())
1085        }
1086    }
1087
1088    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1089        for ChargerConfigureWatchRequest
1090    {
1091        #[inline(always)]
1092        fn new_empty() -> Self {
1093            Self { options: fidl::new_empty!(WatchOptions, D) }
1094        }
1095
1096        #[inline]
1097        unsafe fn decode(
1098            &mut self,
1099            decoder: &mut fidl::encoding::Decoder<'_, D>,
1100            offset: usize,
1101            _depth: fidl::encoding::Depth,
1102        ) -> fidl::Result<()> {
1103            decoder.debug_check_bounds::<Self>(offset);
1104            // Verify that padding bytes are zero.
1105            fidl::decode!(WatchOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
1106            Ok(())
1107        }
1108    }
1109
1110    impl fidl::encoding::ValueTypeMarker for ChargerConfigureWatchResponse {
1111        type Borrowed<'a> = &'a Self;
1112        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1113            value
1114        }
1115    }
1116
1117    unsafe impl fidl::encoding::TypeMarker for ChargerConfigureWatchResponse {
1118        type Owned = Self;
1119
1120        #[inline(always)]
1121        fn inline_align(_context: fidl::encoding::Context) -> usize {
1122            8
1123        }
1124
1125        #[inline(always)]
1126        fn inline_size(_context: fidl::encoding::Context) -> usize {
1127            16
1128        }
1129    }
1130
1131    unsafe impl<D: fidl::encoding::ResourceDialect>
1132        fidl::encoding::Encode<ChargerConfigureWatchResponse, D>
1133        for &ChargerConfigureWatchResponse
1134    {
1135        #[inline]
1136        unsafe fn encode(
1137            self,
1138            encoder: &mut fidl::encoding::Encoder<'_, D>,
1139            offset: usize,
1140            _depth: fidl::encoding::Depth,
1141        ) -> fidl::Result<()> {
1142            encoder.debug_check_bounds::<ChargerConfigureWatchResponse>(offset);
1143            // Delegate to tuple encoding.
1144            fidl::encoding::Encode::<ChargerConfigureWatchResponse, D>::encode(
1145                (<WatchOptions as fidl::encoding::ValueTypeMarker>::borrow(
1146                    &self.effective_options,
1147                ),),
1148                encoder,
1149                offset,
1150                _depth,
1151            )
1152        }
1153    }
1154    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<WatchOptions, D>>
1155        fidl::encoding::Encode<ChargerConfigureWatchResponse, D> for (T0,)
1156    {
1157        #[inline]
1158        unsafe fn encode(
1159            self,
1160            encoder: &mut fidl::encoding::Encoder<'_, D>,
1161            offset: usize,
1162            depth: fidl::encoding::Depth,
1163        ) -> fidl::Result<()> {
1164            encoder.debug_check_bounds::<ChargerConfigureWatchResponse>(offset);
1165            // Zero out padding regions. There's no need to apply masks
1166            // because the unmasked parts will be overwritten by fields.
1167            // Write the fields.
1168            self.0.encode(encoder, offset + 0, depth)?;
1169            Ok(())
1170        }
1171    }
1172
1173    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1174        for ChargerConfigureWatchResponse
1175    {
1176        #[inline(always)]
1177        fn new_empty() -> Self {
1178            Self { effective_options: fidl::new_empty!(WatchOptions, D) }
1179        }
1180
1181        #[inline]
1182        unsafe fn decode(
1183            &mut self,
1184            decoder: &mut fidl::encoding::Decoder<'_, D>,
1185            offset: usize,
1186            _depth: fidl::encoding::Depth,
1187        ) -> fidl::Result<()> {
1188            decoder.debug_check_bounds::<Self>(offset);
1189            // Verify that padding bytes are zero.
1190            fidl::decode!(
1191                WatchOptions,
1192                D,
1193                &mut self.effective_options,
1194                decoder,
1195                offset + 0,
1196                _depth
1197            )?;
1198            Ok(())
1199        }
1200    }
1201
1202    impl fidl::encoding::ValueTypeMarker for ChargerGetSpecResponse {
1203        type Borrowed<'a> = &'a Self;
1204        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1205            value
1206        }
1207    }
1208
1209    unsafe impl fidl::encoding::TypeMarker for ChargerGetSpecResponse {
1210        type Owned = Self;
1211
1212        #[inline(always)]
1213        fn inline_align(_context: fidl::encoding::Context) -> usize {
1214            8
1215        }
1216
1217        #[inline(always)]
1218        fn inline_size(_context: fidl::encoding::Context) -> usize {
1219            16
1220        }
1221    }
1222
1223    unsafe impl<D: fidl::encoding::ResourceDialect>
1224        fidl::encoding::Encode<ChargerGetSpecResponse, D> for &ChargerGetSpecResponse
1225    {
1226        #[inline]
1227        unsafe fn encode(
1228            self,
1229            encoder: &mut fidl::encoding::Encoder<'_, D>,
1230            offset: usize,
1231            _depth: fidl::encoding::Depth,
1232        ) -> fidl::Result<()> {
1233            encoder.debug_check_bounds::<ChargerGetSpecResponse>(offset);
1234            // Delegate to tuple encoding.
1235            fidl::encoding::Encode::<ChargerGetSpecResponse, D>::encode(
1236                (<Spec as fidl::encoding::ValueTypeMarker>::borrow(&self.spec),),
1237                encoder,
1238                offset,
1239                _depth,
1240            )
1241        }
1242    }
1243    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<Spec, D>>
1244        fidl::encoding::Encode<ChargerGetSpecResponse, D> for (T0,)
1245    {
1246        #[inline]
1247        unsafe fn encode(
1248            self,
1249            encoder: &mut fidl::encoding::Encoder<'_, D>,
1250            offset: usize,
1251            depth: fidl::encoding::Depth,
1252        ) -> fidl::Result<()> {
1253            encoder.debug_check_bounds::<ChargerGetSpecResponse>(offset);
1254            // Zero out padding regions. There's no need to apply masks
1255            // because the unmasked parts will be overwritten by fields.
1256            // Write the fields.
1257            self.0.encode(encoder, offset + 0, depth)?;
1258            Ok(())
1259        }
1260    }
1261
1262    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1263        for ChargerGetSpecResponse
1264    {
1265        #[inline(always)]
1266        fn new_empty() -> Self {
1267            Self { spec: fidl::new_empty!(Spec, D) }
1268        }
1269
1270        #[inline]
1271        unsafe fn decode(
1272            &mut self,
1273            decoder: &mut fidl::encoding::Decoder<'_, D>,
1274            offset: usize,
1275            _depth: fidl::encoding::Depth,
1276        ) -> fidl::Result<()> {
1277            decoder.debug_check_bounds::<Self>(offset);
1278            // Verify that padding bytes are zero.
1279            fidl::decode!(Spec, D, &mut self.spec, decoder, offset + 0, _depth)?;
1280            Ok(())
1281        }
1282    }
1283
1284    impl fidl::encoding::ValueTypeMarker for ChargerGetStatusResponse {
1285        type Borrowed<'a> = &'a Self;
1286        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1287            value
1288        }
1289    }
1290
1291    unsafe impl fidl::encoding::TypeMarker for ChargerGetStatusResponse {
1292        type Owned = Self;
1293
1294        #[inline(always)]
1295        fn inline_align(_context: fidl::encoding::Context) -> usize {
1296            8
1297        }
1298
1299        #[inline(always)]
1300        fn inline_size(_context: fidl::encoding::Context) -> usize {
1301            16
1302        }
1303    }
1304
1305    unsafe impl<D: fidl::encoding::ResourceDialect>
1306        fidl::encoding::Encode<ChargerGetStatusResponse, D> for &ChargerGetStatusResponse
1307    {
1308        #[inline]
1309        unsafe fn encode(
1310            self,
1311            encoder: &mut fidl::encoding::Encoder<'_, D>,
1312            offset: usize,
1313            _depth: fidl::encoding::Depth,
1314        ) -> fidl::Result<()> {
1315            encoder.debug_check_bounds::<ChargerGetStatusResponse>(offset);
1316            // Delegate to tuple encoding.
1317            fidl::encoding::Encode::<ChargerGetStatusResponse, D>::encode(
1318                (<Status as fidl::encoding::ValueTypeMarker>::borrow(&self.status),),
1319                encoder,
1320                offset,
1321                _depth,
1322            )
1323        }
1324    }
1325    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<Status, D>>
1326        fidl::encoding::Encode<ChargerGetStatusResponse, D> for (T0,)
1327    {
1328        #[inline]
1329        unsafe fn encode(
1330            self,
1331            encoder: &mut fidl::encoding::Encoder<'_, D>,
1332            offset: usize,
1333            depth: fidl::encoding::Depth,
1334        ) -> fidl::Result<()> {
1335            encoder.debug_check_bounds::<ChargerGetStatusResponse>(offset);
1336            // Zero out padding regions. There's no need to apply masks
1337            // because the unmasked parts will be overwritten by fields.
1338            // Write the fields.
1339            self.0.encode(encoder, offset + 0, depth)?;
1340            Ok(())
1341        }
1342    }
1343
1344    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1345        for ChargerGetStatusResponse
1346    {
1347        #[inline(always)]
1348        fn new_empty() -> Self {
1349            Self { status: fidl::new_empty!(Status, D) }
1350        }
1351
1352        #[inline]
1353        unsafe fn decode(
1354            &mut self,
1355            decoder: &mut fidl::encoding::Decoder<'_, D>,
1356            offset: usize,
1357            _depth: fidl::encoding::Depth,
1358        ) -> fidl::Result<()> {
1359            decoder.debug_check_bounds::<Self>(offset);
1360            // Verify that padding bytes are zero.
1361            fidl::decode!(Status, D, &mut self.status, decoder, offset + 0, _depth)?;
1362            Ok(())
1363        }
1364    }
1365
1366    impl fidl::encoding::ValueTypeMarker for ControllerClearControlRequest {
1367        type Borrowed<'a> = &'a Self;
1368        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1369            value
1370        }
1371    }
1372
1373    unsafe impl fidl::encoding::TypeMarker for ControllerClearControlRequest {
1374        type Owned = Self;
1375
1376        #[inline(always)]
1377        fn inline_align(_context: fidl::encoding::Context) -> usize {
1378            8
1379        }
1380
1381        #[inline(always)]
1382        fn inline_size(_context: fidl::encoding::Context) -> usize {
1383            16
1384        }
1385    }
1386
1387    unsafe impl<D: fidl::encoding::ResourceDialect>
1388        fidl::encoding::Encode<ControllerClearControlRequest, D>
1389        for &ControllerClearControlRequest
1390    {
1391        #[inline]
1392        unsafe fn encode(
1393            self,
1394            encoder: &mut fidl::encoding::Encoder<'_, D>,
1395            offset: usize,
1396            _depth: fidl::encoding::Depth,
1397        ) -> fidl::Result<()> {
1398            encoder.debug_check_bounds::<ControllerClearControlRequest>(offset);
1399            // Delegate to tuple encoding.
1400            fidl::encoding::Encode::<ControllerClearControlRequest, D>::encode(
1401                (<ControlOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
1402                encoder,
1403                offset,
1404                _depth,
1405            )
1406        }
1407    }
1408    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<ControlOptions, D>>
1409        fidl::encoding::Encode<ControllerClearControlRequest, D> for (T0,)
1410    {
1411        #[inline]
1412        unsafe fn encode(
1413            self,
1414            encoder: &mut fidl::encoding::Encoder<'_, D>,
1415            offset: usize,
1416            depth: fidl::encoding::Depth,
1417        ) -> fidl::Result<()> {
1418            encoder.debug_check_bounds::<ControllerClearControlRequest>(offset);
1419            // Zero out padding regions. There's no need to apply masks
1420            // because the unmasked parts will be overwritten by fields.
1421            // Write the fields.
1422            self.0.encode(encoder, offset + 0, depth)?;
1423            Ok(())
1424        }
1425    }
1426
1427    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1428        for ControllerClearControlRequest
1429    {
1430        #[inline(always)]
1431        fn new_empty() -> Self {
1432            Self { options: fidl::new_empty!(ControlOptions, D) }
1433        }
1434
1435        #[inline]
1436        unsafe fn decode(
1437            &mut self,
1438            decoder: &mut fidl::encoding::Decoder<'_, D>,
1439            offset: usize,
1440            _depth: fidl::encoding::Depth,
1441        ) -> fidl::Result<()> {
1442            decoder.debug_check_bounds::<Self>(offset);
1443            // Verify that padding bytes are zero.
1444            fidl::decode!(ControlOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
1445            Ok(())
1446        }
1447    }
1448
1449    impl fidl::encoding::ValueTypeMarker for ControllerSetControlRequest {
1450        type Borrowed<'a> = &'a Self;
1451        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1452            value
1453        }
1454    }
1455
1456    unsafe impl fidl::encoding::TypeMarker for ControllerSetControlRequest {
1457        type Owned = Self;
1458
1459        #[inline(always)]
1460        fn inline_align(_context: fidl::encoding::Context) -> usize {
1461            8
1462        }
1463
1464        #[inline(always)]
1465        fn inline_size(_context: fidl::encoding::Context) -> usize {
1466            16
1467        }
1468    }
1469
1470    unsafe impl<D: fidl::encoding::ResourceDialect>
1471        fidl::encoding::Encode<ControllerSetControlRequest, D> for &ControllerSetControlRequest
1472    {
1473        #[inline]
1474        unsafe fn encode(
1475            self,
1476            encoder: &mut fidl::encoding::Encoder<'_, D>,
1477            offset: usize,
1478            _depth: fidl::encoding::Depth,
1479        ) -> fidl::Result<()> {
1480            encoder.debug_check_bounds::<ControllerSetControlRequest>(offset);
1481            // Delegate to tuple encoding.
1482            fidl::encoding::Encode::<ControllerSetControlRequest, D>::encode(
1483                (<ControlOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),),
1484                encoder,
1485                offset,
1486                _depth,
1487            )
1488        }
1489    }
1490    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<ControlOptions, D>>
1491        fidl::encoding::Encode<ControllerSetControlRequest, D> for (T0,)
1492    {
1493        #[inline]
1494        unsafe fn encode(
1495            self,
1496            encoder: &mut fidl::encoding::Encoder<'_, D>,
1497            offset: usize,
1498            depth: fidl::encoding::Depth,
1499        ) -> fidl::Result<()> {
1500            encoder.debug_check_bounds::<ControllerSetControlRequest>(offset);
1501            // Zero out padding regions. There's no need to apply masks
1502            // because the unmasked parts will be overwritten by fields.
1503            // Write the fields.
1504            self.0.encode(encoder, offset + 0, depth)?;
1505            Ok(())
1506        }
1507    }
1508
1509    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1510        for ControllerSetControlRequest
1511    {
1512        #[inline(always)]
1513        fn new_empty() -> Self {
1514            Self { options: fidl::new_empty!(ControlOptions, D) }
1515        }
1516
1517        #[inline]
1518        unsafe fn decode(
1519            &mut self,
1520            decoder: &mut fidl::encoding::Decoder<'_, D>,
1521            offset: usize,
1522            _depth: fidl::encoding::Depth,
1523        ) -> fidl::Result<()> {
1524            decoder.debug_check_bounds::<Self>(offset);
1525            // Verify that padding bytes are zero.
1526            fidl::decode!(ControlOptions, D, &mut self.options, decoder, offset + 0, _depth)?;
1527            Ok(())
1528        }
1529    }
1530
1531    impl ControlOptions {
1532        #[inline(always)]
1533        fn max_ordinal_present(&self) -> u64 {
1534            if let Some(_) = self.top_off_duration {
1535                return 7;
1536            }
1537            if let Some(_) = self.input_voltage_limit_uv {
1538                return 6;
1539            }
1540            if let Some(_) = self.charge_term_current_ua {
1541                return 5;
1542            }
1543            if let Some(_) = self.float_voltage_uv {
1544                return 4;
1545            }
1546            if let Some(_) = self.charge_current_limit_ua {
1547                return 3;
1548            }
1549            if let Some(_) = self.input_current_limit_ua {
1550                return 2;
1551            }
1552            if let Some(_) = self.operating_mode {
1553                return 1;
1554            }
1555            0
1556        }
1557    }
1558
1559    impl fidl::encoding::ValueTypeMarker for ControlOptions {
1560        type Borrowed<'a> = &'a Self;
1561        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1562            value
1563        }
1564    }
1565
1566    unsafe impl fidl::encoding::TypeMarker for ControlOptions {
1567        type Owned = Self;
1568
1569        #[inline(always)]
1570        fn inline_align(_context: fidl::encoding::Context) -> usize {
1571            8
1572        }
1573
1574        #[inline(always)]
1575        fn inline_size(_context: fidl::encoding::Context) -> usize {
1576            16
1577        }
1578    }
1579
1580    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ControlOptions, D>
1581        for &ControlOptions
1582    {
1583        unsafe fn encode(
1584            self,
1585            encoder: &mut fidl::encoding::Encoder<'_, D>,
1586            offset: usize,
1587            mut depth: fidl::encoding::Depth,
1588        ) -> fidl::Result<()> {
1589            encoder.debug_check_bounds::<ControlOptions>(offset);
1590            // Vector header
1591            let max_ordinal: u64 = self.max_ordinal_present();
1592            encoder.write_num(max_ordinal, offset);
1593            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1594            // Calling encoder.out_of_line_offset(0) is not allowed.
1595            if max_ordinal == 0 {
1596                return Ok(());
1597            }
1598            depth.increment()?;
1599            let envelope_size = 8;
1600            let bytes_len = max_ordinal as usize * envelope_size;
1601            #[allow(unused_variables)]
1602            let offset = encoder.out_of_line_offset(bytes_len);
1603            let mut _prev_end_offset: usize = 0;
1604            if 1 > max_ordinal {
1605                return Ok(());
1606            }
1607
1608            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1609            // are envelope_size bytes.
1610            let cur_offset: usize = (1 - 1) * envelope_size;
1611
1612            // Zero reserved fields.
1613            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1614
1615            // Safety:
1616            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1617            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1618            //   envelope_size bytes, there is always sufficient room.
1619            fidl::encoding::encode_in_envelope_optional::<OperatingMode, D>(
1620                self.operating_mode
1621                    .as_ref()
1622                    .map(<OperatingMode as fidl::encoding::ValueTypeMarker>::borrow),
1623                encoder,
1624                offset + cur_offset,
1625                depth,
1626            )?;
1627
1628            _prev_end_offset = cur_offset + envelope_size;
1629            if 2 > max_ordinal {
1630                return Ok(());
1631            }
1632
1633            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1634            // are envelope_size bytes.
1635            let cur_offset: usize = (2 - 1) * envelope_size;
1636
1637            // Zero reserved fields.
1638            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1639
1640            // Safety:
1641            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1642            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1643            //   envelope_size bytes, there is always sufficient room.
1644            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1645                self.input_current_limit_ua
1646                    .as_ref()
1647                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1648                encoder,
1649                offset + cur_offset,
1650                depth,
1651            )?;
1652
1653            _prev_end_offset = cur_offset + envelope_size;
1654            if 3 > max_ordinal {
1655                return Ok(());
1656            }
1657
1658            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1659            // are envelope_size bytes.
1660            let cur_offset: usize = (3 - 1) * envelope_size;
1661
1662            // Zero reserved fields.
1663            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1664
1665            // Safety:
1666            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1667            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1668            //   envelope_size bytes, there is always sufficient room.
1669            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1670                self.charge_current_limit_ua
1671                    .as_ref()
1672                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1673                encoder,
1674                offset + cur_offset,
1675                depth,
1676            )?;
1677
1678            _prev_end_offset = cur_offset + envelope_size;
1679            if 4 > max_ordinal {
1680                return Ok(());
1681            }
1682
1683            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1684            // are envelope_size bytes.
1685            let cur_offset: usize = (4 - 1) * envelope_size;
1686
1687            // Zero reserved fields.
1688            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1689
1690            // Safety:
1691            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1692            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1693            //   envelope_size bytes, there is always sufficient room.
1694            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1695                self.float_voltage_uv
1696                    .as_ref()
1697                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1698                encoder,
1699                offset + cur_offset,
1700                depth,
1701            )?;
1702
1703            _prev_end_offset = cur_offset + envelope_size;
1704            if 5 > max_ordinal {
1705                return Ok(());
1706            }
1707
1708            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1709            // are envelope_size bytes.
1710            let cur_offset: usize = (5 - 1) * envelope_size;
1711
1712            // Zero reserved fields.
1713            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1714
1715            // Safety:
1716            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1717            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1718            //   envelope_size bytes, there is always sufficient room.
1719            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1720                self.charge_term_current_ua
1721                    .as_ref()
1722                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1723                encoder,
1724                offset + cur_offset,
1725                depth,
1726            )?;
1727
1728            _prev_end_offset = cur_offset + envelope_size;
1729            if 6 > max_ordinal {
1730                return Ok(());
1731            }
1732
1733            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1734            // are envelope_size bytes.
1735            let cur_offset: usize = (6 - 1) * envelope_size;
1736
1737            // Zero reserved fields.
1738            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1739
1740            // Safety:
1741            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1742            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1743            //   envelope_size bytes, there is always sufficient room.
1744            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1745                self.input_voltage_limit_uv
1746                    .as_ref()
1747                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1748                encoder,
1749                offset + cur_offset,
1750                depth,
1751            )?;
1752
1753            _prev_end_offset = cur_offset + envelope_size;
1754            if 7 > max_ordinal {
1755                return Ok(());
1756            }
1757
1758            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1759            // are envelope_size bytes.
1760            let cur_offset: usize = (7 - 1) * envelope_size;
1761
1762            // Zero reserved fields.
1763            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1764
1765            // Safety:
1766            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1767            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1768            //   envelope_size bytes, there is always sufficient room.
1769            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1770                self.top_off_duration
1771                    .as_ref()
1772                    .map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1773                encoder,
1774                offset + cur_offset,
1775                depth,
1776            )?;
1777
1778            _prev_end_offset = cur_offset + envelope_size;
1779
1780            Ok(())
1781        }
1782    }
1783
1784    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ControlOptions {
1785        #[inline(always)]
1786        fn new_empty() -> Self {
1787            Self::default()
1788        }
1789
1790        unsafe fn decode(
1791            &mut self,
1792            decoder: &mut fidl::encoding::Decoder<'_, D>,
1793            offset: usize,
1794            mut depth: fidl::encoding::Depth,
1795        ) -> fidl::Result<()> {
1796            decoder.debug_check_bounds::<Self>(offset);
1797            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1798                None => return Err(fidl::Error::NotNullable),
1799                Some(len) => len,
1800            };
1801            // Calling decoder.out_of_line_offset(0) is not allowed.
1802            if len == 0 {
1803                return Ok(());
1804            };
1805            depth.increment()?;
1806            let envelope_size = 8;
1807            let bytes_len = len * envelope_size;
1808            let offset = decoder.out_of_line_offset(bytes_len)?;
1809            // Decode the envelope for each type.
1810            let mut _next_ordinal_to_read = 0;
1811            let mut next_offset = offset;
1812            let end_offset = offset + bytes_len;
1813            _next_ordinal_to_read += 1;
1814            if next_offset >= end_offset {
1815                return Ok(());
1816            }
1817
1818            // Decode unknown envelopes for gaps in ordinals.
1819            while _next_ordinal_to_read < 1 {
1820                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1821                _next_ordinal_to_read += 1;
1822                next_offset += envelope_size;
1823            }
1824
1825            let next_out_of_line = decoder.next_out_of_line();
1826            let handles_before = decoder.remaining_handles();
1827            if let Some((inlined, num_bytes, num_handles)) =
1828                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1829            {
1830                let member_inline_size =
1831                    <OperatingMode as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1832                if inlined != (member_inline_size <= 4) {
1833                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1834                }
1835                let inner_offset;
1836                let mut inner_depth = depth.clone();
1837                if inlined {
1838                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1839                    inner_offset = next_offset;
1840                } else {
1841                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1842                    inner_depth.increment()?;
1843                }
1844                let val_ref =
1845                    self.operating_mode.get_or_insert_with(|| fidl::new_empty!(OperatingMode, D));
1846                fidl::decode!(OperatingMode, D, val_ref, decoder, inner_offset, inner_depth)?;
1847                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1848                {
1849                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1850                }
1851                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1852                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1853                }
1854            }
1855
1856            next_offset += envelope_size;
1857            _next_ordinal_to_read += 1;
1858            if next_offset >= end_offset {
1859                return Ok(());
1860            }
1861
1862            // Decode unknown envelopes for gaps in ordinals.
1863            while _next_ordinal_to_read < 2 {
1864                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1865                _next_ordinal_to_read += 1;
1866                next_offset += envelope_size;
1867            }
1868
1869            let next_out_of_line = decoder.next_out_of_line();
1870            let handles_before = decoder.remaining_handles();
1871            if let Some((inlined, num_bytes, num_handles)) =
1872                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1873            {
1874                let member_inline_size =
1875                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1876                if inlined != (member_inline_size <= 4) {
1877                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1878                }
1879                let inner_offset;
1880                let mut inner_depth = depth.clone();
1881                if inlined {
1882                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1883                    inner_offset = next_offset;
1884                } else {
1885                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1886                    inner_depth.increment()?;
1887                }
1888                let val_ref =
1889                    self.input_current_limit_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
1890                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1891                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1892                {
1893                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1894                }
1895                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1896                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1897                }
1898            }
1899
1900            next_offset += envelope_size;
1901            _next_ordinal_to_read += 1;
1902            if next_offset >= end_offset {
1903                return Ok(());
1904            }
1905
1906            // Decode unknown envelopes for gaps in ordinals.
1907            while _next_ordinal_to_read < 3 {
1908                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1909                _next_ordinal_to_read += 1;
1910                next_offset += envelope_size;
1911            }
1912
1913            let next_out_of_line = decoder.next_out_of_line();
1914            let handles_before = decoder.remaining_handles();
1915            if let Some((inlined, num_bytes, num_handles)) =
1916                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1917            {
1918                let member_inline_size =
1919                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1920                if inlined != (member_inline_size <= 4) {
1921                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1922                }
1923                let inner_offset;
1924                let mut inner_depth = depth.clone();
1925                if inlined {
1926                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1927                    inner_offset = next_offset;
1928                } else {
1929                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1930                    inner_depth.increment()?;
1931                }
1932                let val_ref =
1933                    self.charge_current_limit_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
1934                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1935                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1936                {
1937                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1938                }
1939                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1940                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1941                }
1942            }
1943
1944            next_offset += envelope_size;
1945            _next_ordinal_to_read += 1;
1946            if next_offset >= end_offset {
1947                return Ok(());
1948            }
1949
1950            // Decode unknown envelopes for gaps in ordinals.
1951            while _next_ordinal_to_read < 4 {
1952                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1953                _next_ordinal_to_read += 1;
1954                next_offset += envelope_size;
1955            }
1956
1957            let next_out_of_line = decoder.next_out_of_line();
1958            let handles_before = decoder.remaining_handles();
1959            if let Some((inlined, num_bytes, num_handles)) =
1960                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1961            {
1962                let member_inline_size =
1963                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1964                if inlined != (member_inline_size <= 4) {
1965                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1966                }
1967                let inner_offset;
1968                let mut inner_depth = depth.clone();
1969                if inlined {
1970                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1971                    inner_offset = next_offset;
1972                } else {
1973                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1974                    inner_depth.increment()?;
1975                }
1976                let val_ref = self.float_voltage_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
1977                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1978                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1979                {
1980                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1981                }
1982                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1983                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1984                }
1985            }
1986
1987            next_offset += envelope_size;
1988            _next_ordinal_to_read += 1;
1989            if next_offset >= end_offset {
1990                return Ok(());
1991            }
1992
1993            // Decode unknown envelopes for gaps in ordinals.
1994            while _next_ordinal_to_read < 5 {
1995                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1996                _next_ordinal_to_read += 1;
1997                next_offset += envelope_size;
1998            }
1999
2000            let next_out_of_line = decoder.next_out_of_line();
2001            let handles_before = decoder.remaining_handles();
2002            if let Some((inlined, num_bytes, num_handles)) =
2003                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2004            {
2005                let member_inline_size =
2006                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2007                if inlined != (member_inline_size <= 4) {
2008                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2009                }
2010                let inner_offset;
2011                let mut inner_depth = depth.clone();
2012                if inlined {
2013                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2014                    inner_offset = next_offset;
2015                } else {
2016                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2017                    inner_depth.increment()?;
2018                }
2019                let val_ref =
2020                    self.charge_term_current_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
2021                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2022                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2023                {
2024                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2025                }
2026                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2027                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2028                }
2029            }
2030
2031            next_offset += envelope_size;
2032            _next_ordinal_to_read += 1;
2033            if next_offset >= end_offset {
2034                return Ok(());
2035            }
2036
2037            // Decode unknown envelopes for gaps in ordinals.
2038            while _next_ordinal_to_read < 6 {
2039                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2040                _next_ordinal_to_read += 1;
2041                next_offset += envelope_size;
2042            }
2043
2044            let next_out_of_line = decoder.next_out_of_line();
2045            let handles_before = decoder.remaining_handles();
2046            if let Some((inlined, num_bytes, num_handles)) =
2047                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2048            {
2049                let member_inline_size =
2050                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2051                if inlined != (member_inline_size <= 4) {
2052                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2053                }
2054                let inner_offset;
2055                let mut inner_depth = depth.clone();
2056                if inlined {
2057                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2058                    inner_offset = next_offset;
2059                } else {
2060                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2061                    inner_depth.increment()?;
2062                }
2063                let val_ref =
2064                    self.input_voltage_limit_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
2065                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2066                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2067                {
2068                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2069                }
2070                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2071                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2072                }
2073            }
2074
2075            next_offset += envelope_size;
2076            _next_ordinal_to_read += 1;
2077            if next_offset >= end_offset {
2078                return Ok(());
2079            }
2080
2081            // Decode unknown envelopes for gaps in ordinals.
2082            while _next_ordinal_to_read < 7 {
2083                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2084                _next_ordinal_to_read += 1;
2085                next_offset += envelope_size;
2086            }
2087
2088            let next_out_of_line = decoder.next_out_of_line();
2089            let handles_before = decoder.remaining_handles();
2090            if let Some((inlined, num_bytes, num_handles)) =
2091                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2092            {
2093                let member_inline_size =
2094                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2095                if inlined != (member_inline_size <= 4) {
2096                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2097                }
2098                let inner_offset;
2099                let mut inner_depth = depth.clone();
2100                if inlined {
2101                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2102                    inner_offset = next_offset;
2103                } else {
2104                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2105                    inner_depth.increment()?;
2106                }
2107                let val_ref = self.top_off_duration.get_or_insert_with(|| fidl::new_empty!(i64, D));
2108                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
2109                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2110                {
2111                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2112                }
2113                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2114                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2115                }
2116            }
2117
2118            next_offset += envelope_size;
2119
2120            // Decode the remaining unknown envelopes.
2121            while next_offset < end_offset {
2122                _next_ordinal_to_read += 1;
2123                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2124                next_offset += envelope_size;
2125            }
2126
2127            Ok(())
2128        }
2129    }
2130
2131    impl Spec {
2132        #[inline(always)]
2133        fn max_ordinal_present(&self) -> u64 {
2134            if let Some(_) = self.max_input_voltage_uv {
2135                return 11;
2136            }
2137            if let Some(_) = self.min_input_voltage_uv {
2138                return 10;
2139            }
2140            if let Some(_) = self.recharge_voltage_uv {
2141                return 9;
2142            }
2143            if let Some(_) = self.charge_term_current_ua {
2144                return 8;
2145            }
2146            if let Some(_) = self.precharge_current_ua {
2147                return 7;
2148            }
2149            if let Some(_) = self.supported_options {
2150                return 6;
2151            }
2152            if let Some(_) = self.supported_modes {
2153                return 5;
2154            }
2155            if let Some(_) = self.model {
2156                return 4;
2157            }
2158            if let Some(_) = self.max_input_current_ua {
2159                return 3;
2160            }
2161            if let Some(_) = self.max_charge_voltage_uv {
2162                return 2;
2163            }
2164            if let Some(_) = self.max_charge_current_ua {
2165                return 1;
2166            }
2167            0
2168        }
2169    }
2170
2171    impl fidl::encoding::ValueTypeMarker for Spec {
2172        type Borrowed<'a> = &'a Self;
2173        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2174            value
2175        }
2176    }
2177
2178    unsafe impl fidl::encoding::TypeMarker for Spec {
2179        type Owned = Self;
2180
2181        #[inline(always)]
2182        fn inline_align(_context: fidl::encoding::Context) -> usize {
2183            8
2184        }
2185
2186        #[inline(always)]
2187        fn inline_size(_context: fidl::encoding::Context) -> usize {
2188            16
2189        }
2190    }
2191
2192    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Spec, D> for &Spec {
2193        unsafe fn encode(
2194            self,
2195            encoder: &mut fidl::encoding::Encoder<'_, D>,
2196            offset: usize,
2197            mut depth: fidl::encoding::Depth,
2198        ) -> fidl::Result<()> {
2199            encoder.debug_check_bounds::<Spec>(offset);
2200            // Vector header
2201            let max_ordinal: u64 = self.max_ordinal_present();
2202            encoder.write_num(max_ordinal, offset);
2203            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2204            // Calling encoder.out_of_line_offset(0) is not allowed.
2205            if max_ordinal == 0 {
2206                return Ok(());
2207            }
2208            depth.increment()?;
2209            let envelope_size = 8;
2210            let bytes_len = max_ordinal as usize * envelope_size;
2211            #[allow(unused_variables)]
2212            let offset = encoder.out_of_line_offset(bytes_len);
2213            let mut _prev_end_offset: usize = 0;
2214            if 1 > max_ordinal {
2215                return Ok(());
2216            }
2217
2218            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2219            // are envelope_size bytes.
2220            let cur_offset: usize = (1 - 1) * envelope_size;
2221
2222            // Zero reserved fields.
2223            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2224
2225            // Safety:
2226            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2227            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2228            //   envelope_size bytes, there is always sufficient room.
2229            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2230                self.max_charge_current_ua
2231                    .as_ref()
2232                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2233                encoder,
2234                offset + cur_offset,
2235                depth,
2236            )?;
2237
2238            _prev_end_offset = cur_offset + envelope_size;
2239            if 2 > max_ordinal {
2240                return Ok(());
2241            }
2242
2243            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2244            // are envelope_size bytes.
2245            let cur_offset: usize = (2 - 1) * envelope_size;
2246
2247            // Zero reserved fields.
2248            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2249
2250            // Safety:
2251            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2252            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2253            //   envelope_size bytes, there is always sufficient room.
2254            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2255                self.max_charge_voltage_uv
2256                    .as_ref()
2257                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2258                encoder,
2259                offset + cur_offset,
2260                depth,
2261            )?;
2262
2263            _prev_end_offset = cur_offset + envelope_size;
2264            if 3 > max_ordinal {
2265                return Ok(());
2266            }
2267
2268            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2269            // are envelope_size bytes.
2270            let cur_offset: usize = (3 - 1) * envelope_size;
2271
2272            // Zero reserved fields.
2273            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2274
2275            // Safety:
2276            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2277            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2278            //   envelope_size bytes, there is always sufficient room.
2279            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2280                self.max_input_current_ua
2281                    .as_ref()
2282                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2283                encoder,
2284                offset + cur_offset,
2285                depth,
2286            )?;
2287
2288            _prev_end_offset = cur_offset + envelope_size;
2289            if 4 > max_ordinal {
2290                return Ok(());
2291            }
2292
2293            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2294            // are envelope_size bytes.
2295            let cur_offset: usize = (4 - 1) * envelope_size;
2296
2297            // Zero reserved fields.
2298            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2299
2300            // Safety:
2301            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2302            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2303            //   envelope_size bytes, there is always sufficient room.
2304            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<128>, D>(
2305                self.model.as_ref().map(
2306                    <fidl::encoding::BoundedString<128> as fidl::encoding::ValueTypeMarker>::borrow,
2307                ),
2308                encoder,
2309                offset + cur_offset,
2310                depth,
2311            )?;
2312
2313            _prev_end_offset = cur_offset + envelope_size;
2314            if 5 > max_ordinal {
2315                return Ok(());
2316            }
2317
2318            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2319            // are envelope_size bytes.
2320            let cur_offset: usize = (5 - 1) * envelope_size;
2321
2322            // Zero reserved fields.
2323            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2324
2325            // Safety:
2326            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2327            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2328            //   envelope_size bytes, there is always sufficient room.
2329            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<OperatingMode, 16>, D>(
2330            self.supported_modes.as_ref().map(<fidl::encoding::Vector<OperatingMode, 16> as fidl::encoding::ValueTypeMarker>::borrow),
2331            encoder, offset + cur_offset, depth
2332        )?;
2333
2334            _prev_end_offset = cur_offset + envelope_size;
2335            if 6 > max_ordinal {
2336                return Ok(());
2337            }
2338
2339            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2340            // are envelope_size bytes.
2341            let cur_offset: usize = (6 - 1) * envelope_size;
2342
2343            // Zero reserved fields.
2344            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2345
2346            // Safety:
2347            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2348            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2349            //   envelope_size bytes, there is always sufficient room.
2350            fidl::encoding::encode_in_envelope_optional::<WatchOptions, D>(
2351                self.supported_options
2352                    .as_ref()
2353                    .map(<WatchOptions as fidl::encoding::ValueTypeMarker>::borrow),
2354                encoder,
2355                offset + cur_offset,
2356                depth,
2357            )?;
2358
2359            _prev_end_offset = cur_offset + envelope_size;
2360            if 7 > max_ordinal {
2361                return Ok(());
2362            }
2363
2364            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2365            // are envelope_size bytes.
2366            let cur_offset: usize = (7 - 1) * envelope_size;
2367
2368            // Zero reserved fields.
2369            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2370
2371            // Safety:
2372            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2373            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2374            //   envelope_size bytes, there is always sufficient room.
2375            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2376                self.precharge_current_ua
2377                    .as_ref()
2378                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2379                encoder,
2380                offset + cur_offset,
2381                depth,
2382            )?;
2383
2384            _prev_end_offset = cur_offset + envelope_size;
2385            if 8 > max_ordinal {
2386                return Ok(());
2387            }
2388
2389            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2390            // are envelope_size bytes.
2391            let cur_offset: usize = (8 - 1) * envelope_size;
2392
2393            // Zero reserved fields.
2394            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2395
2396            // Safety:
2397            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2398            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2399            //   envelope_size bytes, there is always sufficient room.
2400            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2401                self.charge_term_current_ua
2402                    .as_ref()
2403                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2404                encoder,
2405                offset + cur_offset,
2406                depth,
2407            )?;
2408
2409            _prev_end_offset = cur_offset + envelope_size;
2410            if 9 > max_ordinal {
2411                return Ok(());
2412            }
2413
2414            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2415            // are envelope_size bytes.
2416            let cur_offset: usize = (9 - 1) * envelope_size;
2417
2418            // Zero reserved fields.
2419            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2420
2421            // Safety:
2422            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2423            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2424            //   envelope_size bytes, there is always sufficient room.
2425            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2426                self.recharge_voltage_uv
2427                    .as_ref()
2428                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2429                encoder,
2430                offset + cur_offset,
2431                depth,
2432            )?;
2433
2434            _prev_end_offset = cur_offset + envelope_size;
2435            if 10 > max_ordinal {
2436                return Ok(());
2437            }
2438
2439            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2440            // are envelope_size bytes.
2441            let cur_offset: usize = (10 - 1) * envelope_size;
2442
2443            // Zero reserved fields.
2444            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2445
2446            // Safety:
2447            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2448            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2449            //   envelope_size bytes, there is always sufficient room.
2450            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2451                self.min_input_voltage_uv
2452                    .as_ref()
2453                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2454                encoder,
2455                offset + cur_offset,
2456                depth,
2457            )?;
2458
2459            _prev_end_offset = cur_offset + envelope_size;
2460            if 11 > max_ordinal {
2461                return Ok(());
2462            }
2463
2464            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2465            // are envelope_size bytes.
2466            let cur_offset: usize = (11 - 1) * envelope_size;
2467
2468            // Zero reserved fields.
2469            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2470
2471            // Safety:
2472            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2473            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2474            //   envelope_size bytes, there is always sufficient room.
2475            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2476                self.max_input_voltage_uv
2477                    .as_ref()
2478                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2479                encoder,
2480                offset + cur_offset,
2481                depth,
2482            )?;
2483
2484            _prev_end_offset = cur_offset + envelope_size;
2485
2486            Ok(())
2487        }
2488    }
2489
2490    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Spec {
2491        #[inline(always)]
2492        fn new_empty() -> Self {
2493            Self::default()
2494        }
2495
2496        unsafe fn decode(
2497            &mut self,
2498            decoder: &mut fidl::encoding::Decoder<'_, D>,
2499            offset: usize,
2500            mut depth: fidl::encoding::Depth,
2501        ) -> fidl::Result<()> {
2502            decoder.debug_check_bounds::<Self>(offset);
2503            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2504                None => return Err(fidl::Error::NotNullable),
2505                Some(len) => len,
2506            };
2507            // Calling decoder.out_of_line_offset(0) is not allowed.
2508            if len == 0 {
2509                return Ok(());
2510            };
2511            depth.increment()?;
2512            let envelope_size = 8;
2513            let bytes_len = len * envelope_size;
2514            let offset = decoder.out_of_line_offset(bytes_len)?;
2515            // Decode the envelope for each type.
2516            let mut _next_ordinal_to_read = 0;
2517            let mut next_offset = offset;
2518            let end_offset = offset + bytes_len;
2519            _next_ordinal_to_read += 1;
2520            if next_offset >= end_offset {
2521                return Ok(());
2522            }
2523
2524            // Decode unknown envelopes for gaps in ordinals.
2525            while _next_ordinal_to_read < 1 {
2526                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2527                _next_ordinal_to_read += 1;
2528                next_offset += envelope_size;
2529            }
2530
2531            let next_out_of_line = decoder.next_out_of_line();
2532            let handles_before = decoder.remaining_handles();
2533            if let Some((inlined, num_bytes, num_handles)) =
2534                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2535            {
2536                let member_inline_size =
2537                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2538                if inlined != (member_inline_size <= 4) {
2539                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2540                }
2541                let inner_offset;
2542                let mut inner_depth = depth.clone();
2543                if inlined {
2544                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2545                    inner_offset = next_offset;
2546                } else {
2547                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2548                    inner_depth.increment()?;
2549                }
2550                let val_ref =
2551                    self.max_charge_current_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
2552                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2553                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2554                {
2555                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2556                }
2557                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2558                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2559                }
2560            }
2561
2562            next_offset += envelope_size;
2563            _next_ordinal_to_read += 1;
2564            if next_offset >= end_offset {
2565                return Ok(());
2566            }
2567
2568            // Decode unknown envelopes for gaps in ordinals.
2569            while _next_ordinal_to_read < 2 {
2570                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2571                _next_ordinal_to_read += 1;
2572                next_offset += envelope_size;
2573            }
2574
2575            let next_out_of_line = decoder.next_out_of_line();
2576            let handles_before = decoder.remaining_handles();
2577            if let Some((inlined, num_bytes, num_handles)) =
2578                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2579            {
2580                let member_inline_size =
2581                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2582                if inlined != (member_inline_size <= 4) {
2583                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2584                }
2585                let inner_offset;
2586                let mut inner_depth = depth.clone();
2587                if inlined {
2588                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2589                    inner_offset = next_offset;
2590                } else {
2591                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2592                    inner_depth.increment()?;
2593                }
2594                let val_ref =
2595                    self.max_charge_voltage_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
2596                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2597                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2598                {
2599                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2600                }
2601                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2602                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2603                }
2604            }
2605
2606            next_offset += envelope_size;
2607            _next_ordinal_to_read += 1;
2608            if next_offset >= end_offset {
2609                return Ok(());
2610            }
2611
2612            // Decode unknown envelopes for gaps in ordinals.
2613            while _next_ordinal_to_read < 3 {
2614                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2615                _next_ordinal_to_read += 1;
2616                next_offset += envelope_size;
2617            }
2618
2619            let next_out_of_line = decoder.next_out_of_line();
2620            let handles_before = decoder.remaining_handles();
2621            if let Some((inlined, num_bytes, num_handles)) =
2622                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2623            {
2624                let member_inline_size =
2625                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2626                if inlined != (member_inline_size <= 4) {
2627                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2628                }
2629                let inner_offset;
2630                let mut inner_depth = depth.clone();
2631                if inlined {
2632                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2633                    inner_offset = next_offset;
2634                } else {
2635                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2636                    inner_depth.increment()?;
2637                }
2638                let val_ref =
2639                    self.max_input_current_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
2640                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2641                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2642                {
2643                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2644                }
2645                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2646                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2647                }
2648            }
2649
2650            next_offset += envelope_size;
2651            _next_ordinal_to_read += 1;
2652            if next_offset >= end_offset {
2653                return Ok(());
2654            }
2655
2656            // Decode unknown envelopes for gaps in ordinals.
2657            while _next_ordinal_to_read < 4 {
2658                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2659                _next_ordinal_to_read += 1;
2660                next_offset += envelope_size;
2661            }
2662
2663            let next_out_of_line = decoder.next_out_of_line();
2664            let handles_before = decoder.remaining_handles();
2665            if let Some((inlined, num_bytes, num_handles)) =
2666                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2667            {
2668                let member_inline_size =
2669                    <fidl::encoding::BoundedString<128> as fidl::encoding::TypeMarker>::inline_size(
2670                        decoder.context,
2671                    );
2672                if inlined != (member_inline_size <= 4) {
2673                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2674                }
2675                let inner_offset;
2676                let mut inner_depth = depth.clone();
2677                if inlined {
2678                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2679                    inner_offset = next_offset;
2680                } else {
2681                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2682                    inner_depth.increment()?;
2683                }
2684                let val_ref = self
2685                    .model
2686                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<128>, D));
2687                fidl::decode!(
2688                    fidl::encoding::BoundedString<128>,
2689                    D,
2690                    val_ref,
2691                    decoder,
2692                    inner_offset,
2693                    inner_depth
2694                )?;
2695                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2696                {
2697                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2698                }
2699                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2700                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2701                }
2702            }
2703
2704            next_offset += envelope_size;
2705            _next_ordinal_to_read += 1;
2706            if next_offset >= end_offset {
2707                return Ok(());
2708            }
2709
2710            // Decode unknown envelopes for gaps in ordinals.
2711            while _next_ordinal_to_read < 5 {
2712                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2713                _next_ordinal_to_read += 1;
2714                next_offset += envelope_size;
2715            }
2716
2717            let next_out_of_line = decoder.next_out_of_line();
2718            let handles_before = decoder.remaining_handles();
2719            if let Some((inlined, num_bytes, num_handles)) =
2720                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2721            {
2722                let member_inline_size = <fidl::encoding::Vector<OperatingMode, 16> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2723                if inlined != (member_inline_size <= 4) {
2724                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2725                }
2726                let inner_offset;
2727                let mut inner_depth = depth.clone();
2728                if inlined {
2729                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2730                    inner_offset = next_offset;
2731                } else {
2732                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2733                    inner_depth.increment()?;
2734                }
2735                let val_ref = self.supported_modes.get_or_insert_with(
2736                    || fidl::new_empty!(fidl::encoding::Vector<OperatingMode, 16>, D),
2737                );
2738                fidl::decode!(fidl::encoding::Vector<OperatingMode, 16>, D, val_ref, decoder, inner_offset, inner_depth)?;
2739                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2740                {
2741                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2742                }
2743                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2744                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2745                }
2746            }
2747
2748            next_offset += envelope_size;
2749            _next_ordinal_to_read += 1;
2750            if next_offset >= end_offset {
2751                return Ok(());
2752            }
2753
2754            // Decode unknown envelopes for gaps in ordinals.
2755            while _next_ordinal_to_read < 6 {
2756                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2757                _next_ordinal_to_read += 1;
2758                next_offset += envelope_size;
2759            }
2760
2761            let next_out_of_line = decoder.next_out_of_line();
2762            let handles_before = decoder.remaining_handles();
2763            if let Some((inlined, num_bytes, num_handles)) =
2764                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2765            {
2766                let member_inline_size =
2767                    <WatchOptions as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2768                if inlined != (member_inline_size <= 4) {
2769                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2770                }
2771                let inner_offset;
2772                let mut inner_depth = depth.clone();
2773                if inlined {
2774                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2775                    inner_offset = next_offset;
2776                } else {
2777                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2778                    inner_depth.increment()?;
2779                }
2780                let val_ref =
2781                    self.supported_options.get_or_insert_with(|| fidl::new_empty!(WatchOptions, D));
2782                fidl::decode!(WatchOptions, D, val_ref, decoder, inner_offset, inner_depth)?;
2783                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2784                {
2785                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2786                }
2787                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2788                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2789                }
2790            }
2791
2792            next_offset += envelope_size;
2793            _next_ordinal_to_read += 1;
2794            if next_offset >= end_offset {
2795                return Ok(());
2796            }
2797
2798            // Decode unknown envelopes for gaps in ordinals.
2799            while _next_ordinal_to_read < 7 {
2800                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2801                _next_ordinal_to_read += 1;
2802                next_offset += envelope_size;
2803            }
2804
2805            let next_out_of_line = decoder.next_out_of_line();
2806            let handles_before = decoder.remaining_handles();
2807            if let Some((inlined, num_bytes, num_handles)) =
2808                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2809            {
2810                let member_inline_size =
2811                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2812                if inlined != (member_inline_size <= 4) {
2813                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2814                }
2815                let inner_offset;
2816                let mut inner_depth = depth.clone();
2817                if inlined {
2818                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2819                    inner_offset = next_offset;
2820                } else {
2821                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2822                    inner_depth.increment()?;
2823                }
2824                let val_ref =
2825                    self.precharge_current_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
2826                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2827                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2828                {
2829                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2830                }
2831                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2832                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2833                }
2834            }
2835
2836            next_offset += envelope_size;
2837            _next_ordinal_to_read += 1;
2838            if next_offset >= end_offset {
2839                return Ok(());
2840            }
2841
2842            // Decode unknown envelopes for gaps in ordinals.
2843            while _next_ordinal_to_read < 8 {
2844                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2845                _next_ordinal_to_read += 1;
2846                next_offset += envelope_size;
2847            }
2848
2849            let next_out_of_line = decoder.next_out_of_line();
2850            let handles_before = decoder.remaining_handles();
2851            if let Some((inlined, num_bytes, num_handles)) =
2852                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2853            {
2854                let member_inline_size =
2855                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2856                if inlined != (member_inline_size <= 4) {
2857                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2858                }
2859                let inner_offset;
2860                let mut inner_depth = depth.clone();
2861                if inlined {
2862                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2863                    inner_offset = next_offset;
2864                } else {
2865                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2866                    inner_depth.increment()?;
2867                }
2868                let val_ref =
2869                    self.charge_term_current_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
2870                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2871                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2872                {
2873                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2874                }
2875                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2876                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2877                }
2878            }
2879
2880            next_offset += envelope_size;
2881            _next_ordinal_to_read += 1;
2882            if next_offset >= end_offset {
2883                return Ok(());
2884            }
2885
2886            // Decode unknown envelopes for gaps in ordinals.
2887            while _next_ordinal_to_read < 9 {
2888                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2889                _next_ordinal_to_read += 1;
2890                next_offset += envelope_size;
2891            }
2892
2893            let next_out_of_line = decoder.next_out_of_line();
2894            let handles_before = decoder.remaining_handles();
2895            if let Some((inlined, num_bytes, num_handles)) =
2896                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2897            {
2898                let member_inline_size =
2899                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2900                if inlined != (member_inline_size <= 4) {
2901                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2902                }
2903                let inner_offset;
2904                let mut inner_depth = depth.clone();
2905                if inlined {
2906                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2907                    inner_offset = next_offset;
2908                } else {
2909                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2910                    inner_depth.increment()?;
2911                }
2912                let val_ref =
2913                    self.recharge_voltage_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
2914                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2915                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2916                {
2917                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2918                }
2919                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2920                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2921                }
2922            }
2923
2924            next_offset += envelope_size;
2925            _next_ordinal_to_read += 1;
2926            if next_offset >= end_offset {
2927                return Ok(());
2928            }
2929
2930            // Decode unknown envelopes for gaps in ordinals.
2931            while _next_ordinal_to_read < 10 {
2932                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2933                _next_ordinal_to_read += 1;
2934                next_offset += envelope_size;
2935            }
2936
2937            let next_out_of_line = decoder.next_out_of_line();
2938            let handles_before = decoder.remaining_handles();
2939            if let Some((inlined, num_bytes, num_handles)) =
2940                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2941            {
2942                let member_inline_size =
2943                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2944                if inlined != (member_inline_size <= 4) {
2945                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2946                }
2947                let inner_offset;
2948                let mut inner_depth = depth.clone();
2949                if inlined {
2950                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2951                    inner_offset = next_offset;
2952                } else {
2953                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2954                    inner_depth.increment()?;
2955                }
2956                let val_ref =
2957                    self.min_input_voltage_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
2958                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2959                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2960                {
2961                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2962                }
2963                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2964                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2965                }
2966            }
2967
2968            next_offset += envelope_size;
2969            _next_ordinal_to_read += 1;
2970            if next_offset >= end_offset {
2971                return Ok(());
2972            }
2973
2974            // Decode unknown envelopes for gaps in ordinals.
2975            while _next_ordinal_to_read < 11 {
2976                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2977                _next_ordinal_to_read += 1;
2978                next_offset += envelope_size;
2979            }
2980
2981            let next_out_of_line = decoder.next_out_of_line();
2982            let handles_before = decoder.remaining_handles();
2983            if let Some((inlined, num_bytes, num_handles)) =
2984                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2985            {
2986                let member_inline_size =
2987                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2988                if inlined != (member_inline_size <= 4) {
2989                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2990                }
2991                let inner_offset;
2992                let mut inner_depth = depth.clone();
2993                if inlined {
2994                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2995                    inner_offset = next_offset;
2996                } else {
2997                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2998                    inner_depth.increment()?;
2999                }
3000                let val_ref =
3001                    self.max_input_voltage_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
3002                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3003                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3004                {
3005                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3006                }
3007                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3008                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3009                }
3010            }
3011
3012            next_offset += envelope_size;
3013
3014            // Decode the remaining unknown envelopes.
3015            while next_offset < end_offset {
3016                _next_ordinal_to_read += 1;
3017                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3018                next_offset += envelope_size;
3019            }
3020
3021            Ok(())
3022        }
3023    }
3024
3025    impl Status {
3026        #[inline(always)]
3027        fn max_ordinal_present(&self) -> u64 {
3028            if let Some(_) = self.top_off_duration {
3029                return 13;
3030            }
3031            if let Some(_) = self.input_voltage_limit_uv {
3032                return 12;
3033            }
3034            if let Some(_) = self.charge_term_current_ua {
3035                return 11;
3036            }
3037            if let Some(_) = self.health {
3038                return 10;
3039            }
3040            if let Some(_) = self.source_type {
3041                return 9;
3042            }
3043            if let Some(_) = self.float_voltage_uv {
3044                return 8;
3045            }
3046            if let Some(_) = self.charge_current_limit_ua {
3047                return 7;
3048            }
3049            if let Some(_) = self.input_current_limit_ua {
3050                return 6;
3051            }
3052            if let Some(_) = self.charge_phase {
3053                return 5;
3054            }
3055            if let Some(_) = self.operating_mode {
3056                return 4;
3057            }
3058            if let Some(_) = self.input_current_ua {
3059                return 3;
3060            }
3061            if let Some(_) = self.input_voltage_uv {
3062                return 2;
3063            }
3064            if let Some(_) = self.online {
3065                return 1;
3066            }
3067            0
3068        }
3069    }
3070
3071    impl fidl::encoding::ValueTypeMarker for Status {
3072        type Borrowed<'a> = &'a Self;
3073        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3074            value
3075        }
3076    }
3077
3078    unsafe impl fidl::encoding::TypeMarker for Status {
3079        type Owned = Self;
3080
3081        #[inline(always)]
3082        fn inline_align(_context: fidl::encoding::Context) -> usize {
3083            8
3084        }
3085
3086        #[inline(always)]
3087        fn inline_size(_context: fidl::encoding::Context) -> usize {
3088            16
3089        }
3090    }
3091
3092    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Status, D> for &Status {
3093        unsafe fn encode(
3094            self,
3095            encoder: &mut fidl::encoding::Encoder<'_, D>,
3096            offset: usize,
3097            mut depth: fidl::encoding::Depth,
3098        ) -> fidl::Result<()> {
3099            encoder.debug_check_bounds::<Status>(offset);
3100            // Vector header
3101            let max_ordinal: u64 = self.max_ordinal_present();
3102            encoder.write_num(max_ordinal, offset);
3103            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3104            // Calling encoder.out_of_line_offset(0) is not allowed.
3105            if max_ordinal == 0 {
3106                return Ok(());
3107            }
3108            depth.increment()?;
3109            let envelope_size = 8;
3110            let bytes_len = max_ordinal as usize * envelope_size;
3111            #[allow(unused_variables)]
3112            let offset = encoder.out_of_line_offset(bytes_len);
3113            let mut _prev_end_offset: usize = 0;
3114            if 1 > max_ordinal {
3115                return Ok(());
3116            }
3117
3118            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3119            // are envelope_size bytes.
3120            let cur_offset: usize = (1 - 1) * envelope_size;
3121
3122            // Zero reserved fields.
3123            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3124
3125            // Safety:
3126            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3127            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3128            //   envelope_size bytes, there is always sufficient room.
3129            fidl::encoding::encode_in_envelope_optional::<bool, D>(
3130                self.online.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
3131                encoder,
3132                offset + cur_offset,
3133                depth,
3134            )?;
3135
3136            _prev_end_offset = cur_offset + envelope_size;
3137            if 2 > max_ordinal {
3138                return Ok(());
3139            }
3140
3141            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3142            // are envelope_size bytes.
3143            let cur_offset: usize = (2 - 1) * envelope_size;
3144
3145            // Zero reserved fields.
3146            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3147
3148            // Safety:
3149            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3150            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3151            //   envelope_size bytes, there is always sufficient room.
3152            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3153                self.input_voltage_uv
3154                    .as_ref()
3155                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3156                encoder,
3157                offset + cur_offset,
3158                depth,
3159            )?;
3160
3161            _prev_end_offset = cur_offset + envelope_size;
3162            if 3 > max_ordinal {
3163                return Ok(());
3164            }
3165
3166            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3167            // are envelope_size bytes.
3168            let cur_offset: usize = (3 - 1) * envelope_size;
3169
3170            // Zero reserved fields.
3171            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3172
3173            // Safety:
3174            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3175            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3176            //   envelope_size bytes, there is always sufficient room.
3177            fidl::encoding::encode_in_envelope_optional::<i32, D>(
3178                self.input_current_ua
3179                    .as_ref()
3180                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
3181                encoder,
3182                offset + cur_offset,
3183                depth,
3184            )?;
3185
3186            _prev_end_offset = cur_offset + envelope_size;
3187            if 4 > max_ordinal {
3188                return Ok(());
3189            }
3190
3191            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3192            // are envelope_size bytes.
3193            let cur_offset: usize = (4 - 1) * envelope_size;
3194
3195            // Zero reserved fields.
3196            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3197
3198            // Safety:
3199            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3200            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3201            //   envelope_size bytes, there is always sufficient room.
3202            fidl::encoding::encode_in_envelope_optional::<OperatingMode, D>(
3203                self.operating_mode
3204                    .as_ref()
3205                    .map(<OperatingMode as fidl::encoding::ValueTypeMarker>::borrow),
3206                encoder,
3207                offset + cur_offset,
3208                depth,
3209            )?;
3210
3211            _prev_end_offset = cur_offset + envelope_size;
3212            if 5 > max_ordinal {
3213                return Ok(());
3214            }
3215
3216            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3217            // are envelope_size bytes.
3218            let cur_offset: usize = (5 - 1) * envelope_size;
3219
3220            // Zero reserved fields.
3221            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3222
3223            // Safety:
3224            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3225            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3226            //   envelope_size bytes, there is always sufficient room.
3227            fidl::encoding::encode_in_envelope_optional::<ChargePhase, D>(
3228                self.charge_phase
3229                    .as_ref()
3230                    .map(<ChargePhase as fidl::encoding::ValueTypeMarker>::borrow),
3231                encoder,
3232                offset + cur_offset,
3233                depth,
3234            )?;
3235
3236            _prev_end_offset = cur_offset + envelope_size;
3237            if 6 > max_ordinal {
3238                return Ok(());
3239            }
3240
3241            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3242            // are envelope_size bytes.
3243            let cur_offset: usize = (6 - 1) * envelope_size;
3244
3245            // Zero reserved fields.
3246            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3247
3248            // Safety:
3249            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3250            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3251            //   envelope_size bytes, there is always sufficient room.
3252            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3253                self.input_current_limit_ua
3254                    .as_ref()
3255                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3256                encoder,
3257                offset + cur_offset,
3258                depth,
3259            )?;
3260
3261            _prev_end_offset = cur_offset + envelope_size;
3262            if 7 > max_ordinal {
3263                return Ok(());
3264            }
3265
3266            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3267            // are envelope_size bytes.
3268            let cur_offset: usize = (7 - 1) * envelope_size;
3269
3270            // Zero reserved fields.
3271            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3272
3273            // Safety:
3274            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3275            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3276            //   envelope_size bytes, there is always sufficient room.
3277            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3278                self.charge_current_limit_ua
3279                    .as_ref()
3280                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3281                encoder,
3282                offset + cur_offset,
3283                depth,
3284            )?;
3285
3286            _prev_end_offset = cur_offset + envelope_size;
3287            if 8 > max_ordinal {
3288                return Ok(());
3289            }
3290
3291            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3292            // are envelope_size bytes.
3293            let cur_offset: usize = (8 - 1) * envelope_size;
3294
3295            // Zero reserved fields.
3296            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3297
3298            // Safety:
3299            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3300            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3301            //   envelope_size bytes, there is always sufficient room.
3302            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3303                self.float_voltage_uv
3304                    .as_ref()
3305                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3306                encoder,
3307                offset + cur_offset,
3308                depth,
3309            )?;
3310
3311            _prev_end_offset = cur_offset + envelope_size;
3312            if 9 > max_ordinal {
3313                return Ok(());
3314            }
3315
3316            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3317            // are envelope_size bytes.
3318            let cur_offset: usize = (9 - 1) * envelope_size;
3319
3320            // Zero reserved fields.
3321            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3322
3323            // Safety:
3324            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3325            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3326            //   envelope_size bytes, there is always sufficient room.
3327            fidl::encoding::encode_in_envelope_optional::<SourceType, D>(
3328                self.source_type
3329                    .as_ref()
3330                    .map(<SourceType as fidl::encoding::ValueTypeMarker>::borrow),
3331                encoder,
3332                offset + cur_offset,
3333                depth,
3334            )?;
3335
3336            _prev_end_offset = cur_offset + envelope_size;
3337            if 10 > max_ordinal {
3338                return Ok(());
3339            }
3340
3341            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3342            // are envelope_size bytes.
3343            let cur_offset: usize = (10 - 1) * envelope_size;
3344
3345            // Zero reserved fields.
3346            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3347
3348            // Safety:
3349            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3350            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3351            //   envelope_size bytes, there is always sufficient room.
3352            fidl::encoding::encode_in_envelope_optional::<Health, D>(
3353                self.health.as_ref().map(<Health as fidl::encoding::ValueTypeMarker>::borrow),
3354                encoder,
3355                offset + cur_offset,
3356                depth,
3357            )?;
3358
3359            _prev_end_offset = cur_offset + envelope_size;
3360            if 11 > max_ordinal {
3361                return Ok(());
3362            }
3363
3364            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3365            // are envelope_size bytes.
3366            let cur_offset: usize = (11 - 1) * envelope_size;
3367
3368            // Zero reserved fields.
3369            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3370
3371            // Safety:
3372            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3373            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3374            //   envelope_size bytes, there is always sufficient room.
3375            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3376                self.charge_term_current_ua
3377                    .as_ref()
3378                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3379                encoder,
3380                offset + cur_offset,
3381                depth,
3382            )?;
3383
3384            _prev_end_offset = cur_offset + envelope_size;
3385            if 12 > max_ordinal {
3386                return Ok(());
3387            }
3388
3389            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3390            // are envelope_size bytes.
3391            let cur_offset: usize = (12 - 1) * envelope_size;
3392
3393            // Zero reserved fields.
3394            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3395
3396            // Safety:
3397            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3398            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3399            //   envelope_size bytes, there is always sufficient room.
3400            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3401                self.input_voltage_limit_uv
3402                    .as_ref()
3403                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3404                encoder,
3405                offset + cur_offset,
3406                depth,
3407            )?;
3408
3409            _prev_end_offset = cur_offset + envelope_size;
3410            if 13 > max_ordinal {
3411                return Ok(());
3412            }
3413
3414            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3415            // are envelope_size bytes.
3416            let cur_offset: usize = (13 - 1) * envelope_size;
3417
3418            // Zero reserved fields.
3419            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3420
3421            // Safety:
3422            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3423            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3424            //   envelope_size bytes, there is always sufficient room.
3425            fidl::encoding::encode_in_envelope_optional::<i64, D>(
3426                self.top_off_duration
3427                    .as_ref()
3428                    .map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
3429                encoder,
3430                offset + cur_offset,
3431                depth,
3432            )?;
3433
3434            _prev_end_offset = cur_offset + envelope_size;
3435
3436            Ok(())
3437        }
3438    }
3439
3440    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Status {
3441        #[inline(always)]
3442        fn new_empty() -> Self {
3443            Self::default()
3444        }
3445
3446        unsafe fn decode(
3447            &mut self,
3448            decoder: &mut fidl::encoding::Decoder<'_, D>,
3449            offset: usize,
3450            mut depth: fidl::encoding::Depth,
3451        ) -> fidl::Result<()> {
3452            decoder.debug_check_bounds::<Self>(offset);
3453            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3454                None => return Err(fidl::Error::NotNullable),
3455                Some(len) => len,
3456            };
3457            // Calling decoder.out_of_line_offset(0) is not allowed.
3458            if len == 0 {
3459                return Ok(());
3460            };
3461            depth.increment()?;
3462            let envelope_size = 8;
3463            let bytes_len = len * envelope_size;
3464            let offset = decoder.out_of_line_offset(bytes_len)?;
3465            // Decode the envelope for each type.
3466            let mut _next_ordinal_to_read = 0;
3467            let mut next_offset = offset;
3468            let end_offset = offset + bytes_len;
3469            _next_ordinal_to_read += 1;
3470            if next_offset >= end_offset {
3471                return Ok(());
3472            }
3473
3474            // Decode unknown envelopes for gaps in ordinals.
3475            while _next_ordinal_to_read < 1 {
3476                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3477                _next_ordinal_to_read += 1;
3478                next_offset += envelope_size;
3479            }
3480
3481            let next_out_of_line = decoder.next_out_of_line();
3482            let handles_before = decoder.remaining_handles();
3483            if let Some((inlined, num_bytes, num_handles)) =
3484                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3485            {
3486                let member_inline_size =
3487                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3488                if inlined != (member_inline_size <= 4) {
3489                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3490                }
3491                let inner_offset;
3492                let mut inner_depth = depth.clone();
3493                if inlined {
3494                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3495                    inner_offset = next_offset;
3496                } else {
3497                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3498                    inner_depth.increment()?;
3499                }
3500                let val_ref = self.online.get_or_insert_with(|| fidl::new_empty!(bool, D));
3501                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
3502                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3503                {
3504                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3505                }
3506                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3507                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3508                }
3509            }
3510
3511            next_offset += envelope_size;
3512            _next_ordinal_to_read += 1;
3513            if next_offset >= end_offset {
3514                return Ok(());
3515            }
3516
3517            // Decode unknown envelopes for gaps in ordinals.
3518            while _next_ordinal_to_read < 2 {
3519                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3520                _next_ordinal_to_read += 1;
3521                next_offset += envelope_size;
3522            }
3523
3524            let next_out_of_line = decoder.next_out_of_line();
3525            let handles_before = decoder.remaining_handles();
3526            if let Some((inlined, num_bytes, num_handles)) =
3527                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3528            {
3529                let member_inline_size =
3530                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3531                if inlined != (member_inline_size <= 4) {
3532                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3533                }
3534                let inner_offset;
3535                let mut inner_depth = depth.clone();
3536                if inlined {
3537                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3538                    inner_offset = next_offset;
3539                } else {
3540                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3541                    inner_depth.increment()?;
3542                }
3543                let val_ref = self.input_voltage_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
3544                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3545                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3546                {
3547                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3548                }
3549                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3550                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3551                }
3552            }
3553
3554            next_offset += envelope_size;
3555            _next_ordinal_to_read += 1;
3556            if next_offset >= end_offset {
3557                return Ok(());
3558            }
3559
3560            // Decode unknown envelopes for gaps in ordinals.
3561            while _next_ordinal_to_read < 3 {
3562                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3563                _next_ordinal_to_read += 1;
3564                next_offset += envelope_size;
3565            }
3566
3567            let next_out_of_line = decoder.next_out_of_line();
3568            let handles_before = decoder.remaining_handles();
3569            if let Some((inlined, num_bytes, num_handles)) =
3570                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3571            {
3572                let member_inline_size =
3573                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3574                if inlined != (member_inline_size <= 4) {
3575                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3576                }
3577                let inner_offset;
3578                let mut inner_depth = depth.clone();
3579                if inlined {
3580                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3581                    inner_offset = next_offset;
3582                } else {
3583                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3584                    inner_depth.increment()?;
3585                }
3586                let val_ref = self.input_current_ua.get_or_insert_with(|| fidl::new_empty!(i32, D));
3587                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
3588                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3589                {
3590                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3591                }
3592                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3593                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3594                }
3595            }
3596
3597            next_offset += envelope_size;
3598            _next_ordinal_to_read += 1;
3599            if next_offset >= end_offset {
3600                return Ok(());
3601            }
3602
3603            // Decode unknown envelopes for gaps in ordinals.
3604            while _next_ordinal_to_read < 4 {
3605                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3606                _next_ordinal_to_read += 1;
3607                next_offset += envelope_size;
3608            }
3609
3610            let next_out_of_line = decoder.next_out_of_line();
3611            let handles_before = decoder.remaining_handles();
3612            if let Some((inlined, num_bytes, num_handles)) =
3613                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3614            {
3615                let member_inline_size =
3616                    <OperatingMode as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3617                if inlined != (member_inline_size <= 4) {
3618                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3619                }
3620                let inner_offset;
3621                let mut inner_depth = depth.clone();
3622                if inlined {
3623                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3624                    inner_offset = next_offset;
3625                } else {
3626                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3627                    inner_depth.increment()?;
3628                }
3629                let val_ref =
3630                    self.operating_mode.get_or_insert_with(|| fidl::new_empty!(OperatingMode, D));
3631                fidl::decode!(OperatingMode, D, val_ref, decoder, inner_offset, inner_depth)?;
3632                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3633                {
3634                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3635                }
3636                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3637                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3638                }
3639            }
3640
3641            next_offset += envelope_size;
3642            _next_ordinal_to_read += 1;
3643            if next_offset >= end_offset {
3644                return Ok(());
3645            }
3646
3647            // Decode unknown envelopes for gaps in ordinals.
3648            while _next_ordinal_to_read < 5 {
3649                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3650                _next_ordinal_to_read += 1;
3651                next_offset += envelope_size;
3652            }
3653
3654            let next_out_of_line = decoder.next_out_of_line();
3655            let handles_before = decoder.remaining_handles();
3656            if let Some((inlined, num_bytes, num_handles)) =
3657                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3658            {
3659                let member_inline_size =
3660                    <ChargePhase as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3661                if inlined != (member_inline_size <= 4) {
3662                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3663                }
3664                let inner_offset;
3665                let mut inner_depth = depth.clone();
3666                if inlined {
3667                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3668                    inner_offset = next_offset;
3669                } else {
3670                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3671                    inner_depth.increment()?;
3672                }
3673                let val_ref =
3674                    self.charge_phase.get_or_insert_with(|| fidl::new_empty!(ChargePhase, D));
3675                fidl::decode!(ChargePhase, D, val_ref, decoder, inner_offset, inner_depth)?;
3676                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3677                {
3678                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3679                }
3680                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3681                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3682                }
3683            }
3684
3685            next_offset += envelope_size;
3686            _next_ordinal_to_read += 1;
3687            if next_offset >= end_offset {
3688                return Ok(());
3689            }
3690
3691            // Decode unknown envelopes for gaps in ordinals.
3692            while _next_ordinal_to_read < 6 {
3693                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3694                _next_ordinal_to_read += 1;
3695                next_offset += envelope_size;
3696            }
3697
3698            let next_out_of_line = decoder.next_out_of_line();
3699            let handles_before = decoder.remaining_handles();
3700            if let Some((inlined, num_bytes, num_handles)) =
3701                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3702            {
3703                let member_inline_size =
3704                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3705                if inlined != (member_inline_size <= 4) {
3706                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3707                }
3708                let inner_offset;
3709                let mut inner_depth = depth.clone();
3710                if inlined {
3711                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3712                    inner_offset = next_offset;
3713                } else {
3714                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3715                    inner_depth.increment()?;
3716                }
3717                let val_ref =
3718                    self.input_current_limit_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
3719                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3720                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3721                {
3722                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3723                }
3724                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3725                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3726                }
3727            }
3728
3729            next_offset += envelope_size;
3730            _next_ordinal_to_read += 1;
3731            if next_offset >= end_offset {
3732                return Ok(());
3733            }
3734
3735            // Decode unknown envelopes for gaps in ordinals.
3736            while _next_ordinal_to_read < 7 {
3737                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3738                _next_ordinal_to_read += 1;
3739                next_offset += envelope_size;
3740            }
3741
3742            let next_out_of_line = decoder.next_out_of_line();
3743            let handles_before = decoder.remaining_handles();
3744            if let Some((inlined, num_bytes, num_handles)) =
3745                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3746            {
3747                let member_inline_size =
3748                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3749                if inlined != (member_inline_size <= 4) {
3750                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3751                }
3752                let inner_offset;
3753                let mut inner_depth = depth.clone();
3754                if inlined {
3755                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3756                    inner_offset = next_offset;
3757                } else {
3758                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3759                    inner_depth.increment()?;
3760                }
3761                let val_ref =
3762                    self.charge_current_limit_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
3763                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3764                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3765                {
3766                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3767                }
3768                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3769                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3770                }
3771            }
3772
3773            next_offset += envelope_size;
3774            _next_ordinal_to_read += 1;
3775            if next_offset >= end_offset {
3776                return Ok(());
3777            }
3778
3779            // Decode unknown envelopes for gaps in ordinals.
3780            while _next_ordinal_to_read < 8 {
3781                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3782                _next_ordinal_to_read += 1;
3783                next_offset += envelope_size;
3784            }
3785
3786            let next_out_of_line = decoder.next_out_of_line();
3787            let handles_before = decoder.remaining_handles();
3788            if let Some((inlined, num_bytes, num_handles)) =
3789                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3790            {
3791                let member_inline_size =
3792                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3793                if inlined != (member_inline_size <= 4) {
3794                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3795                }
3796                let inner_offset;
3797                let mut inner_depth = depth.clone();
3798                if inlined {
3799                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3800                    inner_offset = next_offset;
3801                } else {
3802                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3803                    inner_depth.increment()?;
3804                }
3805                let val_ref = self.float_voltage_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
3806                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3807                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3808                {
3809                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3810                }
3811                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3812                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3813                }
3814            }
3815
3816            next_offset += envelope_size;
3817            _next_ordinal_to_read += 1;
3818            if next_offset >= end_offset {
3819                return Ok(());
3820            }
3821
3822            // Decode unknown envelopes for gaps in ordinals.
3823            while _next_ordinal_to_read < 9 {
3824                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3825                _next_ordinal_to_read += 1;
3826                next_offset += envelope_size;
3827            }
3828
3829            let next_out_of_line = decoder.next_out_of_line();
3830            let handles_before = decoder.remaining_handles();
3831            if let Some((inlined, num_bytes, num_handles)) =
3832                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3833            {
3834                let member_inline_size =
3835                    <SourceType as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3836                if inlined != (member_inline_size <= 4) {
3837                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3838                }
3839                let inner_offset;
3840                let mut inner_depth = depth.clone();
3841                if inlined {
3842                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3843                    inner_offset = next_offset;
3844                } else {
3845                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3846                    inner_depth.increment()?;
3847                }
3848                let val_ref =
3849                    self.source_type.get_or_insert_with(|| fidl::new_empty!(SourceType, D));
3850                fidl::decode!(SourceType, D, val_ref, decoder, inner_offset, inner_depth)?;
3851                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3852                {
3853                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3854                }
3855                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3856                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3857                }
3858            }
3859
3860            next_offset += envelope_size;
3861            _next_ordinal_to_read += 1;
3862            if next_offset >= end_offset {
3863                return Ok(());
3864            }
3865
3866            // Decode unknown envelopes for gaps in ordinals.
3867            while _next_ordinal_to_read < 10 {
3868                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3869                _next_ordinal_to_read += 1;
3870                next_offset += envelope_size;
3871            }
3872
3873            let next_out_of_line = decoder.next_out_of_line();
3874            let handles_before = decoder.remaining_handles();
3875            if let Some((inlined, num_bytes, num_handles)) =
3876                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3877            {
3878                let member_inline_size =
3879                    <Health as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3880                if inlined != (member_inline_size <= 4) {
3881                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3882                }
3883                let inner_offset;
3884                let mut inner_depth = depth.clone();
3885                if inlined {
3886                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3887                    inner_offset = next_offset;
3888                } else {
3889                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3890                    inner_depth.increment()?;
3891                }
3892                let val_ref = self.health.get_or_insert_with(|| fidl::new_empty!(Health, D));
3893                fidl::decode!(Health, D, val_ref, decoder, inner_offset, inner_depth)?;
3894                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3895                {
3896                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3897                }
3898                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3899                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3900                }
3901            }
3902
3903            next_offset += envelope_size;
3904            _next_ordinal_to_read += 1;
3905            if next_offset >= end_offset {
3906                return Ok(());
3907            }
3908
3909            // Decode unknown envelopes for gaps in ordinals.
3910            while _next_ordinal_to_read < 11 {
3911                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3912                _next_ordinal_to_read += 1;
3913                next_offset += envelope_size;
3914            }
3915
3916            let next_out_of_line = decoder.next_out_of_line();
3917            let handles_before = decoder.remaining_handles();
3918            if let Some((inlined, num_bytes, num_handles)) =
3919                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3920            {
3921                let member_inline_size =
3922                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3923                if inlined != (member_inline_size <= 4) {
3924                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3925                }
3926                let inner_offset;
3927                let mut inner_depth = depth.clone();
3928                if inlined {
3929                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3930                    inner_offset = next_offset;
3931                } else {
3932                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3933                    inner_depth.increment()?;
3934                }
3935                let val_ref =
3936                    self.charge_term_current_ua.get_or_insert_with(|| fidl::new_empty!(u32, D));
3937                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3938                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3939                {
3940                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3941                }
3942                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3943                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3944                }
3945            }
3946
3947            next_offset += envelope_size;
3948            _next_ordinal_to_read += 1;
3949            if next_offset >= end_offset {
3950                return Ok(());
3951            }
3952
3953            // Decode unknown envelopes for gaps in ordinals.
3954            while _next_ordinal_to_read < 12 {
3955                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3956                _next_ordinal_to_read += 1;
3957                next_offset += envelope_size;
3958            }
3959
3960            let next_out_of_line = decoder.next_out_of_line();
3961            let handles_before = decoder.remaining_handles();
3962            if let Some((inlined, num_bytes, num_handles)) =
3963                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3964            {
3965                let member_inline_size =
3966                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3967                if inlined != (member_inline_size <= 4) {
3968                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3969                }
3970                let inner_offset;
3971                let mut inner_depth = depth.clone();
3972                if inlined {
3973                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3974                    inner_offset = next_offset;
3975                } else {
3976                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3977                    inner_depth.increment()?;
3978                }
3979                let val_ref =
3980                    self.input_voltage_limit_uv.get_or_insert_with(|| fidl::new_empty!(u32, D));
3981                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3982                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3983                {
3984                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3985                }
3986                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3987                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3988                }
3989            }
3990
3991            next_offset += envelope_size;
3992            _next_ordinal_to_read += 1;
3993            if next_offset >= end_offset {
3994                return Ok(());
3995            }
3996
3997            // Decode unknown envelopes for gaps in ordinals.
3998            while _next_ordinal_to_read < 13 {
3999                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4000                _next_ordinal_to_read += 1;
4001                next_offset += envelope_size;
4002            }
4003
4004            let next_out_of_line = decoder.next_out_of_line();
4005            let handles_before = decoder.remaining_handles();
4006            if let Some((inlined, num_bytes, num_handles)) =
4007                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4008            {
4009                let member_inline_size =
4010                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4011                if inlined != (member_inline_size <= 4) {
4012                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4013                }
4014                let inner_offset;
4015                let mut inner_depth = depth.clone();
4016                if inlined {
4017                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4018                    inner_offset = next_offset;
4019                } else {
4020                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4021                    inner_depth.increment()?;
4022                }
4023                let val_ref = self.top_off_duration.get_or_insert_with(|| fidl::new_empty!(i64, D));
4024                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
4025                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4026                {
4027                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4028                }
4029                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4030                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4031                }
4032            }
4033
4034            next_offset += envelope_size;
4035
4036            // Decode the remaining unknown envelopes.
4037            while next_offset < end_offset {
4038                _next_ordinal_to_read += 1;
4039                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4040                next_offset += envelope_size;
4041            }
4042
4043            Ok(())
4044        }
4045    }
4046
4047    impl WatchOptions {
4048        #[inline(always)]
4049        fn max_ordinal_present(&self) -> u64 {
4050            if let Some(_) = self.wake_on_max_interval {
4051                return 4;
4052            }
4053            if let Some(_) = self.max_interval {
4054                return 3;
4055            }
4056            if let Some(_) = self.wake_on {
4057                return 2;
4058            }
4059            if let Some(_) = self.interest {
4060                return 1;
4061            }
4062            0
4063        }
4064    }
4065
4066    impl fidl::encoding::ValueTypeMarker for WatchOptions {
4067        type Borrowed<'a> = &'a Self;
4068        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4069            value
4070        }
4071    }
4072
4073    unsafe impl fidl::encoding::TypeMarker for WatchOptions {
4074        type Owned = Self;
4075
4076        #[inline(always)]
4077        fn inline_align(_context: fidl::encoding::Context) -> usize {
4078            8
4079        }
4080
4081        #[inline(always)]
4082        fn inline_size(_context: fidl::encoding::Context) -> usize {
4083            16
4084        }
4085    }
4086
4087    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<WatchOptions, D>
4088        for &WatchOptions
4089    {
4090        unsafe fn encode(
4091            self,
4092            encoder: &mut fidl::encoding::Encoder<'_, D>,
4093            offset: usize,
4094            mut depth: fidl::encoding::Depth,
4095        ) -> fidl::Result<()> {
4096            encoder.debug_check_bounds::<WatchOptions>(offset);
4097            // Vector header
4098            let max_ordinal: u64 = self.max_ordinal_present();
4099            encoder.write_num(max_ordinal, offset);
4100            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4101            // Calling encoder.out_of_line_offset(0) is not allowed.
4102            if max_ordinal == 0 {
4103                return Ok(());
4104            }
4105            depth.increment()?;
4106            let envelope_size = 8;
4107            let bytes_len = max_ordinal as usize * envelope_size;
4108            #[allow(unused_variables)]
4109            let offset = encoder.out_of_line_offset(bytes_len);
4110            let mut _prev_end_offset: usize = 0;
4111            if 1 > max_ordinal {
4112                return Ok(());
4113            }
4114
4115            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4116            // are envelope_size bytes.
4117            let cur_offset: usize = (1 - 1) * envelope_size;
4118
4119            // Zero reserved fields.
4120            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4121
4122            // Safety:
4123            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4124            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4125            //   envelope_size bytes, there is always sufficient room.
4126            fidl::encoding::encode_in_envelope_optional::<Status, D>(
4127                self.interest.as_ref().map(<Status as fidl::encoding::ValueTypeMarker>::borrow),
4128                encoder,
4129                offset + cur_offset,
4130                depth,
4131            )?;
4132
4133            _prev_end_offset = cur_offset + envelope_size;
4134            if 2 > max_ordinal {
4135                return Ok(());
4136            }
4137
4138            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4139            // are envelope_size bytes.
4140            let cur_offset: usize = (2 - 1) * envelope_size;
4141
4142            // Zero reserved fields.
4143            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4144
4145            // Safety:
4146            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4147            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4148            //   envelope_size bytes, there is always sufficient room.
4149            fidl::encoding::encode_in_envelope_optional::<Status, D>(
4150                self.wake_on.as_ref().map(<Status as fidl::encoding::ValueTypeMarker>::borrow),
4151                encoder,
4152                offset + cur_offset,
4153                depth,
4154            )?;
4155
4156            _prev_end_offset = cur_offset + envelope_size;
4157            if 3 > max_ordinal {
4158                return Ok(());
4159            }
4160
4161            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4162            // are envelope_size bytes.
4163            let cur_offset: usize = (3 - 1) * envelope_size;
4164
4165            // Zero reserved fields.
4166            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4167
4168            // Safety:
4169            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4170            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4171            //   envelope_size bytes, there is always sufficient room.
4172            fidl::encoding::encode_in_envelope_optional::<i64, D>(
4173                self.max_interval.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
4174                encoder,
4175                offset + cur_offset,
4176                depth,
4177            )?;
4178
4179            _prev_end_offset = cur_offset + envelope_size;
4180            if 4 > max_ordinal {
4181                return Ok(());
4182            }
4183
4184            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4185            // are envelope_size bytes.
4186            let cur_offset: usize = (4 - 1) * envelope_size;
4187
4188            // Zero reserved fields.
4189            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4190
4191            // Safety:
4192            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4193            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4194            //   envelope_size bytes, there is always sufficient room.
4195            fidl::encoding::encode_in_envelope_optional::<bool, D>(
4196                self.wake_on_max_interval
4197                    .as_ref()
4198                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
4199                encoder,
4200                offset + cur_offset,
4201                depth,
4202            )?;
4203
4204            _prev_end_offset = cur_offset + envelope_size;
4205
4206            Ok(())
4207        }
4208    }
4209
4210    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for WatchOptions {
4211        #[inline(always)]
4212        fn new_empty() -> Self {
4213            Self::default()
4214        }
4215
4216        unsafe fn decode(
4217            &mut self,
4218            decoder: &mut fidl::encoding::Decoder<'_, D>,
4219            offset: usize,
4220            mut depth: fidl::encoding::Depth,
4221        ) -> fidl::Result<()> {
4222            decoder.debug_check_bounds::<Self>(offset);
4223            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4224                None => return Err(fidl::Error::NotNullable),
4225                Some(len) => len,
4226            };
4227            // Calling decoder.out_of_line_offset(0) is not allowed.
4228            if len == 0 {
4229                return Ok(());
4230            };
4231            depth.increment()?;
4232            let envelope_size = 8;
4233            let bytes_len = len * envelope_size;
4234            let offset = decoder.out_of_line_offset(bytes_len)?;
4235            // Decode the envelope for each type.
4236            let mut _next_ordinal_to_read = 0;
4237            let mut next_offset = offset;
4238            let end_offset = offset + bytes_len;
4239            _next_ordinal_to_read += 1;
4240            if next_offset >= end_offset {
4241                return Ok(());
4242            }
4243
4244            // Decode unknown envelopes for gaps in ordinals.
4245            while _next_ordinal_to_read < 1 {
4246                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4247                _next_ordinal_to_read += 1;
4248                next_offset += envelope_size;
4249            }
4250
4251            let next_out_of_line = decoder.next_out_of_line();
4252            let handles_before = decoder.remaining_handles();
4253            if let Some((inlined, num_bytes, num_handles)) =
4254                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4255            {
4256                let member_inline_size =
4257                    <Status as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4258                if inlined != (member_inline_size <= 4) {
4259                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4260                }
4261                let inner_offset;
4262                let mut inner_depth = depth.clone();
4263                if inlined {
4264                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4265                    inner_offset = next_offset;
4266                } else {
4267                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4268                    inner_depth.increment()?;
4269                }
4270                let val_ref = self.interest.get_or_insert_with(|| fidl::new_empty!(Status, D));
4271                fidl::decode!(Status, D, val_ref, decoder, inner_offset, inner_depth)?;
4272                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4273                {
4274                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4275                }
4276                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4277                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4278                }
4279            }
4280
4281            next_offset += envelope_size;
4282            _next_ordinal_to_read += 1;
4283            if next_offset >= end_offset {
4284                return Ok(());
4285            }
4286
4287            // Decode unknown envelopes for gaps in ordinals.
4288            while _next_ordinal_to_read < 2 {
4289                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4290                _next_ordinal_to_read += 1;
4291                next_offset += envelope_size;
4292            }
4293
4294            let next_out_of_line = decoder.next_out_of_line();
4295            let handles_before = decoder.remaining_handles();
4296            if let Some((inlined, num_bytes, num_handles)) =
4297                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4298            {
4299                let member_inline_size =
4300                    <Status as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4301                if inlined != (member_inline_size <= 4) {
4302                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4303                }
4304                let inner_offset;
4305                let mut inner_depth = depth.clone();
4306                if inlined {
4307                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4308                    inner_offset = next_offset;
4309                } else {
4310                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4311                    inner_depth.increment()?;
4312                }
4313                let val_ref = self.wake_on.get_or_insert_with(|| fidl::new_empty!(Status, D));
4314                fidl::decode!(Status, D, val_ref, decoder, inner_offset, inner_depth)?;
4315                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4316                {
4317                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4318                }
4319                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4320                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4321                }
4322            }
4323
4324            next_offset += envelope_size;
4325            _next_ordinal_to_read += 1;
4326            if next_offset >= end_offset {
4327                return Ok(());
4328            }
4329
4330            // Decode unknown envelopes for gaps in ordinals.
4331            while _next_ordinal_to_read < 3 {
4332                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4333                _next_ordinal_to_read += 1;
4334                next_offset += envelope_size;
4335            }
4336
4337            let next_out_of_line = decoder.next_out_of_line();
4338            let handles_before = decoder.remaining_handles();
4339            if let Some((inlined, num_bytes, num_handles)) =
4340                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4341            {
4342                let member_inline_size =
4343                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4344                if inlined != (member_inline_size <= 4) {
4345                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4346                }
4347                let inner_offset;
4348                let mut inner_depth = depth.clone();
4349                if inlined {
4350                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4351                    inner_offset = next_offset;
4352                } else {
4353                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4354                    inner_depth.increment()?;
4355                }
4356                let val_ref = self.max_interval.get_or_insert_with(|| fidl::new_empty!(i64, D));
4357                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
4358                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4359                {
4360                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4361                }
4362                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4363                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4364                }
4365            }
4366
4367            next_offset += envelope_size;
4368            _next_ordinal_to_read += 1;
4369            if next_offset >= end_offset {
4370                return Ok(());
4371            }
4372
4373            // Decode unknown envelopes for gaps in ordinals.
4374            while _next_ordinal_to_read < 4 {
4375                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4376                _next_ordinal_to_read += 1;
4377                next_offset += envelope_size;
4378            }
4379
4380            let next_out_of_line = decoder.next_out_of_line();
4381            let handles_before = decoder.remaining_handles();
4382            if let Some((inlined, num_bytes, num_handles)) =
4383                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4384            {
4385                let member_inline_size =
4386                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4387                if inlined != (member_inline_size <= 4) {
4388                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4389                }
4390                let inner_offset;
4391                let mut inner_depth = depth.clone();
4392                if inlined {
4393                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4394                    inner_offset = next_offset;
4395                } else {
4396                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4397                    inner_depth.increment()?;
4398                }
4399                let val_ref =
4400                    self.wake_on_max_interval.get_or_insert_with(|| fidl::new_empty!(bool, D));
4401                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
4402                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4403                {
4404                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4405                }
4406                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4407                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4408                }
4409            }
4410
4411            next_offset += envelope_size;
4412
4413            // Decode the remaining unknown envelopes.
4414            while next_offset < end_offset {
4415                _next_ordinal_to_read += 1;
4416                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4417                next_offset += envelope_size;
4418            }
4419
4420            Ok(())
4421        }
4422    }
4423}