Skip to main content

fidl_fuchsia_hardware_google_odpm_common/
fidl_fuchsia_hardware_google_odpm_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/// An arbitrary, human-readable string that uniquely identifies a power rail.
12pub type RailName = String;
13
14/// Maximum number of available power rails supported by the hardware.
15pub const MAX_AVAILABLE_RAILS: u32 = 128;
16
17/// Maximum number of actively-monitored power rails.
18pub const MAX_RAILS: u32 = 32;
19
20pub const MAX_RAIL_NAME_SIZE: u32 = 256;
21
22/// Minimum allowed hardware polling interval (10 ms).
23pub const MIN_POLL_INTERVAL: i64 = 10000000;
24
25#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
26pub enum MeasurementType {
27    /// Average measurement over a time interval (default).
28    Average,
29    /// Instantaneous snapshot.
30    Instantaneous,
31    /// Cumulative measurement over a time interval.
32    Cumulative,
33    #[doc(hidden)]
34    __SourceBreaking { unknown_ordinal: u32 },
35}
36
37/// Pattern that matches an unknown `MeasurementType` member.
38#[macro_export]
39macro_rules! MeasurementTypeUnknown {
40    () => {
41        _
42    };
43}
44
45impl MeasurementType {
46    #[inline]
47    pub fn from_primitive(prim: u32) -> Option<Self> {
48        match prim {
49            1 => Some(Self::Average),
50            2 => Some(Self::Instantaneous),
51            3 => Some(Self::Cumulative),
52            _ => None,
53        }
54    }
55
56    #[inline]
57    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
58        match prim {
59            1 => Self::Average,
60            2 => Self::Instantaneous,
61            3 => Self::Cumulative,
62            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
63        }
64    }
65
66    #[inline]
67    pub fn unknown() -> Self {
68        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
69    }
70
71    #[inline]
72    pub const fn into_primitive(self) -> u32 {
73        match self {
74            Self::Average => 1,
75            Self::Instantaneous => 2,
76            Self::Cumulative => 3,
77            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
78        }
79    }
80
81    #[inline]
82    pub fn is_unknown(&self) -> bool {
83        match self {
84            Self::__SourceBreaking { unknown_ordinal: _ } => true,
85            _ => false,
86        }
87    }
88}
89
90#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
91pub struct OdpmDeviceSetChannelRailRequest {
92    pub channel_id: u32,
93    pub rail_name: String,
94}
95
96impl fidl::Persistable for OdpmDeviceSetChannelRailRequest {}
97
98#[derive(Clone, Debug, PartialEq)]
99pub struct OdpmDeviceGetAvailableRailsResponse {
100    pub rails: Vec<RailMetadata>,
101}
102
103impl fidl::Persistable for OdpmDeviceGetAvailableRailsResponse {}
104
105#[derive(Clone, Debug, PartialEq)]
106pub struct OdpmDeviceGetCurrentAmperesResponse {
107    pub readings: Vec<CurrentReading>,
108}
109
110impl fidl::Persistable for OdpmDeviceGetCurrentAmperesResponse {}
111
112#[derive(Clone, Debug, PartialEq)]
113pub struct OdpmDeviceGetEnergyJoulesResponse {
114    pub readings: Vec<EnergyReading>,
115}
116
117impl fidl::Persistable for OdpmDeviceGetEnergyJoulesResponse {}
118
119#[derive(Clone, Debug, PartialEq)]
120pub struct OdpmDeviceGetPowerWattsResponse {
121    pub readings: Vec<PowerReading>,
122}
123
124impl fidl::Persistable for OdpmDeviceGetPowerWattsResponse {}
125
126#[derive(Clone, Debug, PartialEq)]
127pub struct OdpmDeviceGetRailMetadataResponse {
128    pub rails: Vec<RailMetadata>,
129}
130
131impl fidl::Persistable for OdpmDeviceGetRailMetadataResponse {}
132
133#[derive(Clone, Debug, Default, PartialEq)]
134pub struct CurrentReading {
135    /// Hardware channel index.
136    pub channel_id: Option<u32>,
137    /// Measured current in microamperes.
138    pub current_ua: Option<i32>,
139    /// Measurement time interval (omitted if unknown).
140    pub interval: Option<i64>,
141    /// Time when the reading was taken.
142    pub timestamp: Option<i64>,
143    #[doc(hidden)]
144    pub __source_breaking: fidl::marker::SourceBreaking,
145}
146
147impl fidl::Persistable for CurrentReading {}
148
149#[derive(Clone, Debug, Default, PartialEq)]
150pub struct EnergyReading {
151    /// Hardware channel index.
152    pub channel_id: Option<u32>,
153    /// Measured energy in microjoules.
154    pub energy_uj: Option<i64>,
155    /// Measurement time interval (omitted if unknown).
156    pub interval: Option<i64>,
157    /// Time when the reading was taken.
158    pub timestamp: Option<i64>,
159    #[doc(hidden)]
160    pub __source_breaking: fidl::marker::SourceBreaking,
161}
162
163impl fidl::Persistable for EnergyReading {}
164
165#[derive(Clone, Debug, Default, PartialEq)]
166pub struct Options {
167    /// Specifies the type of measurement desired.
168    /// Defaults to `AVERAGE` if omitted.
169    pub measurement_type: Option<MeasurementType>,
170    #[doc(hidden)]
171    pub __source_breaking: fidl::marker::SourceBreaking,
172}
173
174impl fidl::Persistable for Options {}
175
176/// Configuration options for the ODPM driver hardware polling loop.
177#[derive(Clone, Debug, Default, PartialEq)]
178pub struct PollingConfig {
179    /// Driver's baseline polling interval. Must be at least `MIN_POLL_INTERVAL`.
180    pub poll_interval: Option<i64>,
181    /// Number of hardware polls per Inspect/trace time-series entry.
182    pub polls_per_series_entry: Option<u32>,
183    #[doc(hidden)]
184    pub __source_breaking: fidl::marker::SourceBreaking,
185}
186
187impl fidl::Persistable for PollingConfig {}
188
189#[derive(Clone, Debug, Default, PartialEq)]
190pub struct PowerReading {
191    /// Hardware channel index.
192    pub channel_id: Option<u32>,
193    /// Measured power in microwatts.
194    pub power_uw: Option<i32>,
195    /// Measurement time interval (omitted if unknown).
196    pub interval: Option<i64>,
197    /// Time when the reading was taken.
198    pub timestamp: Option<i64>,
199    #[doc(hidden)]
200    pub __source_breaking: fidl::marker::SourceBreaking,
201}
202
203impl fidl::Persistable for PowerReading {}
204
205#[derive(Clone, Debug, Default, PartialEq)]
206pub struct RailMetadata {
207    /// Canonical identifier for the rail (e.g. "cpu_big", "gpu").
208    pub name: Option<String>,
209    /// Hardware channel index. Present if the rail is currently actively monitored;
210    /// omitted if the rail is not currently assigned to a channel.
211    pub channel_id: Option<u32>,
212    /// Schematic name of the rail (e.g. "S2M_VDD_CPU2").
213    pub schematic_name: Option<String>,
214    /// PMIC regulator or shunt identifier (e.g. "buck_2m", "ldo_26m", "VSEN_C1").
215    pub regulator_name: Option<String>,
216    /// Boot timestamp when the current (or most recent) measurement window started.
217    /// Present if the rail is currently monitored or was previously monitored.
218    pub measurement_start: Option<fidl::BootInstant>,
219    /// Boot timestamp when measurement of this rail stopped.
220    /// Present only if the rail was previously monitored and then swapped out.
221    pub measurement_stop: Option<fidl::BootInstant>,
222    /// Accumulated energy in microjoules over `[measurement_start, measurement_stop]`.
223    /// Present only if the rail was previously monitored and then swapped out.
224    pub energy_uj: Option<i64>,
225    #[doc(hidden)]
226    pub __source_breaking: fidl::marker::SourceBreaking,
227}
228
229impl fidl::Persistable for RailMetadata {}
230
231pub mod odpm_device_ordinals {
232    pub const GET_RAIL_METADATA: u64 = 0x1370e2e1a26954e7;
233    pub const GET_AVAILABLE_RAILS: u64 = 0x5d2f432497df351a;
234    pub const SET_CHANNEL_RAIL: u64 = 0x59748499a188a657;
235    pub const GET_POWER_WATTS: u64 = 0x2e26ec237d170791;
236    pub const GET_CURRENT_AMPERES: u64 = 0x2efa123da8afbcec;
237    pub const GET_ENERGY_JOULES: u64 = 0x25bf6e4b27991b1c;
238    pub const SET_POLLING_CONFIG: u64 = 0x23821a66e6c6647d;
239    pub const GET_POLLING_CONFIG: u64 = 0x476f23167a254bd3;
240    pub const RESET_POLLING_CONFIG: u64 = 0x182591ccbe96a9d;
241}
242
243mod internal {
244    use super::*;
245    unsafe impl fidl::encoding::TypeMarker for MeasurementType {
246        type Owned = Self;
247
248        #[inline(always)]
249        fn inline_align(_context: fidl::encoding::Context) -> usize {
250            std::mem::align_of::<u32>()
251        }
252
253        #[inline(always)]
254        fn inline_size(_context: fidl::encoding::Context) -> usize {
255            std::mem::size_of::<u32>()
256        }
257
258        #[inline(always)]
259        fn encode_is_copy() -> bool {
260            false
261        }
262
263        #[inline(always)]
264        fn decode_is_copy() -> bool {
265            false
266        }
267    }
268
269    impl fidl::encoding::ValueTypeMarker for MeasurementType {
270        type Borrowed<'a> = Self;
271        #[inline(always)]
272        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
273            *value
274        }
275    }
276
277    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
278        for MeasurementType
279    {
280        #[inline]
281        unsafe fn encode(
282            self,
283            encoder: &mut fidl::encoding::Encoder<'_, D>,
284            offset: usize,
285            _depth: fidl::encoding::Depth,
286        ) -> fidl::Result<()> {
287            encoder.debug_check_bounds::<Self>(offset);
288            encoder.write_num(self.into_primitive(), offset);
289            Ok(())
290        }
291    }
292
293    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for MeasurementType {
294        #[inline(always)]
295        fn new_empty() -> Self {
296            Self::unknown()
297        }
298
299        #[inline]
300        unsafe fn decode(
301            &mut self,
302            decoder: &mut fidl::encoding::Decoder<'_, D>,
303            offset: usize,
304            _depth: fidl::encoding::Depth,
305        ) -> fidl::Result<()> {
306            decoder.debug_check_bounds::<Self>(offset);
307            let prim = decoder.read_num::<u32>(offset);
308
309            *self = Self::from_primitive_allow_unknown(prim);
310            Ok(())
311        }
312    }
313
314    impl fidl::encoding::ValueTypeMarker for OdpmDeviceSetChannelRailRequest {
315        type Borrowed<'a> = &'a Self;
316        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
317            value
318        }
319    }
320
321    unsafe impl fidl::encoding::TypeMarker for OdpmDeviceSetChannelRailRequest {
322        type Owned = Self;
323
324        #[inline(always)]
325        fn inline_align(_context: fidl::encoding::Context) -> usize {
326            8
327        }
328
329        #[inline(always)]
330        fn inline_size(_context: fidl::encoding::Context) -> usize {
331            24
332        }
333    }
334
335    unsafe impl<D: fidl::encoding::ResourceDialect>
336        fidl::encoding::Encode<OdpmDeviceSetChannelRailRequest, D>
337        for &OdpmDeviceSetChannelRailRequest
338    {
339        #[inline]
340        unsafe fn encode(
341            self,
342            encoder: &mut fidl::encoding::Encoder<'_, D>,
343            offset: usize,
344            _depth: fidl::encoding::Depth,
345        ) -> fidl::Result<()> {
346            encoder.debug_check_bounds::<OdpmDeviceSetChannelRailRequest>(offset);
347            // Delegate to tuple encoding.
348            fidl::encoding::Encode::<OdpmDeviceSetChannelRailRequest, D>::encode(
349                (
350                    <u32 as fidl::encoding::ValueTypeMarker>::borrow(&self.channel_id),
351                    <fidl::encoding::BoundedString<256> as fidl::encoding::ValueTypeMarker>::borrow(
352                        &self.rail_name,
353                    ),
354                ),
355                encoder,
356                offset,
357                _depth,
358            )
359        }
360    }
361    unsafe impl<
362        D: fidl::encoding::ResourceDialect,
363        T0: fidl::encoding::Encode<u32, D>,
364        T1: fidl::encoding::Encode<fidl::encoding::BoundedString<256>, D>,
365    > fidl::encoding::Encode<OdpmDeviceSetChannelRailRequest, D> for (T0, T1)
366    {
367        #[inline]
368        unsafe fn encode(
369            self,
370            encoder: &mut fidl::encoding::Encoder<'_, D>,
371            offset: usize,
372            depth: fidl::encoding::Depth,
373        ) -> fidl::Result<()> {
374            encoder.debug_check_bounds::<OdpmDeviceSetChannelRailRequest>(offset);
375            // Zero out padding regions. There's no need to apply masks
376            // because the unmasked parts will be overwritten by fields.
377            unsafe {
378                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
379                (ptr as *mut u64).write_unaligned(0);
380            }
381            // Write the fields.
382            self.0.encode(encoder, offset + 0, depth)?;
383            self.1.encode(encoder, offset + 8, depth)?;
384            Ok(())
385        }
386    }
387
388    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
389        for OdpmDeviceSetChannelRailRequest
390    {
391        #[inline(always)]
392        fn new_empty() -> Self {
393            Self {
394                channel_id: fidl::new_empty!(u32, D),
395                rail_name: fidl::new_empty!(fidl::encoding::BoundedString<256>, D),
396            }
397        }
398
399        #[inline]
400        unsafe fn decode(
401            &mut self,
402            decoder: &mut fidl::encoding::Decoder<'_, D>,
403            offset: usize,
404            _depth: fidl::encoding::Depth,
405        ) -> fidl::Result<()> {
406            decoder.debug_check_bounds::<Self>(offset);
407            // Verify that padding bytes are zero.
408            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
409            let padval = unsafe { (ptr as *const u64).read_unaligned() };
410            let mask = 0xffffffff00000000u64;
411            let maskedval = padval & mask;
412            if maskedval != 0 {
413                return Err(fidl::Error::NonZeroPadding {
414                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
415                });
416            }
417            fidl::decode!(u32, D, &mut self.channel_id, decoder, offset + 0, _depth)?;
418            fidl::decode!(
419                fidl::encoding::BoundedString<256>,
420                D,
421                &mut self.rail_name,
422                decoder,
423                offset + 8,
424                _depth
425            )?;
426            Ok(())
427        }
428    }
429
430    impl fidl::encoding::ValueTypeMarker for OdpmDeviceGetAvailableRailsResponse {
431        type Borrowed<'a> = &'a Self;
432        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
433            value
434        }
435    }
436
437    unsafe impl fidl::encoding::TypeMarker for OdpmDeviceGetAvailableRailsResponse {
438        type Owned = Self;
439
440        #[inline(always)]
441        fn inline_align(_context: fidl::encoding::Context) -> usize {
442            8
443        }
444
445        #[inline(always)]
446        fn inline_size(_context: fidl::encoding::Context) -> usize {
447            16
448        }
449    }
450
451    unsafe impl<D: fidl::encoding::ResourceDialect>
452        fidl::encoding::Encode<OdpmDeviceGetAvailableRailsResponse, D>
453        for &OdpmDeviceGetAvailableRailsResponse
454    {
455        #[inline]
456        unsafe fn encode(
457            self,
458            encoder: &mut fidl::encoding::Encoder<'_, D>,
459            offset: usize,
460            _depth: fidl::encoding::Depth,
461        ) -> fidl::Result<()> {
462            encoder.debug_check_bounds::<OdpmDeviceGetAvailableRailsResponse>(offset);
463            // Delegate to tuple encoding.
464            fidl::encoding::Encode::<OdpmDeviceGetAvailableRailsResponse, D>::encode(
465                (
466                    <fidl::encoding::Vector<RailMetadata, 128> as fidl::encoding::ValueTypeMarker>::borrow(&self.rails),
467                ),
468                encoder, offset, _depth
469            )
470        }
471    }
472    unsafe impl<
473        D: fidl::encoding::ResourceDialect,
474        T0: fidl::encoding::Encode<fidl::encoding::Vector<RailMetadata, 128>, D>,
475    > fidl::encoding::Encode<OdpmDeviceGetAvailableRailsResponse, D> for (T0,)
476    {
477        #[inline]
478        unsafe fn encode(
479            self,
480            encoder: &mut fidl::encoding::Encoder<'_, D>,
481            offset: usize,
482            depth: fidl::encoding::Depth,
483        ) -> fidl::Result<()> {
484            encoder.debug_check_bounds::<OdpmDeviceGetAvailableRailsResponse>(offset);
485            // Zero out padding regions. There's no need to apply masks
486            // because the unmasked parts will be overwritten by fields.
487            // Write the fields.
488            self.0.encode(encoder, offset + 0, depth)?;
489            Ok(())
490        }
491    }
492
493    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
494        for OdpmDeviceGetAvailableRailsResponse
495    {
496        #[inline(always)]
497        fn new_empty() -> Self {
498            Self { rails: fidl::new_empty!(fidl::encoding::Vector<RailMetadata, 128>, D) }
499        }
500
501        #[inline]
502        unsafe fn decode(
503            &mut self,
504            decoder: &mut fidl::encoding::Decoder<'_, D>,
505            offset: usize,
506            _depth: fidl::encoding::Depth,
507        ) -> fidl::Result<()> {
508            decoder.debug_check_bounds::<Self>(offset);
509            // Verify that padding bytes are zero.
510            fidl::decode!(fidl::encoding::Vector<RailMetadata, 128>, D, &mut self.rails, decoder, offset + 0, _depth)?;
511            Ok(())
512        }
513    }
514
515    impl fidl::encoding::ValueTypeMarker for OdpmDeviceGetCurrentAmperesResponse {
516        type Borrowed<'a> = &'a Self;
517        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
518            value
519        }
520    }
521
522    unsafe impl fidl::encoding::TypeMarker for OdpmDeviceGetCurrentAmperesResponse {
523        type Owned = Self;
524
525        #[inline(always)]
526        fn inline_align(_context: fidl::encoding::Context) -> usize {
527            8
528        }
529
530        #[inline(always)]
531        fn inline_size(_context: fidl::encoding::Context) -> usize {
532            16
533        }
534    }
535
536    unsafe impl<D: fidl::encoding::ResourceDialect>
537        fidl::encoding::Encode<OdpmDeviceGetCurrentAmperesResponse, D>
538        for &OdpmDeviceGetCurrentAmperesResponse
539    {
540        #[inline]
541        unsafe fn encode(
542            self,
543            encoder: &mut fidl::encoding::Encoder<'_, D>,
544            offset: usize,
545            _depth: fidl::encoding::Depth,
546        ) -> fidl::Result<()> {
547            encoder.debug_check_bounds::<OdpmDeviceGetCurrentAmperesResponse>(offset);
548            // Delegate to tuple encoding.
549            fidl::encoding::Encode::<OdpmDeviceGetCurrentAmperesResponse, D>::encode(
550                (
551                    <fidl::encoding::Vector<CurrentReading, 32> as fidl::encoding::ValueTypeMarker>::borrow(&self.readings),
552                ),
553                encoder, offset, _depth
554            )
555        }
556    }
557    unsafe impl<
558        D: fidl::encoding::ResourceDialect,
559        T0: fidl::encoding::Encode<fidl::encoding::Vector<CurrentReading, 32>, D>,
560    > fidl::encoding::Encode<OdpmDeviceGetCurrentAmperesResponse, D> for (T0,)
561    {
562        #[inline]
563        unsafe fn encode(
564            self,
565            encoder: &mut fidl::encoding::Encoder<'_, D>,
566            offset: usize,
567            depth: fidl::encoding::Depth,
568        ) -> fidl::Result<()> {
569            encoder.debug_check_bounds::<OdpmDeviceGetCurrentAmperesResponse>(offset);
570            // Zero out padding regions. There's no need to apply masks
571            // because the unmasked parts will be overwritten by fields.
572            // Write the fields.
573            self.0.encode(encoder, offset + 0, depth)?;
574            Ok(())
575        }
576    }
577
578    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
579        for OdpmDeviceGetCurrentAmperesResponse
580    {
581        #[inline(always)]
582        fn new_empty() -> Self {
583            Self { readings: fidl::new_empty!(fidl::encoding::Vector<CurrentReading, 32>, D) }
584        }
585
586        #[inline]
587        unsafe fn decode(
588            &mut self,
589            decoder: &mut fidl::encoding::Decoder<'_, D>,
590            offset: usize,
591            _depth: fidl::encoding::Depth,
592        ) -> fidl::Result<()> {
593            decoder.debug_check_bounds::<Self>(offset);
594            // Verify that padding bytes are zero.
595            fidl::decode!(fidl::encoding::Vector<CurrentReading, 32>, D, &mut self.readings, decoder, offset + 0, _depth)?;
596            Ok(())
597        }
598    }
599
600    impl fidl::encoding::ValueTypeMarker for OdpmDeviceGetEnergyJoulesResponse {
601        type Borrowed<'a> = &'a Self;
602        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
603            value
604        }
605    }
606
607    unsafe impl fidl::encoding::TypeMarker for OdpmDeviceGetEnergyJoulesResponse {
608        type Owned = Self;
609
610        #[inline(always)]
611        fn inline_align(_context: fidl::encoding::Context) -> usize {
612            8
613        }
614
615        #[inline(always)]
616        fn inline_size(_context: fidl::encoding::Context) -> usize {
617            16
618        }
619    }
620
621    unsafe impl<D: fidl::encoding::ResourceDialect>
622        fidl::encoding::Encode<OdpmDeviceGetEnergyJoulesResponse, D>
623        for &OdpmDeviceGetEnergyJoulesResponse
624    {
625        #[inline]
626        unsafe fn encode(
627            self,
628            encoder: &mut fidl::encoding::Encoder<'_, D>,
629            offset: usize,
630            _depth: fidl::encoding::Depth,
631        ) -> fidl::Result<()> {
632            encoder.debug_check_bounds::<OdpmDeviceGetEnergyJoulesResponse>(offset);
633            // Delegate to tuple encoding.
634            fidl::encoding::Encode::<OdpmDeviceGetEnergyJoulesResponse, D>::encode(
635                (
636                    <fidl::encoding::Vector<EnergyReading, 32> as fidl::encoding::ValueTypeMarker>::borrow(&self.readings),
637                ),
638                encoder, offset, _depth
639            )
640        }
641    }
642    unsafe impl<
643        D: fidl::encoding::ResourceDialect,
644        T0: fidl::encoding::Encode<fidl::encoding::Vector<EnergyReading, 32>, D>,
645    > fidl::encoding::Encode<OdpmDeviceGetEnergyJoulesResponse, D> for (T0,)
646    {
647        #[inline]
648        unsafe fn encode(
649            self,
650            encoder: &mut fidl::encoding::Encoder<'_, D>,
651            offset: usize,
652            depth: fidl::encoding::Depth,
653        ) -> fidl::Result<()> {
654            encoder.debug_check_bounds::<OdpmDeviceGetEnergyJoulesResponse>(offset);
655            // Zero out padding regions. There's no need to apply masks
656            // because the unmasked parts will be overwritten by fields.
657            // Write the fields.
658            self.0.encode(encoder, offset + 0, depth)?;
659            Ok(())
660        }
661    }
662
663    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
664        for OdpmDeviceGetEnergyJoulesResponse
665    {
666        #[inline(always)]
667        fn new_empty() -> Self {
668            Self { readings: fidl::new_empty!(fidl::encoding::Vector<EnergyReading, 32>, D) }
669        }
670
671        #[inline]
672        unsafe fn decode(
673            &mut self,
674            decoder: &mut fidl::encoding::Decoder<'_, D>,
675            offset: usize,
676            _depth: fidl::encoding::Depth,
677        ) -> fidl::Result<()> {
678            decoder.debug_check_bounds::<Self>(offset);
679            // Verify that padding bytes are zero.
680            fidl::decode!(fidl::encoding::Vector<EnergyReading, 32>, D, &mut self.readings, decoder, offset + 0, _depth)?;
681            Ok(())
682        }
683    }
684
685    impl fidl::encoding::ValueTypeMarker for OdpmDeviceGetPowerWattsResponse {
686        type Borrowed<'a> = &'a Self;
687        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
688            value
689        }
690    }
691
692    unsafe impl fidl::encoding::TypeMarker for OdpmDeviceGetPowerWattsResponse {
693        type Owned = Self;
694
695        #[inline(always)]
696        fn inline_align(_context: fidl::encoding::Context) -> usize {
697            8
698        }
699
700        #[inline(always)]
701        fn inline_size(_context: fidl::encoding::Context) -> usize {
702            16
703        }
704    }
705
706    unsafe impl<D: fidl::encoding::ResourceDialect>
707        fidl::encoding::Encode<OdpmDeviceGetPowerWattsResponse, D>
708        for &OdpmDeviceGetPowerWattsResponse
709    {
710        #[inline]
711        unsafe fn encode(
712            self,
713            encoder: &mut fidl::encoding::Encoder<'_, D>,
714            offset: usize,
715            _depth: fidl::encoding::Depth,
716        ) -> fidl::Result<()> {
717            encoder.debug_check_bounds::<OdpmDeviceGetPowerWattsResponse>(offset);
718            // Delegate to tuple encoding.
719            fidl::encoding::Encode::<OdpmDeviceGetPowerWattsResponse, D>::encode(
720                (
721                    <fidl::encoding::Vector<PowerReading, 32> as fidl::encoding::ValueTypeMarker>::borrow(&self.readings),
722                ),
723                encoder, offset, _depth
724            )
725        }
726    }
727    unsafe impl<
728        D: fidl::encoding::ResourceDialect,
729        T0: fidl::encoding::Encode<fidl::encoding::Vector<PowerReading, 32>, D>,
730    > fidl::encoding::Encode<OdpmDeviceGetPowerWattsResponse, D> for (T0,)
731    {
732        #[inline]
733        unsafe fn encode(
734            self,
735            encoder: &mut fidl::encoding::Encoder<'_, D>,
736            offset: usize,
737            depth: fidl::encoding::Depth,
738        ) -> fidl::Result<()> {
739            encoder.debug_check_bounds::<OdpmDeviceGetPowerWattsResponse>(offset);
740            // Zero out padding regions. There's no need to apply masks
741            // because the unmasked parts will be overwritten by fields.
742            // Write the fields.
743            self.0.encode(encoder, offset + 0, depth)?;
744            Ok(())
745        }
746    }
747
748    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
749        for OdpmDeviceGetPowerWattsResponse
750    {
751        #[inline(always)]
752        fn new_empty() -> Self {
753            Self { readings: fidl::new_empty!(fidl::encoding::Vector<PowerReading, 32>, D) }
754        }
755
756        #[inline]
757        unsafe fn decode(
758            &mut self,
759            decoder: &mut fidl::encoding::Decoder<'_, D>,
760            offset: usize,
761            _depth: fidl::encoding::Depth,
762        ) -> fidl::Result<()> {
763            decoder.debug_check_bounds::<Self>(offset);
764            // Verify that padding bytes are zero.
765            fidl::decode!(fidl::encoding::Vector<PowerReading, 32>, D, &mut self.readings, decoder, offset + 0, _depth)?;
766            Ok(())
767        }
768    }
769
770    impl fidl::encoding::ValueTypeMarker for OdpmDeviceGetRailMetadataResponse {
771        type Borrowed<'a> = &'a Self;
772        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
773            value
774        }
775    }
776
777    unsafe impl fidl::encoding::TypeMarker for OdpmDeviceGetRailMetadataResponse {
778        type Owned = Self;
779
780        #[inline(always)]
781        fn inline_align(_context: fidl::encoding::Context) -> usize {
782            8
783        }
784
785        #[inline(always)]
786        fn inline_size(_context: fidl::encoding::Context) -> usize {
787            16
788        }
789    }
790
791    unsafe impl<D: fidl::encoding::ResourceDialect>
792        fidl::encoding::Encode<OdpmDeviceGetRailMetadataResponse, D>
793        for &OdpmDeviceGetRailMetadataResponse
794    {
795        #[inline]
796        unsafe fn encode(
797            self,
798            encoder: &mut fidl::encoding::Encoder<'_, D>,
799            offset: usize,
800            _depth: fidl::encoding::Depth,
801        ) -> fidl::Result<()> {
802            encoder.debug_check_bounds::<OdpmDeviceGetRailMetadataResponse>(offset);
803            // Delegate to tuple encoding.
804            fidl::encoding::Encode::<OdpmDeviceGetRailMetadataResponse, D>::encode(
805                (
806                    <fidl::encoding::Vector<RailMetadata, 32> as fidl::encoding::ValueTypeMarker>::borrow(&self.rails),
807                ),
808                encoder, offset, _depth
809            )
810        }
811    }
812    unsafe impl<
813        D: fidl::encoding::ResourceDialect,
814        T0: fidl::encoding::Encode<fidl::encoding::Vector<RailMetadata, 32>, D>,
815    > fidl::encoding::Encode<OdpmDeviceGetRailMetadataResponse, D> for (T0,)
816    {
817        #[inline]
818        unsafe fn encode(
819            self,
820            encoder: &mut fidl::encoding::Encoder<'_, D>,
821            offset: usize,
822            depth: fidl::encoding::Depth,
823        ) -> fidl::Result<()> {
824            encoder.debug_check_bounds::<OdpmDeviceGetRailMetadataResponse>(offset);
825            // Zero out padding regions. There's no need to apply masks
826            // because the unmasked parts will be overwritten by fields.
827            // Write the fields.
828            self.0.encode(encoder, offset + 0, depth)?;
829            Ok(())
830        }
831    }
832
833    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
834        for OdpmDeviceGetRailMetadataResponse
835    {
836        #[inline(always)]
837        fn new_empty() -> Self {
838            Self { rails: fidl::new_empty!(fidl::encoding::Vector<RailMetadata, 32>, D) }
839        }
840
841        #[inline]
842        unsafe fn decode(
843            &mut self,
844            decoder: &mut fidl::encoding::Decoder<'_, D>,
845            offset: usize,
846            _depth: fidl::encoding::Depth,
847        ) -> fidl::Result<()> {
848            decoder.debug_check_bounds::<Self>(offset);
849            // Verify that padding bytes are zero.
850            fidl::decode!(fidl::encoding::Vector<RailMetadata, 32>, D, &mut self.rails, decoder, offset + 0, _depth)?;
851            Ok(())
852        }
853    }
854
855    impl CurrentReading {
856        #[inline(always)]
857        fn max_ordinal_present(&self) -> u64 {
858            if let Some(_) = self.timestamp {
859                return 4;
860            }
861            if let Some(_) = self.interval {
862                return 3;
863            }
864            if let Some(_) = self.current_ua {
865                return 2;
866            }
867            if let Some(_) = self.channel_id {
868                return 1;
869            }
870            0
871        }
872    }
873
874    impl fidl::encoding::ValueTypeMarker for CurrentReading {
875        type Borrowed<'a> = &'a Self;
876        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
877            value
878        }
879    }
880
881    unsafe impl fidl::encoding::TypeMarker for CurrentReading {
882        type Owned = Self;
883
884        #[inline(always)]
885        fn inline_align(_context: fidl::encoding::Context) -> usize {
886            8
887        }
888
889        #[inline(always)]
890        fn inline_size(_context: fidl::encoding::Context) -> usize {
891            16
892        }
893    }
894
895    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<CurrentReading, D>
896        for &CurrentReading
897    {
898        unsafe fn encode(
899            self,
900            encoder: &mut fidl::encoding::Encoder<'_, D>,
901            offset: usize,
902            mut depth: fidl::encoding::Depth,
903        ) -> fidl::Result<()> {
904            encoder.debug_check_bounds::<CurrentReading>(offset);
905            // Vector header
906            let max_ordinal: u64 = self.max_ordinal_present();
907            encoder.write_num(max_ordinal, offset);
908            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
909            // Calling encoder.out_of_line_offset(0) is not allowed.
910            if max_ordinal == 0 {
911                return Ok(());
912            }
913            depth.increment()?;
914            let envelope_size = 8;
915            let bytes_len = max_ordinal as usize * envelope_size;
916            #[allow(unused_variables)]
917            let offset = encoder.out_of_line_offset(bytes_len);
918            let mut _prev_end_offset: usize = 0;
919            if 1 > max_ordinal {
920                return Ok(());
921            }
922
923            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
924            // are envelope_size bytes.
925            let cur_offset: usize = (1 - 1) * envelope_size;
926
927            // Zero reserved fields.
928            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
929
930            // Safety:
931            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
932            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
933            //   envelope_size bytes, there is always sufficient room.
934            fidl::encoding::encode_in_envelope_optional::<u32, D>(
935                self.channel_id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
936                encoder,
937                offset + cur_offset,
938                depth,
939            )?;
940
941            _prev_end_offset = cur_offset + envelope_size;
942            if 2 > max_ordinal {
943                return Ok(());
944            }
945
946            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
947            // are envelope_size bytes.
948            let cur_offset: usize = (2 - 1) * envelope_size;
949
950            // Zero reserved fields.
951            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
952
953            // Safety:
954            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
955            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
956            //   envelope_size bytes, there is always sufficient room.
957            fidl::encoding::encode_in_envelope_optional::<i32, D>(
958                self.current_ua.as_ref().map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
959                encoder,
960                offset + cur_offset,
961                depth,
962            )?;
963
964            _prev_end_offset = cur_offset + envelope_size;
965            if 3 > max_ordinal {
966                return Ok(());
967            }
968
969            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
970            // are envelope_size bytes.
971            let cur_offset: usize = (3 - 1) * envelope_size;
972
973            // Zero reserved fields.
974            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
975
976            // Safety:
977            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
978            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
979            //   envelope_size bytes, there is always sufficient room.
980            fidl::encoding::encode_in_envelope_optional::<i64, D>(
981                self.interval.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
982                encoder,
983                offset + cur_offset,
984                depth,
985            )?;
986
987            _prev_end_offset = cur_offset + envelope_size;
988            if 4 > max_ordinal {
989                return Ok(());
990            }
991
992            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
993            // are envelope_size bytes.
994            let cur_offset: usize = (4 - 1) * envelope_size;
995
996            // Zero reserved fields.
997            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
998
999            // Safety:
1000            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1001            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1002            //   envelope_size bytes, there is always sufficient room.
1003            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1004                self.timestamp.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1005                encoder,
1006                offset + cur_offset,
1007                depth,
1008            )?;
1009
1010            _prev_end_offset = cur_offset + envelope_size;
1011
1012            Ok(())
1013        }
1014    }
1015
1016    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for CurrentReading {
1017        #[inline(always)]
1018        fn new_empty() -> Self {
1019            Self::default()
1020        }
1021
1022        unsafe fn decode(
1023            &mut self,
1024            decoder: &mut fidl::encoding::Decoder<'_, D>,
1025            offset: usize,
1026            mut depth: fidl::encoding::Depth,
1027        ) -> fidl::Result<()> {
1028            decoder.debug_check_bounds::<Self>(offset);
1029            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1030                None => return Err(fidl::Error::NotNullable),
1031                Some(len) => len,
1032            };
1033            // Calling decoder.out_of_line_offset(0) is not allowed.
1034            if len == 0 {
1035                return Ok(());
1036            };
1037            depth.increment()?;
1038            let envelope_size = 8;
1039            let bytes_len = len * envelope_size;
1040            let offset = decoder.out_of_line_offset(bytes_len)?;
1041            // Decode the envelope for each type.
1042            let mut _next_ordinal_to_read = 0;
1043            let mut next_offset = offset;
1044            let end_offset = offset + bytes_len;
1045            _next_ordinal_to_read += 1;
1046            if next_offset >= end_offset {
1047                return Ok(());
1048            }
1049
1050            // Decode unknown envelopes for gaps in ordinals.
1051            while _next_ordinal_to_read < 1 {
1052                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1053                _next_ordinal_to_read += 1;
1054                next_offset += envelope_size;
1055            }
1056
1057            let next_out_of_line = decoder.next_out_of_line();
1058            let handles_before = decoder.remaining_handles();
1059            if let Some((inlined, num_bytes, num_handles)) =
1060                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1061            {
1062                let member_inline_size =
1063                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1064                if inlined != (member_inline_size <= 4) {
1065                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1066                }
1067                let inner_offset;
1068                let mut inner_depth = depth.clone();
1069                if inlined {
1070                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1071                    inner_offset = next_offset;
1072                } else {
1073                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1074                    inner_depth.increment()?;
1075                }
1076                let val_ref = self.channel_id.get_or_insert_with(|| fidl::new_empty!(u32, D));
1077                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1078                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1079                {
1080                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1081                }
1082                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1083                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1084                }
1085            }
1086
1087            next_offset += envelope_size;
1088            _next_ordinal_to_read += 1;
1089            if next_offset >= end_offset {
1090                return Ok(());
1091            }
1092
1093            // Decode unknown envelopes for gaps in ordinals.
1094            while _next_ordinal_to_read < 2 {
1095                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1096                _next_ordinal_to_read += 1;
1097                next_offset += envelope_size;
1098            }
1099
1100            let next_out_of_line = decoder.next_out_of_line();
1101            let handles_before = decoder.remaining_handles();
1102            if let Some((inlined, num_bytes, num_handles)) =
1103                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1104            {
1105                let member_inline_size =
1106                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1107                if inlined != (member_inline_size <= 4) {
1108                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1109                }
1110                let inner_offset;
1111                let mut inner_depth = depth.clone();
1112                if inlined {
1113                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1114                    inner_offset = next_offset;
1115                } else {
1116                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1117                    inner_depth.increment()?;
1118                }
1119                let val_ref = self.current_ua.get_or_insert_with(|| fidl::new_empty!(i32, D));
1120                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
1121                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1122                {
1123                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1124                }
1125                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1126                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1127                }
1128            }
1129
1130            next_offset += envelope_size;
1131            _next_ordinal_to_read += 1;
1132            if next_offset >= end_offset {
1133                return Ok(());
1134            }
1135
1136            // Decode unknown envelopes for gaps in ordinals.
1137            while _next_ordinal_to_read < 3 {
1138                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1139                _next_ordinal_to_read += 1;
1140                next_offset += envelope_size;
1141            }
1142
1143            let next_out_of_line = decoder.next_out_of_line();
1144            let handles_before = decoder.remaining_handles();
1145            if let Some((inlined, num_bytes, num_handles)) =
1146                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1147            {
1148                let member_inline_size =
1149                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1150                if inlined != (member_inline_size <= 4) {
1151                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1152                }
1153                let inner_offset;
1154                let mut inner_depth = depth.clone();
1155                if inlined {
1156                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1157                    inner_offset = next_offset;
1158                } else {
1159                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1160                    inner_depth.increment()?;
1161                }
1162                let val_ref = self.interval.get_or_insert_with(|| fidl::new_empty!(i64, D));
1163                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1164                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1165                {
1166                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1167                }
1168                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1169                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1170                }
1171            }
1172
1173            next_offset += envelope_size;
1174            _next_ordinal_to_read += 1;
1175            if next_offset >= end_offset {
1176                return Ok(());
1177            }
1178
1179            // Decode unknown envelopes for gaps in ordinals.
1180            while _next_ordinal_to_read < 4 {
1181                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1182                _next_ordinal_to_read += 1;
1183                next_offset += envelope_size;
1184            }
1185
1186            let next_out_of_line = decoder.next_out_of_line();
1187            let handles_before = decoder.remaining_handles();
1188            if let Some((inlined, num_bytes, num_handles)) =
1189                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1190            {
1191                let member_inline_size =
1192                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1193                if inlined != (member_inline_size <= 4) {
1194                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1195                }
1196                let inner_offset;
1197                let mut inner_depth = depth.clone();
1198                if inlined {
1199                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1200                    inner_offset = next_offset;
1201                } else {
1202                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1203                    inner_depth.increment()?;
1204                }
1205                let val_ref = self.timestamp.get_or_insert_with(|| fidl::new_empty!(i64, D));
1206                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1207                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1208                {
1209                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1210                }
1211                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1212                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1213                }
1214            }
1215
1216            next_offset += envelope_size;
1217
1218            // Decode the remaining unknown envelopes.
1219            while next_offset < end_offset {
1220                _next_ordinal_to_read += 1;
1221                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1222                next_offset += envelope_size;
1223            }
1224
1225            Ok(())
1226        }
1227    }
1228
1229    impl EnergyReading {
1230        #[inline(always)]
1231        fn max_ordinal_present(&self) -> u64 {
1232            if let Some(_) = self.timestamp {
1233                return 4;
1234            }
1235            if let Some(_) = self.interval {
1236                return 3;
1237            }
1238            if let Some(_) = self.energy_uj {
1239                return 2;
1240            }
1241            if let Some(_) = self.channel_id {
1242                return 1;
1243            }
1244            0
1245        }
1246    }
1247
1248    impl fidl::encoding::ValueTypeMarker for EnergyReading {
1249        type Borrowed<'a> = &'a Self;
1250        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1251            value
1252        }
1253    }
1254
1255    unsafe impl fidl::encoding::TypeMarker for EnergyReading {
1256        type Owned = Self;
1257
1258        #[inline(always)]
1259        fn inline_align(_context: fidl::encoding::Context) -> usize {
1260            8
1261        }
1262
1263        #[inline(always)]
1264        fn inline_size(_context: fidl::encoding::Context) -> usize {
1265            16
1266        }
1267    }
1268
1269    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<EnergyReading, D>
1270        for &EnergyReading
1271    {
1272        unsafe fn encode(
1273            self,
1274            encoder: &mut fidl::encoding::Encoder<'_, D>,
1275            offset: usize,
1276            mut depth: fidl::encoding::Depth,
1277        ) -> fidl::Result<()> {
1278            encoder.debug_check_bounds::<EnergyReading>(offset);
1279            // Vector header
1280            let max_ordinal: u64 = self.max_ordinal_present();
1281            encoder.write_num(max_ordinal, offset);
1282            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1283            // Calling encoder.out_of_line_offset(0) is not allowed.
1284            if max_ordinal == 0 {
1285                return Ok(());
1286            }
1287            depth.increment()?;
1288            let envelope_size = 8;
1289            let bytes_len = max_ordinal as usize * envelope_size;
1290            #[allow(unused_variables)]
1291            let offset = encoder.out_of_line_offset(bytes_len);
1292            let mut _prev_end_offset: usize = 0;
1293            if 1 > max_ordinal {
1294                return Ok(());
1295            }
1296
1297            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1298            // are envelope_size bytes.
1299            let cur_offset: usize = (1 - 1) * envelope_size;
1300
1301            // Zero reserved fields.
1302            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1303
1304            // Safety:
1305            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1306            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1307            //   envelope_size bytes, there is always sufficient room.
1308            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1309                self.channel_id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1310                encoder,
1311                offset + cur_offset,
1312                depth,
1313            )?;
1314
1315            _prev_end_offset = cur_offset + envelope_size;
1316            if 2 > max_ordinal {
1317                return Ok(());
1318            }
1319
1320            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1321            // are envelope_size bytes.
1322            let cur_offset: usize = (2 - 1) * envelope_size;
1323
1324            // Zero reserved fields.
1325            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1326
1327            // Safety:
1328            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1329            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1330            //   envelope_size bytes, there is always sufficient room.
1331            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1332                self.energy_uj.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1333                encoder,
1334                offset + cur_offset,
1335                depth,
1336            )?;
1337
1338            _prev_end_offset = cur_offset + envelope_size;
1339            if 3 > max_ordinal {
1340                return Ok(());
1341            }
1342
1343            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1344            // are envelope_size bytes.
1345            let cur_offset: usize = (3 - 1) * envelope_size;
1346
1347            // Zero reserved fields.
1348            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1349
1350            // Safety:
1351            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1352            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1353            //   envelope_size bytes, there is always sufficient room.
1354            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1355                self.interval.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1356                encoder,
1357                offset + cur_offset,
1358                depth,
1359            )?;
1360
1361            _prev_end_offset = cur_offset + envelope_size;
1362            if 4 > max_ordinal {
1363                return Ok(());
1364            }
1365
1366            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1367            // are envelope_size bytes.
1368            let cur_offset: usize = (4 - 1) * envelope_size;
1369
1370            // Zero reserved fields.
1371            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1372
1373            // Safety:
1374            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1375            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1376            //   envelope_size bytes, there is always sufficient room.
1377            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1378                self.timestamp.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1379                encoder,
1380                offset + cur_offset,
1381                depth,
1382            )?;
1383
1384            _prev_end_offset = cur_offset + envelope_size;
1385
1386            Ok(())
1387        }
1388    }
1389
1390    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for EnergyReading {
1391        #[inline(always)]
1392        fn new_empty() -> Self {
1393            Self::default()
1394        }
1395
1396        unsafe fn decode(
1397            &mut self,
1398            decoder: &mut fidl::encoding::Decoder<'_, D>,
1399            offset: usize,
1400            mut depth: fidl::encoding::Depth,
1401        ) -> fidl::Result<()> {
1402            decoder.debug_check_bounds::<Self>(offset);
1403            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1404                None => return Err(fidl::Error::NotNullable),
1405                Some(len) => len,
1406            };
1407            // Calling decoder.out_of_line_offset(0) is not allowed.
1408            if len == 0 {
1409                return Ok(());
1410            };
1411            depth.increment()?;
1412            let envelope_size = 8;
1413            let bytes_len = len * envelope_size;
1414            let offset = decoder.out_of_line_offset(bytes_len)?;
1415            // Decode the envelope for each type.
1416            let mut _next_ordinal_to_read = 0;
1417            let mut next_offset = offset;
1418            let end_offset = offset + bytes_len;
1419            _next_ordinal_to_read += 1;
1420            if next_offset >= end_offset {
1421                return Ok(());
1422            }
1423
1424            // Decode unknown envelopes for gaps in ordinals.
1425            while _next_ordinal_to_read < 1 {
1426                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1427                _next_ordinal_to_read += 1;
1428                next_offset += envelope_size;
1429            }
1430
1431            let next_out_of_line = decoder.next_out_of_line();
1432            let handles_before = decoder.remaining_handles();
1433            if let Some((inlined, num_bytes, num_handles)) =
1434                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1435            {
1436                let member_inline_size =
1437                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1438                if inlined != (member_inline_size <= 4) {
1439                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1440                }
1441                let inner_offset;
1442                let mut inner_depth = depth.clone();
1443                if inlined {
1444                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1445                    inner_offset = next_offset;
1446                } else {
1447                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1448                    inner_depth.increment()?;
1449                }
1450                let val_ref = self.channel_id.get_or_insert_with(|| fidl::new_empty!(u32, D));
1451                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1452                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1453                {
1454                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1455                }
1456                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1457                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1458                }
1459            }
1460
1461            next_offset += envelope_size;
1462            _next_ordinal_to_read += 1;
1463            if next_offset >= end_offset {
1464                return Ok(());
1465            }
1466
1467            // Decode unknown envelopes for gaps in ordinals.
1468            while _next_ordinal_to_read < 2 {
1469                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1470                _next_ordinal_to_read += 1;
1471                next_offset += envelope_size;
1472            }
1473
1474            let next_out_of_line = decoder.next_out_of_line();
1475            let handles_before = decoder.remaining_handles();
1476            if let Some((inlined, num_bytes, num_handles)) =
1477                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1478            {
1479                let member_inline_size =
1480                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1481                if inlined != (member_inline_size <= 4) {
1482                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1483                }
1484                let inner_offset;
1485                let mut inner_depth = depth.clone();
1486                if inlined {
1487                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1488                    inner_offset = next_offset;
1489                } else {
1490                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1491                    inner_depth.increment()?;
1492                }
1493                let val_ref = self.energy_uj.get_or_insert_with(|| fidl::new_empty!(i64, D));
1494                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1495                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1496                {
1497                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1498                }
1499                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1500                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1501                }
1502            }
1503
1504            next_offset += envelope_size;
1505            _next_ordinal_to_read += 1;
1506            if next_offset >= end_offset {
1507                return Ok(());
1508            }
1509
1510            // Decode unknown envelopes for gaps in ordinals.
1511            while _next_ordinal_to_read < 3 {
1512                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1513                _next_ordinal_to_read += 1;
1514                next_offset += envelope_size;
1515            }
1516
1517            let next_out_of_line = decoder.next_out_of_line();
1518            let handles_before = decoder.remaining_handles();
1519            if let Some((inlined, num_bytes, num_handles)) =
1520                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1521            {
1522                let member_inline_size =
1523                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1524                if inlined != (member_inline_size <= 4) {
1525                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1526                }
1527                let inner_offset;
1528                let mut inner_depth = depth.clone();
1529                if inlined {
1530                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1531                    inner_offset = next_offset;
1532                } else {
1533                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1534                    inner_depth.increment()?;
1535                }
1536                let val_ref = self.interval.get_or_insert_with(|| fidl::new_empty!(i64, D));
1537                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1538                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1539                {
1540                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1541                }
1542                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1543                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1544                }
1545            }
1546
1547            next_offset += envelope_size;
1548            _next_ordinal_to_read += 1;
1549            if next_offset >= end_offset {
1550                return Ok(());
1551            }
1552
1553            // Decode unknown envelopes for gaps in ordinals.
1554            while _next_ordinal_to_read < 4 {
1555                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1556                _next_ordinal_to_read += 1;
1557                next_offset += envelope_size;
1558            }
1559
1560            let next_out_of_line = decoder.next_out_of_line();
1561            let handles_before = decoder.remaining_handles();
1562            if let Some((inlined, num_bytes, num_handles)) =
1563                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1564            {
1565                let member_inline_size =
1566                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1567                if inlined != (member_inline_size <= 4) {
1568                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1569                }
1570                let inner_offset;
1571                let mut inner_depth = depth.clone();
1572                if inlined {
1573                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1574                    inner_offset = next_offset;
1575                } else {
1576                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1577                    inner_depth.increment()?;
1578                }
1579                let val_ref = self.timestamp.get_or_insert_with(|| fidl::new_empty!(i64, D));
1580                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1581                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1582                {
1583                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1584                }
1585                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1586                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1587                }
1588            }
1589
1590            next_offset += envelope_size;
1591
1592            // Decode the remaining unknown envelopes.
1593            while next_offset < end_offset {
1594                _next_ordinal_to_read += 1;
1595                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1596                next_offset += envelope_size;
1597            }
1598
1599            Ok(())
1600        }
1601    }
1602
1603    impl Options {
1604        #[inline(always)]
1605        fn max_ordinal_present(&self) -> u64 {
1606            if let Some(_) = self.measurement_type {
1607                return 1;
1608            }
1609            0
1610        }
1611    }
1612
1613    impl fidl::encoding::ValueTypeMarker for Options {
1614        type Borrowed<'a> = &'a Self;
1615        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1616            value
1617        }
1618    }
1619
1620    unsafe impl fidl::encoding::TypeMarker for Options {
1621        type Owned = Self;
1622
1623        #[inline(always)]
1624        fn inline_align(_context: fidl::encoding::Context) -> usize {
1625            8
1626        }
1627
1628        #[inline(always)]
1629        fn inline_size(_context: fidl::encoding::Context) -> usize {
1630            16
1631        }
1632    }
1633
1634    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Options, D> for &Options {
1635        unsafe fn encode(
1636            self,
1637            encoder: &mut fidl::encoding::Encoder<'_, D>,
1638            offset: usize,
1639            mut depth: fidl::encoding::Depth,
1640        ) -> fidl::Result<()> {
1641            encoder.debug_check_bounds::<Options>(offset);
1642            // Vector header
1643            let max_ordinal: u64 = self.max_ordinal_present();
1644            encoder.write_num(max_ordinal, offset);
1645            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1646            // Calling encoder.out_of_line_offset(0) is not allowed.
1647            if max_ordinal == 0 {
1648                return Ok(());
1649            }
1650            depth.increment()?;
1651            let envelope_size = 8;
1652            let bytes_len = max_ordinal as usize * envelope_size;
1653            #[allow(unused_variables)]
1654            let offset = encoder.out_of_line_offset(bytes_len);
1655            let mut _prev_end_offset: usize = 0;
1656            if 1 > max_ordinal {
1657                return Ok(());
1658            }
1659
1660            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1661            // are envelope_size bytes.
1662            let cur_offset: usize = (1 - 1) * envelope_size;
1663
1664            // Zero reserved fields.
1665            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1666
1667            // Safety:
1668            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1669            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1670            //   envelope_size bytes, there is always sufficient room.
1671            fidl::encoding::encode_in_envelope_optional::<MeasurementType, D>(
1672                self.measurement_type
1673                    .as_ref()
1674                    .map(<MeasurementType as fidl::encoding::ValueTypeMarker>::borrow),
1675                encoder,
1676                offset + cur_offset,
1677                depth,
1678            )?;
1679
1680            _prev_end_offset = cur_offset + envelope_size;
1681
1682            Ok(())
1683        }
1684    }
1685
1686    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Options {
1687        #[inline(always)]
1688        fn new_empty() -> Self {
1689            Self::default()
1690        }
1691
1692        unsafe fn decode(
1693            &mut self,
1694            decoder: &mut fidl::encoding::Decoder<'_, D>,
1695            offset: usize,
1696            mut depth: fidl::encoding::Depth,
1697        ) -> fidl::Result<()> {
1698            decoder.debug_check_bounds::<Self>(offset);
1699            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1700                None => return Err(fidl::Error::NotNullable),
1701                Some(len) => len,
1702            };
1703            // Calling decoder.out_of_line_offset(0) is not allowed.
1704            if len == 0 {
1705                return Ok(());
1706            };
1707            depth.increment()?;
1708            let envelope_size = 8;
1709            let bytes_len = len * envelope_size;
1710            let offset = decoder.out_of_line_offset(bytes_len)?;
1711            // Decode the envelope for each type.
1712            let mut _next_ordinal_to_read = 0;
1713            let mut next_offset = offset;
1714            let end_offset = offset + bytes_len;
1715            _next_ordinal_to_read += 1;
1716            if next_offset >= end_offset {
1717                return Ok(());
1718            }
1719
1720            // Decode unknown envelopes for gaps in ordinals.
1721            while _next_ordinal_to_read < 1 {
1722                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1723                _next_ordinal_to_read += 1;
1724                next_offset += envelope_size;
1725            }
1726
1727            let next_out_of_line = decoder.next_out_of_line();
1728            let handles_before = decoder.remaining_handles();
1729            if let Some((inlined, num_bytes, num_handles)) =
1730                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1731            {
1732                let member_inline_size =
1733                    <MeasurementType as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1734                if inlined != (member_inline_size <= 4) {
1735                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1736                }
1737                let inner_offset;
1738                let mut inner_depth = depth.clone();
1739                if inlined {
1740                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1741                    inner_offset = next_offset;
1742                } else {
1743                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1744                    inner_depth.increment()?;
1745                }
1746                let val_ref = self
1747                    .measurement_type
1748                    .get_or_insert_with(|| fidl::new_empty!(MeasurementType, D));
1749                fidl::decode!(MeasurementType, D, val_ref, decoder, inner_offset, inner_depth)?;
1750                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1751                {
1752                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1753                }
1754                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1755                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1756                }
1757            }
1758
1759            next_offset += envelope_size;
1760
1761            // Decode the remaining unknown envelopes.
1762            while next_offset < end_offset {
1763                _next_ordinal_to_read += 1;
1764                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1765                next_offset += envelope_size;
1766            }
1767
1768            Ok(())
1769        }
1770    }
1771
1772    impl PollingConfig {
1773        #[inline(always)]
1774        fn max_ordinal_present(&self) -> u64 {
1775            if let Some(_) = self.polls_per_series_entry {
1776                return 2;
1777            }
1778            if let Some(_) = self.poll_interval {
1779                return 1;
1780            }
1781            0
1782        }
1783    }
1784
1785    impl fidl::encoding::ValueTypeMarker for PollingConfig {
1786        type Borrowed<'a> = &'a Self;
1787        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1788            value
1789        }
1790    }
1791
1792    unsafe impl fidl::encoding::TypeMarker for PollingConfig {
1793        type Owned = Self;
1794
1795        #[inline(always)]
1796        fn inline_align(_context: fidl::encoding::Context) -> usize {
1797            8
1798        }
1799
1800        #[inline(always)]
1801        fn inline_size(_context: fidl::encoding::Context) -> usize {
1802            16
1803        }
1804    }
1805
1806    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PollingConfig, D>
1807        for &PollingConfig
1808    {
1809        unsafe fn encode(
1810            self,
1811            encoder: &mut fidl::encoding::Encoder<'_, D>,
1812            offset: usize,
1813            mut depth: fidl::encoding::Depth,
1814        ) -> fidl::Result<()> {
1815            encoder.debug_check_bounds::<PollingConfig>(offset);
1816            // Vector header
1817            let max_ordinal: u64 = self.max_ordinal_present();
1818            encoder.write_num(max_ordinal, offset);
1819            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1820            // Calling encoder.out_of_line_offset(0) is not allowed.
1821            if max_ordinal == 0 {
1822                return Ok(());
1823            }
1824            depth.increment()?;
1825            let envelope_size = 8;
1826            let bytes_len = max_ordinal as usize * envelope_size;
1827            #[allow(unused_variables)]
1828            let offset = encoder.out_of_line_offset(bytes_len);
1829            let mut _prev_end_offset: usize = 0;
1830            if 1 > max_ordinal {
1831                return Ok(());
1832            }
1833
1834            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1835            // are envelope_size bytes.
1836            let cur_offset: usize = (1 - 1) * envelope_size;
1837
1838            // Zero reserved fields.
1839            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1840
1841            // Safety:
1842            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1843            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1844            //   envelope_size bytes, there is always sufficient room.
1845            fidl::encoding::encode_in_envelope_optional::<i64, D>(
1846                self.poll_interval.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
1847                encoder,
1848                offset + cur_offset,
1849                depth,
1850            )?;
1851
1852            _prev_end_offset = cur_offset + envelope_size;
1853            if 2 > max_ordinal {
1854                return Ok(());
1855            }
1856
1857            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1858            // are envelope_size bytes.
1859            let cur_offset: usize = (2 - 1) * envelope_size;
1860
1861            // Zero reserved fields.
1862            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1863
1864            // Safety:
1865            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1866            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1867            //   envelope_size bytes, there is always sufficient room.
1868            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1869                self.polls_per_series_entry
1870                    .as_ref()
1871                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1872                encoder,
1873                offset + cur_offset,
1874                depth,
1875            )?;
1876
1877            _prev_end_offset = cur_offset + envelope_size;
1878
1879            Ok(())
1880        }
1881    }
1882
1883    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PollingConfig {
1884        #[inline(always)]
1885        fn new_empty() -> Self {
1886            Self::default()
1887        }
1888
1889        unsafe fn decode(
1890            &mut self,
1891            decoder: &mut fidl::encoding::Decoder<'_, D>,
1892            offset: usize,
1893            mut depth: fidl::encoding::Depth,
1894        ) -> fidl::Result<()> {
1895            decoder.debug_check_bounds::<Self>(offset);
1896            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1897                None => return Err(fidl::Error::NotNullable),
1898                Some(len) => len,
1899            };
1900            // Calling decoder.out_of_line_offset(0) is not allowed.
1901            if len == 0 {
1902                return Ok(());
1903            };
1904            depth.increment()?;
1905            let envelope_size = 8;
1906            let bytes_len = len * envelope_size;
1907            let offset = decoder.out_of_line_offset(bytes_len)?;
1908            // Decode the envelope for each type.
1909            let mut _next_ordinal_to_read = 0;
1910            let mut next_offset = offset;
1911            let end_offset = offset + bytes_len;
1912            _next_ordinal_to_read += 1;
1913            if next_offset >= end_offset {
1914                return Ok(());
1915            }
1916
1917            // Decode unknown envelopes for gaps in ordinals.
1918            while _next_ordinal_to_read < 1 {
1919                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1920                _next_ordinal_to_read += 1;
1921                next_offset += envelope_size;
1922            }
1923
1924            let next_out_of_line = decoder.next_out_of_line();
1925            let handles_before = decoder.remaining_handles();
1926            if let Some((inlined, num_bytes, num_handles)) =
1927                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1928            {
1929                let member_inline_size =
1930                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1931                if inlined != (member_inline_size <= 4) {
1932                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1933                }
1934                let inner_offset;
1935                let mut inner_depth = depth.clone();
1936                if inlined {
1937                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1938                    inner_offset = next_offset;
1939                } else {
1940                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1941                    inner_depth.increment()?;
1942                }
1943                let val_ref = self.poll_interval.get_or_insert_with(|| fidl::new_empty!(i64, D));
1944                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
1945                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1946                {
1947                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1948                }
1949                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1950                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1951                }
1952            }
1953
1954            next_offset += envelope_size;
1955            _next_ordinal_to_read += 1;
1956            if next_offset >= end_offset {
1957                return Ok(());
1958            }
1959
1960            // Decode unknown envelopes for gaps in ordinals.
1961            while _next_ordinal_to_read < 2 {
1962                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1963                _next_ordinal_to_read += 1;
1964                next_offset += envelope_size;
1965            }
1966
1967            let next_out_of_line = decoder.next_out_of_line();
1968            let handles_before = decoder.remaining_handles();
1969            if let Some((inlined, num_bytes, num_handles)) =
1970                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1971            {
1972                let member_inline_size =
1973                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1974                if inlined != (member_inline_size <= 4) {
1975                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1976                }
1977                let inner_offset;
1978                let mut inner_depth = depth.clone();
1979                if inlined {
1980                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1981                    inner_offset = next_offset;
1982                } else {
1983                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1984                    inner_depth.increment()?;
1985                }
1986                let val_ref =
1987                    self.polls_per_series_entry.get_or_insert_with(|| fidl::new_empty!(u32, D));
1988                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1989                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1990                {
1991                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1992                }
1993                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1994                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1995                }
1996            }
1997
1998            next_offset += envelope_size;
1999
2000            // Decode the remaining unknown envelopes.
2001            while next_offset < end_offset {
2002                _next_ordinal_to_read += 1;
2003                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2004                next_offset += envelope_size;
2005            }
2006
2007            Ok(())
2008        }
2009    }
2010
2011    impl PowerReading {
2012        #[inline(always)]
2013        fn max_ordinal_present(&self) -> u64 {
2014            if let Some(_) = self.timestamp {
2015                return 4;
2016            }
2017            if let Some(_) = self.interval {
2018                return 3;
2019            }
2020            if let Some(_) = self.power_uw {
2021                return 2;
2022            }
2023            if let Some(_) = self.channel_id {
2024                return 1;
2025            }
2026            0
2027        }
2028    }
2029
2030    impl fidl::encoding::ValueTypeMarker for PowerReading {
2031        type Borrowed<'a> = &'a Self;
2032        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2033            value
2034        }
2035    }
2036
2037    unsafe impl fidl::encoding::TypeMarker for PowerReading {
2038        type Owned = Self;
2039
2040        #[inline(always)]
2041        fn inline_align(_context: fidl::encoding::Context) -> usize {
2042            8
2043        }
2044
2045        #[inline(always)]
2046        fn inline_size(_context: fidl::encoding::Context) -> usize {
2047            16
2048        }
2049    }
2050
2051    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PowerReading, D>
2052        for &PowerReading
2053    {
2054        unsafe fn encode(
2055            self,
2056            encoder: &mut fidl::encoding::Encoder<'_, D>,
2057            offset: usize,
2058            mut depth: fidl::encoding::Depth,
2059        ) -> fidl::Result<()> {
2060            encoder.debug_check_bounds::<PowerReading>(offset);
2061            // Vector header
2062            let max_ordinal: u64 = self.max_ordinal_present();
2063            encoder.write_num(max_ordinal, offset);
2064            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2065            // Calling encoder.out_of_line_offset(0) is not allowed.
2066            if max_ordinal == 0 {
2067                return Ok(());
2068            }
2069            depth.increment()?;
2070            let envelope_size = 8;
2071            let bytes_len = max_ordinal as usize * envelope_size;
2072            #[allow(unused_variables)]
2073            let offset = encoder.out_of_line_offset(bytes_len);
2074            let mut _prev_end_offset: usize = 0;
2075            if 1 > max_ordinal {
2076                return Ok(());
2077            }
2078
2079            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2080            // are envelope_size bytes.
2081            let cur_offset: usize = (1 - 1) * envelope_size;
2082
2083            // Zero reserved fields.
2084            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2085
2086            // Safety:
2087            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2088            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2089            //   envelope_size bytes, there is always sufficient room.
2090            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2091                self.channel_id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2092                encoder,
2093                offset + cur_offset,
2094                depth,
2095            )?;
2096
2097            _prev_end_offset = cur_offset + envelope_size;
2098            if 2 > max_ordinal {
2099                return Ok(());
2100            }
2101
2102            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2103            // are envelope_size bytes.
2104            let cur_offset: usize = (2 - 1) * envelope_size;
2105
2106            // Zero reserved fields.
2107            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2108
2109            // Safety:
2110            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2111            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2112            //   envelope_size bytes, there is always sufficient room.
2113            fidl::encoding::encode_in_envelope_optional::<i32, D>(
2114                self.power_uw.as_ref().map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
2115                encoder,
2116                offset + cur_offset,
2117                depth,
2118            )?;
2119
2120            _prev_end_offset = cur_offset + envelope_size;
2121            if 3 > max_ordinal {
2122                return Ok(());
2123            }
2124
2125            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2126            // are envelope_size bytes.
2127            let cur_offset: usize = (3 - 1) * envelope_size;
2128
2129            // Zero reserved fields.
2130            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2131
2132            // Safety:
2133            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2134            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2135            //   envelope_size bytes, there is always sufficient room.
2136            fidl::encoding::encode_in_envelope_optional::<i64, D>(
2137                self.interval.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
2138                encoder,
2139                offset + cur_offset,
2140                depth,
2141            )?;
2142
2143            _prev_end_offset = cur_offset + envelope_size;
2144            if 4 > max_ordinal {
2145                return Ok(());
2146            }
2147
2148            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2149            // are envelope_size bytes.
2150            let cur_offset: usize = (4 - 1) * envelope_size;
2151
2152            // Zero reserved fields.
2153            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2154
2155            // Safety:
2156            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2157            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2158            //   envelope_size bytes, there is always sufficient room.
2159            fidl::encoding::encode_in_envelope_optional::<i64, D>(
2160                self.timestamp.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
2161                encoder,
2162                offset + cur_offset,
2163                depth,
2164            )?;
2165
2166            _prev_end_offset = cur_offset + envelope_size;
2167
2168            Ok(())
2169        }
2170    }
2171
2172    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PowerReading {
2173        #[inline(always)]
2174        fn new_empty() -> Self {
2175            Self::default()
2176        }
2177
2178        unsafe fn decode(
2179            &mut self,
2180            decoder: &mut fidl::encoding::Decoder<'_, D>,
2181            offset: usize,
2182            mut depth: fidl::encoding::Depth,
2183        ) -> fidl::Result<()> {
2184            decoder.debug_check_bounds::<Self>(offset);
2185            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2186                None => return Err(fidl::Error::NotNullable),
2187                Some(len) => len,
2188            };
2189            // Calling decoder.out_of_line_offset(0) is not allowed.
2190            if len == 0 {
2191                return Ok(());
2192            };
2193            depth.increment()?;
2194            let envelope_size = 8;
2195            let bytes_len = len * envelope_size;
2196            let offset = decoder.out_of_line_offset(bytes_len)?;
2197            // Decode the envelope for each type.
2198            let mut _next_ordinal_to_read = 0;
2199            let mut next_offset = offset;
2200            let end_offset = offset + bytes_len;
2201            _next_ordinal_to_read += 1;
2202            if next_offset >= end_offset {
2203                return Ok(());
2204            }
2205
2206            // Decode unknown envelopes for gaps in ordinals.
2207            while _next_ordinal_to_read < 1 {
2208                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2209                _next_ordinal_to_read += 1;
2210                next_offset += envelope_size;
2211            }
2212
2213            let next_out_of_line = decoder.next_out_of_line();
2214            let handles_before = decoder.remaining_handles();
2215            if let Some((inlined, num_bytes, num_handles)) =
2216                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2217            {
2218                let member_inline_size =
2219                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2220                if inlined != (member_inline_size <= 4) {
2221                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2222                }
2223                let inner_offset;
2224                let mut inner_depth = depth.clone();
2225                if inlined {
2226                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2227                    inner_offset = next_offset;
2228                } else {
2229                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2230                    inner_depth.increment()?;
2231                }
2232                let val_ref = self.channel_id.get_or_insert_with(|| fidl::new_empty!(u32, D));
2233                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2234                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2235                {
2236                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2237                }
2238                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2239                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2240                }
2241            }
2242
2243            next_offset += envelope_size;
2244            _next_ordinal_to_read += 1;
2245            if next_offset >= end_offset {
2246                return Ok(());
2247            }
2248
2249            // Decode unknown envelopes for gaps in ordinals.
2250            while _next_ordinal_to_read < 2 {
2251                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2252                _next_ordinal_to_read += 1;
2253                next_offset += envelope_size;
2254            }
2255
2256            let next_out_of_line = decoder.next_out_of_line();
2257            let handles_before = decoder.remaining_handles();
2258            if let Some((inlined, num_bytes, num_handles)) =
2259                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2260            {
2261                let member_inline_size =
2262                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2263                if inlined != (member_inline_size <= 4) {
2264                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2265                }
2266                let inner_offset;
2267                let mut inner_depth = depth.clone();
2268                if inlined {
2269                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2270                    inner_offset = next_offset;
2271                } else {
2272                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2273                    inner_depth.increment()?;
2274                }
2275                let val_ref = self.power_uw.get_or_insert_with(|| fidl::new_empty!(i32, D));
2276                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
2277                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2278                {
2279                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2280                }
2281                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2282                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2283                }
2284            }
2285
2286            next_offset += envelope_size;
2287            _next_ordinal_to_read += 1;
2288            if next_offset >= end_offset {
2289                return Ok(());
2290            }
2291
2292            // Decode unknown envelopes for gaps in ordinals.
2293            while _next_ordinal_to_read < 3 {
2294                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2295                _next_ordinal_to_read += 1;
2296                next_offset += envelope_size;
2297            }
2298
2299            let next_out_of_line = decoder.next_out_of_line();
2300            let handles_before = decoder.remaining_handles();
2301            if let Some((inlined, num_bytes, num_handles)) =
2302                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2303            {
2304                let member_inline_size =
2305                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2306                if inlined != (member_inline_size <= 4) {
2307                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2308                }
2309                let inner_offset;
2310                let mut inner_depth = depth.clone();
2311                if inlined {
2312                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2313                    inner_offset = next_offset;
2314                } else {
2315                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2316                    inner_depth.increment()?;
2317                }
2318                let val_ref = self.interval.get_or_insert_with(|| fidl::new_empty!(i64, D));
2319                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
2320                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2321                {
2322                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2323                }
2324                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2325                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2326                }
2327            }
2328
2329            next_offset += envelope_size;
2330            _next_ordinal_to_read += 1;
2331            if next_offset >= end_offset {
2332                return Ok(());
2333            }
2334
2335            // Decode unknown envelopes for gaps in ordinals.
2336            while _next_ordinal_to_read < 4 {
2337                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2338                _next_ordinal_to_read += 1;
2339                next_offset += envelope_size;
2340            }
2341
2342            let next_out_of_line = decoder.next_out_of_line();
2343            let handles_before = decoder.remaining_handles();
2344            if let Some((inlined, num_bytes, num_handles)) =
2345                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2346            {
2347                let member_inline_size =
2348                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2349                if inlined != (member_inline_size <= 4) {
2350                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2351                }
2352                let inner_offset;
2353                let mut inner_depth = depth.clone();
2354                if inlined {
2355                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2356                    inner_offset = next_offset;
2357                } else {
2358                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2359                    inner_depth.increment()?;
2360                }
2361                let val_ref = self.timestamp.get_or_insert_with(|| fidl::new_empty!(i64, D));
2362                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
2363                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2364                {
2365                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2366                }
2367                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2368                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2369                }
2370            }
2371
2372            next_offset += envelope_size;
2373
2374            // Decode the remaining unknown envelopes.
2375            while next_offset < end_offset {
2376                _next_ordinal_to_read += 1;
2377                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2378                next_offset += envelope_size;
2379            }
2380
2381            Ok(())
2382        }
2383    }
2384
2385    impl RailMetadata {
2386        #[inline(always)]
2387        fn max_ordinal_present(&self) -> u64 {
2388            if let Some(_) = self.energy_uj {
2389                return 7;
2390            }
2391            if let Some(_) = self.measurement_stop {
2392                return 6;
2393            }
2394            if let Some(_) = self.measurement_start {
2395                return 5;
2396            }
2397            if let Some(_) = self.regulator_name {
2398                return 4;
2399            }
2400            if let Some(_) = self.schematic_name {
2401                return 3;
2402            }
2403            if let Some(_) = self.channel_id {
2404                return 2;
2405            }
2406            if let Some(_) = self.name {
2407                return 1;
2408            }
2409            0
2410        }
2411    }
2412
2413    impl fidl::encoding::ValueTypeMarker for RailMetadata {
2414        type Borrowed<'a> = &'a Self;
2415        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2416            value
2417        }
2418    }
2419
2420    unsafe impl fidl::encoding::TypeMarker for RailMetadata {
2421        type Owned = Self;
2422
2423        #[inline(always)]
2424        fn inline_align(_context: fidl::encoding::Context) -> usize {
2425            8
2426        }
2427
2428        #[inline(always)]
2429        fn inline_size(_context: fidl::encoding::Context) -> usize {
2430            16
2431        }
2432    }
2433
2434    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<RailMetadata, D>
2435        for &RailMetadata
2436    {
2437        unsafe fn encode(
2438            self,
2439            encoder: &mut fidl::encoding::Encoder<'_, D>,
2440            offset: usize,
2441            mut depth: fidl::encoding::Depth,
2442        ) -> fidl::Result<()> {
2443            encoder.debug_check_bounds::<RailMetadata>(offset);
2444            // Vector header
2445            let max_ordinal: u64 = self.max_ordinal_present();
2446            encoder.write_num(max_ordinal, offset);
2447            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2448            // Calling encoder.out_of_line_offset(0) is not allowed.
2449            if max_ordinal == 0 {
2450                return Ok(());
2451            }
2452            depth.increment()?;
2453            let envelope_size = 8;
2454            let bytes_len = max_ordinal as usize * envelope_size;
2455            #[allow(unused_variables)]
2456            let offset = encoder.out_of_line_offset(bytes_len);
2457            let mut _prev_end_offset: usize = 0;
2458            if 1 > max_ordinal {
2459                return Ok(());
2460            }
2461
2462            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2463            // are envelope_size bytes.
2464            let cur_offset: usize = (1 - 1) * envelope_size;
2465
2466            // Zero reserved fields.
2467            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2468
2469            // Safety:
2470            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2471            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2472            //   envelope_size bytes, there is always sufficient room.
2473            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<256>, D>(
2474                self.name.as_ref().map(
2475                    <fidl::encoding::BoundedString<256> as fidl::encoding::ValueTypeMarker>::borrow,
2476                ),
2477                encoder,
2478                offset + cur_offset,
2479                depth,
2480            )?;
2481
2482            _prev_end_offset = cur_offset + envelope_size;
2483            if 2 > max_ordinal {
2484                return Ok(());
2485            }
2486
2487            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2488            // are envelope_size bytes.
2489            let cur_offset: usize = (2 - 1) * envelope_size;
2490
2491            // Zero reserved fields.
2492            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2493
2494            // Safety:
2495            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2496            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2497            //   envelope_size bytes, there is always sufficient room.
2498            fidl::encoding::encode_in_envelope_optional::<u32, D>(
2499                self.channel_id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2500                encoder,
2501                offset + cur_offset,
2502                depth,
2503            )?;
2504
2505            _prev_end_offset = cur_offset + envelope_size;
2506            if 3 > max_ordinal {
2507                return Ok(());
2508            }
2509
2510            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2511            // are envelope_size bytes.
2512            let cur_offset: usize = (3 - 1) * envelope_size;
2513
2514            // Zero reserved fields.
2515            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2516
2517            // Safety:
2518            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2519            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2520            //   envelope_size bytes, there is always sufficient room.
2521            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<256>, D>(
2522                self.schematic_name.as_ref().map(
2523                    <fidl::encoding::BoundedString<256> as fidl::encoding::ValueTypeMarker>::borrow,
2524                ),
2525                encoder,
2526                offset + cur_offset,
2527                depth,
2528            )?;
2529
2530            _prev_end_offset = cur_offset + envelope_size;
2531            if 4 > max_ordinal {
2532                return Ok(());
2533            }
2534
2535            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2536            // are envelope_size bytes.
2537            let cur_offset: usize = (4 - 1) * envelope_size;
2538
2539            // Zero reserved fields.
2540            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2541
2542            // Safety:
2543            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2544            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2545            //   envelope_size bytes, there is always sufficient room.
2546            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<256>, D>(
2547                self.regulator_name.as_ref().map(
2548                    <fidl::encoding::BoundedString<256> as fidl::encoding::ValueTypeMarker>::borrow,
2549                ),
2550                encoder,
2551                offset + cur_offset,
2552                depth,
2553            )?;
2554
2555            _prev_end_offset = cur_offset + envelope_size;
2556            if 5 > max_ordinal {
2557                return Ok(());
2558            }
2559
2560            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2561            // are envelope_size bytes.
2562            let cur_offset: usize = (5 - 1) * envelope_size;
2563
2564            // Zero reserved fields.
2565            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2566
2567            // Safety:
2568            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2569            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2570            //   envelope_size bytes, there is always sufficient room.
2571            fidl::encoding::encode_in_envelope_optional::<fidl::BootInstant, D>(
2572                self.measurement_start
2573                    .as_ref()
2574                    .map(<fidl::BootInstant as fidl::encoding::ValueTypeMarker>::borrow),
2575                encoder,
2576                offset + cur_offset,
2577                depth,
2578            )?;
2579
2580            _prev_end_offset = cur_offset + envelope_size;
2581            if 6 > max_ordinal {
2582                return Ok(());
2583            }
2584
2585            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2586            // are envelope_size bytes.
2587            let cur_offset: usize = (6 - 1) * envelope_size;
2588
2589            // Zero reserved fields.
2590            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2591
2592            // Safety:
2593            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2594            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2595            //   envelope_size bytes, there is always sufficient room.
2596            fidl::encoding::encode_in_envelope_optional::<fidl::BootInstant, D>(
2597                self.measurement_stop
2598                    .as_ref()
2599                    .map(<fidl::BootInstant as fidl::encoding::ValueTypeMarker>::borrow),
2600                encoder,
2601                offset + cur_offset,
2602                depth,
2603            )?;
2604
2605            _prev_end_offset = cur_offset + envelope_size;
2606            if 7 > max_ordinal {
2607                return Ok(());
2608            }
2609
2610            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2611            // are envelope_size bytes.
2612            let cur_offset: usize = (7 - 1) * envelope_size;
2613
2614            // Zero reserved fields.
2615            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2616
2617            // Safety:
2618            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2619            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2620            //   envelope_size bytes, there is always sufficient room.
2621            fidl::encoding::encode_in_envelope_optional::<i64, D>(
2622                self.energy_uj.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
2623                encoder,
2624                offset + cur_offset,
2625                depth,
2626            )?;
2627
2628            _prev_end_offset = cur_offset + envelope_size;
2629
2630            Ok(())
2631        }
2632    }
2633
2634    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RailMetadata {
2635        #[inline(always)]
2636        fn new_empty() -> Self {
2637            Self::default()
2638        }
2639
2640        unsafe fn decode(
2641            &mut self,
2642            decoder: &mut fidl::encoding::Decoder<'_, D>,
2643            offset: usize,
2644            mut depth: fidl::encoding::Depth,
2645        ) -> fidl::Result<()> {
2646            decoder.debug_check_bounds::<Self>(offset);
2647            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2648                None => return Err(fidl::Error::NotNullable),
2649                Some(len) => len,
2650            };
2651            // Calling decoder.out_of_line_offset(0) is not allowed.
2652            if len == 0 {
2653                return Ok(());
2654            };
2655            depth.increment()?;
2656            let envelope_size = 8;
2657            let bytes_len = len * envelope_size;
2658            let offset = decoder.out_of_line_offset(bytes_len)?;
2659            // Decode the envelope for each type.
2660            let mut _next_ordinal_to_read = 0;
2661            let mut next_offset = offset;
2662            let end_offset = offset + bytes_len;
2663            _next_ordinal_to_read += 1;
2664            if next_offset >= end_offset {
2665                return Ok(());
2666            }
2667
2668            // Decode unknown envelopes for gaps in ordinals.
2669            while _next_ordinal_to_read < 1 {
2670                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2671                _next_ordinal_to_read += 1;
2672                next_offset += envelope_size;
2673            }
2674
2675            let next_out_of_line = decoder.next_out_of_line();
2676            let handles_before = decoder.remaining_handles();
2677            if let Some((inlined, num_bytes, num_handles)) =
2678                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2679            {
2680                let member_inline_size =
2681                    <fidl::encoding::BoundedString<256> as fidl::encoding::TypeMarker>::inline_size(
2682                        decoder.context,
2683                    );
2684                if inlined != (member_inline_size <= 4) {
2685                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2686                }
2687                let inner_offset;
2688                let mut inner_depth = depth.clone();
2689                if inlined {
2690                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2691                    inner_offset = next_offset;
2692                } else {
2693                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2694                    inner_depth.increment()?;
2695                }
2696                let val_ref = self
2697                    .name
2698                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<256>, D));
2699                fidl::decode!(
2700                    fidl::encoding::BoundedString<256>,
2701                    D,
2702                    val_ref,
2703                    decoder,
2704                    inner_offset,
2705                    inner_depth
2706                )?;
2707                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2708                {
2709                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2710                }
2711                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2712                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2713                }
2714            }
2715
2716            next_offset += envelope_size;
2717            _next_ordinal_to_read += 1;
2718            if next_offset >= end_offset {
2719                return Ok(());
2720            }
2721
2722            // Decode unknown envelopes for gaps in ordinals.
2723            while _next_ordinal_to_read < 2 {
2724                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2725                _next_ordinal_to_read += 1;
2726                next_offset += envelope_size;
2727            }
2728
2729            let next_out_of_line = decoder.next_out_of_line();
2730            let handles_before = decoder.remaining_handles();
2731            if let Some((inlined, num_bytes, num_handles)) =
2732                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2733            {
2734                let member_inline_size =
2735                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2736                if inlined != (member_inline_size <= 4) {
2737                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2738                }
2739                let inner_offset;
2740                let mut inner_depth = depth.clone();
2741                if inlined {
2742                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2743                    inner_offset = next_offset;
2744                } else {
2745                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2746                    inner_depth.increment()?;
2747                }
2748                let val_ref = self.channel_id.get_or_insert_with(|| fidl::new_empty!(u32, D));
2749                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2750                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2751                {
2752                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2753                }
2754                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2755                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2756                }
2757            }
2758
2759            next_offset += envelope_size;
2760            _next_ordinal_to_read += 1;
2761            if next_offset >= end_offset {
2762                return Ok(());
2763            }
2764
2765            // Decode unknown envelopes for gaps in ordinals.
2766            while _next_ordinal_to_read < 3 {
2767                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2768                _next_ordinal_to_read += 1;
2769                next_offset += envelope_size;
2770            }
2771
2772            let next_out_of_line = decoder.next_out_of_line();
2773            let handles_before = decoder.remaining_handles();
2774            if let Some((inlined, num_bytes, num_handles)) =
2775                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2776            {
2777                let member_inline_size =
2778                    <fidl::encoding::BoundedString<256> as fidl::encoding::TypeMarker>::inline_size(
2779                        decoder.context,
2780                    );
2781                if inlined != (member_inline_size <= 4) {
2782                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2783                }
2784                let inner_offset;
2785                let mut inner_depth = depth.clone();
2786                if inlined {
2787                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2788                    inner_offset = next_offset;
2789                } else {
2790                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2791                    inner_depth.increment()?;
2792                }
2793                let val_ref = self
2794                    .schematic_name
2795                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<256>, D));
2796                fidl::decode!(
2797                    fidl::encoding::BoundedString<256>,
2798                    D,
2799                    val_ref,
2800                    decoder,
2801                    inner_offset,
2802                    inner_depth
2803                )?;
2804                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2805                {
2806                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2807                }
2808                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2809                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2810                }
2811            }
2812
2813            next_offset += envelope_size;
2814            _next_ordinal_to_read += 1;
2815            if next_offset >= end_offset {
2816                return Ok(());
2817            }
2818
2819            // Decode unknown envelopes for gaps in ordinals.
2820            while _next_ordinal_to_read < 4 {
2821                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2822                _next_ordinal_to_read += 1;
2823                next_offset += envelope_size;
2824            }
2825
2826            let next_out_of_line = decoder.next_out_of_line();
2827            let handles_before = decoder.remaining_handles();
2828            if let Some((inlined, num_bytes, num_handles)) =
2829                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2830            {
2831                let member_inline_size =
2832                    <fidl::encoding::BoundedString<256> as fidl::encoding::TypeMarker>::inline_size(
2833                        decoder.context,
2834                    );
2835                if inlined != (member_inline_size <= 4) {
2836                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2837                }
2838                let inner_offset;
2839                let mut inner_depth = depth.clone();
2840                if inlined {
2841                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2842                    inner_offset = next_offset;
2843                } else {
2844                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2845                    inner_depth.increment()?;
2846                }
2847                let val_ref = self
2848                    .regulator_name
2849                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<256>, D));
2850                fidl::decode!(
2851                    fidl::encoding::BoundedString<256>,
2852                    D,
2853                    val_ref,
2854                    decoder,
2855                    inner_offset,
2856                    inner_depth
2857                )?;
2858                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2859                {
2860                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2861                }
2862                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2863                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2864                }
2865            }
2866
2867            next_offset += envelope_size;
2868            _next_ordinal_to_read += 1;
2869            if next_offset >= end_offset {
2870                return Ok(());
2871            }
2872
2873            // Decode unknown envelopes for gaps in ordinals.
2874            while _next_ordinal_to_read < 5 {
2875                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2876                _next_ordinal_to_read += 1;
2877                next_offset += envelope_size;
2878            }
2879
2880            let next_out_of_line = decoder.next_out_of_line();
2881            let handles_before = decoder.remaining_handles();
2882            if let Some((inlined, num_bytes, num_handles)) =
2883                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2884            {
2885                let member_inline_size =
2886                    <fidl::BootInstant as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2887                if inlined != (member_inline_size <= 4) {
2888                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2889                }
2890                let inner_offset;
2891                let mut inner_depth = depth.clone();
2892                if inlined {
2893                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2894                    inner_offset = next_offset;
2895                } else {
2896                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2897                    inner_depth.increment()?;
2898                }
2899                let val_ref = self
2900                    .measurement_start
2901                    .get_or_insert_with(|| fidl::new_empty!(fidl::BootInstant, D));
2902                fidl::decode!(fidl::BootInstant, D, val_ref, decoder, inner_offset, inner_depth)?;
2903                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2904                {
2905                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2906                }
2907                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2908                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2909                }
2910            }
2911
2912            next_offset += envelope_size;
2913            _next_ordinal_to_read += 1;
2914            if next_offset >= end_offset {
2915                return Ok(());
2916            }
2917
2918            // Decode unknown envelopes for gaps in ordinals.
2919            while _next_ordinal_to_read < 6 {
2920                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2921                _next_ordinal_to_read += 1;
2922                next_offset += envelope_size;
2923            }
2924
2925            let next_out_of_line = decoder.next_out_of_line();
2926            let handles_before = decoder.remaining_handles();
2927            if let Some((inlined, num_bytes, num_handles)) =
2928                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2929            {
2930                let member_inline_size =
2931                    <fidl::BootInstant as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2932                if inlined != (member_inline_size <= 4) {
2933                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2934                }
2935                let inner_offset;
2936                let mut inner_depth = depth.clone();
2937                if inlined {
2938                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2939                    inner_offset = next_offset;
2940                } else {
2941                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2942                    inner_depth.increment()?;
2943                }
2944                let val_ref = self
2945                    .measurement_stop
2946                    .get_or_insert_with(|| fidl::new_empty!(fidl::BootInstant, D));
2947                fidl::decode!(fidl::BootInstant, D, val_ref, decoder, inner_offset, inner_depth)?;
2948                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2949                {
2950                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2951                }
2952                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2953                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2954                }
2955            }
2956
2957            next_offset += envelope_size;
2958            _next_ordinal_to_read += 1;
2959            if next_offset >= end_offset {
2960                return Ok(());
2961            }
2962
2963            // Decode unknown envelopes for gaps in ordinals.
2964            while _next_ordinal_to_read < 7 {
2965                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2966                _next_ordinal_to_read += 1;
2967                next_offset += envelope_size;
2968            }
2969
2970            let next_out_of_line = decoder.next_out_of_line();
2971            let handles_before = decoder.remaining_handles();
2972            if let Some((inlined, num_bytes, num_handles)) =
2973                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2974            {
2975                let member_inline_size =
2976                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2977                if inlined != (member_inline_size <= 4) {
2978                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2979                }
2980                let inner_offset;
2981                let mut inner_depth = depth.clone();
2982                if inlined {
2983                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2984                    inner_offset = next_offset;
2985                } else {
2986                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2987                    inner_depth.increment()?;
2988                }
2989                let val_ref = self.energy_uj.get_or_insert_with(|| fidl::new_empty!(i64, D));
2990                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
2991                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2992                {
2993                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2994                }
2995                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2996                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2997                }
2998            }
2999
3000            next_offset += envelope_size;
3001
3002            // Decode the remaining unknown envelopes.
3003            while next_offset < end_offset {
3004                _next_ordinal_to_read += 1;
3005                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3006                next_offset += envelope_size;
3007            }
3008
3009            Ok(())
3010        }
3011    }
3012}