Skip to main content

fidl_fuchsia_power_broker/
fidl_fuchsia_power_broker.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::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_power_broker__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14/// A token that represents the right to add a dependency upon another
15/// element. Should first be registered with Power Broker via
16/// ElementControl.RegisterDependencyToken of the required element.
17pub type DependencyToken = fidl::Event;
18
19/// A token that represents an open lease. The client's handle should be
20/// dropped to indicate the lease should be closed. This handle may be
21/// duplicated if the lease will be shared; the lease will remain open
22/// until the last handle is dropped.
23pub type LeaseToken = fidl::EventPair;
24
25#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
26pub struct ElementControlOpenStatusChannelRequest {
27    pub status_channel: fidl::endpoints::ServerEnd<StatusMarker>,
28}
29
30impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
31    for ElementControlOpenStatusChannelRequest
32{
33}
34
35#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
36pub struct ElementControlRegisterDependencyTokenRequest {
37    pub token: fidl::Event,
38}
39
40impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
41    for ElementControlRegisterDependencyTokenRequest
42{
43}
44
45#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
46pub struct ElementControlUnregisterDependencyTokenRequest {
47    pub token: fidl::Event,
48}
49
50impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
51    for ElementControlUnregisterDependencyTokenRequest
52{
53}
54
55#[derive(Debug, PartialEq)]
56pub struct ElementInfoProviderGetElementPowerLevelNamesResponse {
57    pub level_names: Vec<ElementPowerLevelNames>,
58}
59
60impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
61    for ElementInfoProviderGetElementPowerLevelNamesResponse
62{
63}
64
65#[derive(Debug, PartialEq)]
66pub struct ElementInfoProviderGetStatusEndpointsResponse {
67    pub endpoints: Vec<ElementStatusEndpoint>,
68}
69
70impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
71    for ElementInfoProviderGetStatusEndpointsResponse
72{
73}
74
75#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
76#[repr(C)]
77pub struct LessorLeaseRequest {
78    /// Power level of this element to be raised to.
79    pub level: u8,
80}
81
82impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for LessorLeaseRequest {}
83
84#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
85pub struct LessorLeaseResponse {
86    /// Channel for actions to be taken on the lease.
87    /// When this channel is closed, the lease will be dropped.
88    pub lease_control: fidl::endpoints::ClientEnd<LeaseControlMarker>,
89}
90
91impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for LessorLeaseResponse {}
92
93/// Describes a dependency from one power element's level on another power
94/// element's level.
95/// For example if element `PowerElement_A` has a level `PowerLevel_A3` which
96/// depends on an element `PowerElement_B` being at `PowerLevel_B2` then we would
97/// fill out the struct to convey the meaning:
98///   - `dependent_level` = `PowerLevel_A3`
99///   - `requires_token` = `PowerElement_B`
100///   - `requires_level_by_preference` = `[PowerLevel_B2]`
101/// (Note the values above are only *symbolic*, eg. `dependent_level` requires
102/// an integer value, not a string.)
103///
104/// The dependent Element's identity is not specified in this struct and must
105/// be specified as a separate argument in a request or be inferred, perhaps
106/// because a channel is scoped to the dependent element.
107#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
108pub struct LevelDependency {
109    /// The power element level that this `LevelDependency` struct declaration
110    /// supports. This is level that has a dependency on
111    /// `requires_level_by_preference`.
112    pub dependent_level: u8,
113    /// Must supply a token registered via the RegisterDependencyToken call of
114    /// the required element's ElementControl protocol.
115    pub requires_token: fidl::Event,
116    /// A list of levels in decreasing preferential order that power broker
117    /// should attempt to make required for this dependency to be satisfied.
118    /// The first level in list that is a valid level will become the required
119    /// level.
120    ///
121    /// Platform clients can use this list to keep backwards compatibility with
122    /// dependencies by providing multiple levels that the dependency may have
123    /// implemented in older API levels.
124    pub requires_level_by_preference: Vec<u8>,
125}
126
127impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for LevelDependency {}
128
129#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
130#[repr(C)]
131pub struct StatusWatchPowerLevelResponse {
132    pub current_level: u8,
133}
134
135impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
136    for StatusWatchPowerLevelResponse
137{
138}
139
140/// Passed to Topology.AddElement.
141#[derive(Debug, Default, PartialEq)]
142pub struct ElementSchema {
143    /// Human-readable name for logging and debug purposes.
144    pub element_name: Option<String>,
145    /// The initial current power level of the element.
146    pub initial_current_level: Option<u8>,
147    /// All power levels that are valid for this element. Any level not
148    /// specified here will be treated as invalid.
149    ///
150    /// Levels must be listed in ascending order from low to high. Note, levels are enums and their
151    /// integer values do not have an inherent meaning. For example, *theoretically* a binary
152    /// (off, on) could be represented with (0, 1), (1, 0), (17, 19) or any combination of two
153    /// two numbers. (But please use BinaryPowerLevel above!)
154    pub valid_levels: Option<Vec<u8>>,
155    /// List of dependencies for this element's power levels.
156    /// Note: dependencies UPON this element's levels cannot be added here.
157    pub dependencies: Option<Vec<LevelDependency>>,
158    /// REMOVED: 7: level_control_channels, use `element_runner` instead (see below).
159    ///
160    /// Optional. If passed, Leases for this element can be requested via this
161    /// channel.
162    pub lessor_channel: Option<fidl::endpoints::ServerEnd<LessorMarker>>,
163    /// Caller-provided ElementControl channel to be passed to Power Broker.
164    /// When this channel is dropped, the element will be removed from the
165    /// topology. All channels associated with this element will be
166    /// closed and all tokens registered to this element will be
167    /// unregistered.
168    pub element_control: Option<fidl::endpoints::ServerEnd<ElementControlMarker>>,
169    /// The client-end that Power Broker should use to set the power level of this element.
170    /// The server_end of this should be retained and the ElementRunner
171    /// protocol implemented by the element's runner.
172    pub element_runner: Option<fidl::endpoints::ClientEnd<ElementRunnerMarker>>,
173    #[doc(hidden)]
174    pub __source_breaking: fidl::marker::SourceBreaking,
175}
176
177impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ElementSchema {}
178
179/// Status client endpoint and a plaintext name for a specific Power Element. Names are
180/// expected to be unique between elements and persistent across reboots of the same build,
181/// but consistency is not guaranteed between different builds.
182#[derive(Debug, Default, PartialEq)]
183pub struct ElementStatusEndpoint {
184    pub identifier: Option<String>,
185    pub status: Option<fidl::endpoints::ClientEnd<StatusMarker>>,
186    #[doc(hidden)]
187    pub __source_breaking: fidl::marker::SourceBreaking,
188}
189
190impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ElementStatusEndpoint {}
191
192#[derive(Debug, Default, PartialEq)]
193pub struct LeaseDependency {
194    /// Must supply a token registered via the RegisterDependencyToken call of
195    /// the required element's ElementControl protocol.
196    pub requires_token: Option<fidl::Event>,
197    /// Level of the element required. Most clients will want to use this, but
198    /// for forward compatibility, requires_level_by_preference may be used
199    /// instead.
200    pub requires_level: Option<u8>,
201    /// Advanced Options
202    ///
203    /// (Optional) For forward compatibility, the list of levels in decreasing
204    /// preferential order that power broker should attempt to make required for
205    /// this dependency to be satisfied. The first level in list that is a valid
206    /// level will become the required level. If this is set, `requires_level`
207    /// will be ignored.
208    ///
209    /// Platform clients can use this list to keep backwards compatibility with
210    /// dependencies by providing multiple levels that the dependency may have
211    /// implemented in older API levels.
212    pub requires_level_by_preference: Option<Vec<u8>>,
213    #[doc(hidden)]
214    pub __source_breaking: fidl::marker::SourceBreaking,
215}
216
217impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for LeaseDependency {}
218
219/// Passed to Topology.Lease.
220#[derive(Debug, Default, PartialEq)]
221pub struct LeaseSchema {
222    /// The half of an eventpair to be held by the Power Broker. The other
223    /// half of the pair should be retained by the client. See `LeaseToken`
224    /// below for more usage details.
225    pub lease_token: Option<fidl::EventPair>,
226    /// Human-readable name for logging and debug purposes.
227    pub lease_name: Option<String>,
228    /// List of dependencies for this lease.
229    pub dependencies: Option<Vec<LeaseDependency>>,
230    /// (Optional) By default, `Topology.Lease` will wait until the lease is
231    /// `SATISFIED` before returning. If `should_return_pending_lease` is true,
232    /// it will instead return as soon as the lease has been granted by Power
233    /// Broker but it may still be `PENDING`. Clients can listen for
234    /// `LEASE_SIGNAL_SATISFIED` to know when the lease has been `SATISFIED`.
235    pub should_return_pending_lease: Option<bool>,
236    #[doc(hidden)]
237    pub __source_breaking: fidl::marker::SourceBreaking,
238}
239
240impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for LeaseSchema {}
241
242#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
243pub struct ElementControlMarker;
244
245impl fidl::endpoints::ProtocolMarker for ElementControlMarker {
246    type Proxy = ElementControlProxy;
247    type RequestStream = ElementControlRequestStream;
248    #[cfg(target_os = "fuchsia")]
249    type SynchronousProxy = ElementControlSynchronousProxy;
250
251    const DEBUG_NAME: &'static str = "(anonymous) ElementControl";
252}
253pub type ElementControlRegisterDependencyTokenResult = Result<(), RegisterDependencyTokenError>;
254pub type ElementControlUnregisterDependencyTokenResult = Result<(), UnregisterDependencyTokenError>;
255
256pub trait ElementControlProxyInterface: Send + Sync {
257    fn r#open_status_channel(
258        &self,
259        status_channel: fidl::endpoints::ServerEnd<StatusMarker>,
260    ) -> Result<(), fidl::Error>;
261    type RegisterDependencyTokenResponseFut: std::future::Future<
262            Output = Result<ElementControlRegisterDependencyTokenResult, fidl::Error>,
263        > + Send;
264    fn r#register_dependency_token(
265        &self,
266        token: fidl::Event,
267    ) -> Self::RegisterDependencyTokenResponseFut;
268    type UnregisterDependencyTokenResponseFut: std::future::Future<
269            Output = Result<ElementControlUnregisterDependencyTokenResult, fidl::Error>,
270        > + Send;
271    fn r#unregister_dependency_token(
272        &self,
273        token: fidl::Event,
274    ) -> Self::UnregisterDependencyTokenResponseFut;
275}
276#[derive(Debug)]
277#[cfg(target_os = "fuchsia")]
278pub struct ElementControlSynchronousProxy {
279    client: fidl::client::sync::Client,
280}
281
282#[cfg(target_os = "fuchsia")]
283impl fidl::endpoints::SynchronousProxy for ElementControlSynchronousProxy {
284    type Proxy = ElementControlProxy;
285    type Protocol = ElementControlMarker;
286
287    fn from_channel(inner: fidl::Channel) -> Self {
288        Self::new(inner)
289    }
290
291    fn into_channel(self) -> fidl::Channel {
292        self.client.into_channel()
293    }
294
295    fn as_channel(&self) -> &fidl::Channel {
296        self.client.as_channel()
297    }
298}
299
300#[cfg(target_os = "fuchsia")]
301impl ElementControlSynchronousProxy {
302    pub fn new(channel: fidl::Channel) -> Self {
303        let protocol_name = <ElementControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
304        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
305    }
306
307    pub fn into_channel(self) -> fidl::Channel {
308        self.client.into_channel()
309    }
310
311    /// Waits until an event arrives and returns it. It is safe for other
312    /// threads to make concurrent requests while waiting for an event.
313    pub fn wait_for_event(
314        &self,
315        deadline: zx::MonotonicInstant,
316    ) -> Result<ElementControlEvent, fidl::Error> {
317        ElementControlEvent::decode(self.client.wait_for_event(deadline)?)
318    }
319
320    /// Register a new Status channel on which Power Broker will send
321    /// read-only updates of the element's current power level. This method
322    /// is intended to allow element owners to give read-only access to the
323    /// element's current power level to clients by opening and transferring
324    /// this channel.
325    pub fn r#open_status_channel(
326        &self,
327        mut status_channel: fidl::endpoints::ServerEnd<StatusMarker>,
328    ) -> Result<(), fidl::Error> {
329        self.client.send::<ElementControlOpenStatusChannelRequest>(
330            (status_channel,),
331            0x4d7772e93dba6300,
332            fidl::encoding::DynamicFlags::FLEXIBLE,
333        )
334    }
335
336    /// Register a token which will permit the bearer to add either a
337    /// dependency upon this element.
338    pub fn r#register_dependency_token(
339        &self,
340        mut token: fidl::Event,
341        ___deadline: zx::MonotonicInstant,
342    ) -> Result<ElementControlRegisterDependencyTokenResult, fidl::Error> {
343        let _response = self.client.send_query::<
344            ElementControlRegisterDependencyTokenRequest,
345            fidl::encoding::FlexibleResultType<fidl::encoding::EmptyStruct, RegisterDependencyTokenError>,
346        >(
347            (token,),
348            0x3a5016663d198d61,
349            fidl::encoding::DynamicFlags::FLEXIBLE,
350            ___deadline,
351        )?
352        .into_result::<ElementControlMarker>("register_dependency_token")?;
353        Ok(_response.map(|x| x))
354    }
355
356    /// Unregister a token previously registered via RegisterDependencyToken.
357    pub fn r#unregister_dependency_token(
358        &self,
359        mut token: fidl::Event,
360        ___deadline: zx::MonotonicInstant,
361    ) -> Result<ElementControlUnregisterDependencyTokenResult, fidl::Error> {
362        let _response = self.client.send_query::<
363            ElementControlUnregisterDependencyTokenRequest,
364            fidl::encoding::FlexibleResultType<fidl::encoding::EmptyStruct, UnregisterDependencyTokenError>,
365        >(
366            (token,),
367            0x65a31a3661499529,
368            fidl::encoding::DynamicFlags::FLEXIBLE,
369            ___deadline,
370        )?
371        .into_result::<ElementControlMarker>("unregister_dependency_token")?;
372        Ok(_response.map(|x| x))
373    }
374}
375
376#[cfg(target_os = "fuchsia")]
377impl From<ElementControlSynchronousProxy> for zx::NullableHandle {
378    fn from(value: ElementControlSynchronousProxy) -> Self {
379        value.into_channel().into()
380    }
381}
382
383#[cfg(target_os = "fuchsia")]
384impl From<fidl::Channel> for ElementControlSynchronousProxy {
385    fn from(value: fidl::Channel) -> Self {
386        Self::new(value)
387    }
388}
389
390#[cfg(target_os = "fuchsia")]
391impl fidl::endpoints::FromClient for ElementControlSynchronousProxy {
392    type Protocol = ElementControlMarker;
393
394    fn from_client(value: fidl::endpoints::ClientEnd<ElementControlMarker>) -> Self {
395        Self::new(value.into_channel())
396    }
397}
398
399#[derive(Debug, Clone)]
400pub struct ElementControlProxy {
401    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
402}
403
404impl fidl::endpoints::Proxy for ElementControlProxy {
405    type Protocol = ElementControlMarker;
406
407    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
408        Self::new(inner)
409    }
410
411    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
412        self.client.into_channel().map_err(|client| Self { client })
413    }
414
415    fn as_channel(&self) -> &::fidl::AsyncChannel {
416        self.client.as_channel()
417    }
418}
419
420impl ElementControlProxy {
421    /// Create a new Proxy for fuchsia.power.broker/ElementControl.
422    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
423        let protocol_name = <ElementControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
424        Self { client: fidl::client::Client::new(channel, protocol_name) }
425    }
426
427    /// Get a Stream of events from the remote end of the protocol.
428    ///
429    /// # Panics
430    ///
431    /// Panics if the event stream was already taken.
432    pub fn take_event_stream(&self) -> ElementControlEventStream {
433        ElementControlEventStream { event_receiver: self.client.take_event_receiver() }
434    }
435
436    /// Register a new Status channel on which Power Broker will send
437    /// read-only updates of the element's current power level. This method
438    /// is intended to allow element owners to give read-only access to the
439    /// element's current power level to clients by opening and transferring
440    /// this channel.
441    pub fn r#open_status_channel(
442        &self,
443        mut status_channel: fidl::endpoints::ServerEnd<StatusMarker>,
444    ) -> Result<(), fidl::Error> {
445        ElementControlProxyInterface::r#open_status_channel(self, status_channel)
446    }
447
448    /// Register a token which will permit the bearer to add either a
449    /// dependency upon this element.
450    pub fn r#register_dependency_token(
451        &self,
452        mut token: fidl::Event,
453    ) -> fidl::client::QueryResponseFut<
454        ElementControlRegisterDependencyTokenResult,
455        fidl::encoding::DefaultFuchsiaResourceDialect,
456    > {
457        ElementControlProxyInterface::r#register_dependency_token(self, token)
458    }
459
460    /// Unregister a token previously registered via RegisterDependencyToken.
461    pub fn r#unregister_dependency_token(
462        &self,
463        mut token: fidl::Event,
464    ) -> fidl::client::QueryResponseFut<
465        ElementControlUnregisterDependencyTokenResult,
466        fidl::encoding::DefaultFuchsiaResourceDialect,
467    > {
468        ElementControlProxyInterface::r#unregister_dependency_token(self, token)
469    }
470}
471
472impl ElementControlProxyInterface for ElementControlProxy {
473    fn r#open_status_channel(
474        &self,
475        mut status_channel: fidl::endpoints::ServerEnd<StatusMarker>,
476    ) -> Result<(), fidl::Error> {
477        self.client.send::<ElementControlOpenStatusChannelRequest>(
478            (status_channel,),
479            0x4d7772e93dba6300,
480            fidl::encoding::DynamicFlags::FLEXIBLE,
481        )
482    }
483
484    type RegisterDependencyTokenResponseFut = fidl::client::QueryResponseFut<
485        ElementControlRegisterDependencyTokenResult,
486        fidl::encoding::DefaultFuchsiaResourceDialect,
487    >;
488    fn r#register_dependency_token(
489        &self,
490        mut token: fidl::Event,
491    ) -> Self::RegisterDependencyTokenResponseFut {
492        fn _decode(
493            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
494        ) -> Result<ElementControlRegisterDependencyTokenResult, fidl::Error> {
495            let _response = fidl::client::decode_transaction_body::<
496                fidl::encoding::FlexibleResultType<
497                    fidl::encoding::EmptyStruct,
498                    RegisterDependencyTokenError,
499                >,
500                fidl::encoding::DefaultFuchsiaResourceDialect,
501                0x3a5016663d198d61,
502            >(_buf?)?
503            .into_result::<ElementControlMarker>("register_dependency_token")?;
504            Ok(_response.map(|x| x))
505        }
506        self.client.send_query_and_decode::<
507            ElementControlRegisterDependencyTokenRequest,
508            ElementControlRegisterDependencyTokenResult,
509        >(
510            (token,),
511            0x3a5016663d198d61,
512            fidl::encoding::DynamicFlags::FLEXIBLE,
513            _decode,
514        )
515    }
516
517    type UnregisterDependencyTokenResponseFut = fidl::client::QueryResponseFut<
518        ElementControlUnregisterDependencyTokenResult,
519        fidl::encoding::DefaultFuchsiaResourceDialect,
520    >;
521    fn r#unregister_dependency_token(
522        &self,
523        mut token: fidl::Event,
524    ) -> Self::UnregisterDependencyTokenResponseFut {
525        fn _decode(
526            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
527        ) -> Result<ElementControlUnregisterDependencyTokenResult, fidl::Error> {
528            let _response = fidl::client::decode_transaction_body::<
529                fidl::encoding::FlexibleResultType<
530                    fidl::encoding::EmptyStruct,
531                    UnregisterDependencyTokenError,
532                >,
533                fidl::encoding::DefaultFuchsiaResourceDialect,
534                0x65a31a3661499529,
535            >(_buf?)?
536            .into_result::<ElementControlMarker>("unregister_dependency_token")?;
537            Ok(_response.map(|x| x))
538        }
539        self.client.send_query_and_decode::<
540            ElementControlUnregisterDependencyTokenRequest,
541            ElementControlUnregisterDependencyTokenResult,
542        >(
543            (token,),
544            0x65a31a3661499529,
545            fidl::encoding::DynamicFlags::FLEXIBLE,
546            _decode,
547        )
548    }
549}
550
551pub struct ElementControlEventStream {
552    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
553}
554
555impl std::marker::Unpin for ElementControlEventStream {}
556
557impl futures::stream::FusedStream for ElementControlEventStream {
558    fn is_terminated(&self) -> bool {
559        self.event_receiver.is_terminated()
560    }
561}
562
563impl futures::Stream for ElementControlEventStream {
564    type Item = Result<ElementControlEvent, fidl::Error>;
565
566    fn poll_next(
567        mut self: std::pin::Pin<&mut Self>,
568        cx: &mut std::task::Context<'_>,
569    ) -> std::task::Poll<Option<Self::Item>> {
570        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
571            &mut self.event_receiver,
572            cx
573        )?) {
574            Some(buf) => std::task::Poll::Ready(Some(ElementControlEvent::decode(buf))),
575            None => std::task::Poll::Ready(None),
576        }
577    }
578}
579
580#[derive(Debug)]
581pub enum ElementControlEvent {
582    #[non_exhaustive]
583    _UnknownEvent {
584        /// Ordinal of the event that was sent.
585        ordinal: u64,
586    },
587}
588
589impl ElementControlEvent {
590    /// Decodes a message buffer as a [`ElementControlEvent`].
591    fn decode(
592        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
593    ) -> Result<ElementControlEvent, fidl::Error> {
594        let (bytes, _handles) = buf.split_mut();
595        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
596        debug_assert_eq!(tx_header.tx_id, 0);
597        match tx_header.ordinal {
598            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
599                Ok(ElementControlEvent::_UnknownEvent { ordinal: tx_header.ordinal })
600            }
601            _ => Err(fidl::Error::UnknownOrdinal {
602                ordinal: tx_header.ordinal,
603                protocol_name:
604                    <ElementControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
605            }),
606        }
607    }
608}
609
610/// A Stream of incoming requests for fuchsia.power.broker/ElementControl.
611pub struct ElementControlRequestStream {
612    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
613    is_terminated: bool,
614}
615
616impl std::marker::Unpin for ElementControlRequestStream {}
617
618impl futures::stream::FusedStream for ElementControlRequestStream {
619    fn is_terminated(&self) -> bool {
620        self.is_terminated
621    }
622}
623
624impl fidl::endpoints::RequestStream for ElementControlRequestStream {
625    type Protocol = ElementControlMarker;
626    type ControlHandle = ElementControlControlHandle;
627
628    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
629        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
630    }
631
632    fn control_handle(&self) -> Self::ControlHandle {
633        ElementControlControlHandle { inner: self.inner.clone() }
634    }
635
636    fn into_inner(
637        self,
638    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
639    {
640        (self.inner, self.is_terminated)
641    }
642
643    fn from_inner(
644        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
645        is_terminated: bool,
646    ) -> Self {
647        Self { inner, is_terminated }
648    }
649}
650
651impl futures::Stream for ElementControlRequestStream {
652    type Item = Result<ElementControlRequest, fidl::Error>;
653
654    fn poll_next(
655        mut self: std::pin::Pin<&mut Self>,
656        cx: &mut std::task::Context<'_>,
657    ) -> std::task::Poll<Option<Self::Item>> {
658        let this = &mut *self;
659        if this.inner.check_shutdown(cx) {
660            this.is_terminated = true;
661            return std::task::Poll::Ready(None);
662        }
663        if this.is_terminated {
664            panic!("polled ElementControlRequestStream after completion");
665        }
666        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
667            |bytes, handles| {
668                match this.inner.channel().read_etc(cx, bytes, handles) {
669                    std::task::Poll::Ready(Ok(())) => {}
670                    std::task::Poll::Pending => return std::task::Poll::Pending,
671                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
672                        this.is_terminated = true;
673                        return std::task::Poll::Ready(None);
674                    }
675                    std::task::Poll::Ready(Err(e)) => {
676                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
677                            e.into(),
678                        ))));
679                    }
680                }
681
682                // A message has been received from the channel
683                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
684
685                std::task::Poll::Ready(Some(match header.ordinal {
686                    0x4d7772e93dba6300 => {
687                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
688                        let mut req = fidl::new_empty!(
689                            ElementControlOpenStatusChannelRequest,
690                            fidl::encoding::DefaultFuchsiaResourceDialect
691                        );
692                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ElementControlOpenStatusChannelRequest>(&header, _body_bytes, handles, &mut req)?;
693                        let control_handle =
694                            ElementControlControlHandle { inner: this.inner.clone() };
695                        Ok(ElementControlRequest::OpenStatusChannel {
696                            status_channel: req.status_channel,
697
698                            control_handle,
699                        })
700                    }
701                    0x3a5016663d198d61 => {
702                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
703                        let mut req = fidl::new_empty!(
704                            ElementControlRegisterDependencyTokenRequest,
705                            fidl::encoding::DefaultFuchsiaResourceDialect
706                        );
707                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ElementControlRegisterDependencyTokenRequest>(&header, _body_bytes, handles, &mut req)?;
708                        let control_handle =
709                            ElementControlControlHandle { inner: this.inner.clone() };
710                        Ok(ElementControlRequest::RegisterDependencyToken {
711                            token: req.token,
712
713                            responder: ElementControlRegisterDependencyTokenResponder {
714                                control_handle: std::mem::ManuallyDrop::new(control_handle),
715                                tx_id: header.tx_id,
716                            },
717                        })
718                    }
719                    0x65a31a3661499529 => {
720                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
721                        let mut req = fidl::new_empty!(
722                            ElementControlUnregisterDependencyTokenRequest,
723                            fidl::encoding::DefaultFuchsiaResourceDialect
724                        );
725                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ElementControlUnregisterDependencyTokenRequest>(&header, _body_bytes, handles, &mut req)?;
726                        let control_handle =
727                            ElementControlControlHandle { inner: this.inner.clone() };
728                        Ok(ElementControlRequest::UnregisterDependencyToken {
729                            token: req.token,
730
731                            responder: ElementControlUnregisterDependencyTokenResponder {
732                                control_handle: std::mem::ManuallyDrop::new(control_handle),
733                                tx_id: header.tx_id,
734                            },
735                        })
736                    }
737                    _ if header.tx_id == 0
738                        && header
739                            .dynamic_flags()
740                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
741                    {
742                        Ok(ElementControlRequest::_UnknownMethod {
743                            ordinal: header.ordinal,
744                            control_handle: ElementControlControlHandle {
745                                inner: this.inner.clone(),
746                            },
747                            method_type: fidl::MethodType::OneWay,
748                        })
749                    }
750                    _ if header
751                        .dynamic_flags()
752                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
753                    {
754                        this.inner.send_framework_err(
755                            fidl::encoding::FrameworkErr::UnknownMethod,
756                            header.tx_id,
757                            header.ordinal,
758                            header.dynamic_flags(),
759                            (bytes, handles),
760                        )?;
761                        Ok(ElementControlRequest::_UnknownMethod {
762                            ordinal: header.ordinal,
763                            control_handle: ElementControlControlHandle {
764                                inner: this.inner.clone(),
765                            },
766                            method_type: fidl::MethodType::TwoWay,
767                        })
768                    }
769                    _ => Err(fidl::Error::UnknownOrdinal {
770                        ordinal: header.ordinal,
771                        protocol_name:
772                            <ElementControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
773                    }),
774                }))
775            },
776        )
777    }
778}
779
780/// Provides element-scoped access to an element previously added via
781/// Topology.AddElement.
782#[derive(Debug)]
783pub enum ElementControlRequest {
784    /// Register a new Status channel on which Power Broker will send
785    /// read-only updates of the element's current power level. This method
786    /// is intended to allow element owners to give read-only access to the
787    /// element's current power level to clients by opening and transferring
788    /// this channel.
789    OpenStatusChannel {
790        status_channel: fidl::endpoints::ServerEnd<StatusMarker>,
791        control_handle: ElementControlControlHandle,
792    },
793    /// Register a token which will permit the bearer to add either a
794    /// dependency upon this element.
795    RegisterDependencyToken {
796        token: fidl::Event,
797        responder: ElementControlRegisterDependencyTokenResponder,
798    },
799    /// Unregister a token previously registered via RegisterDependencyToken.
800    UnregisterDependencyToken {
801        token: fidl::Event,
802        responder: ElementControlUnregisterDependencyTokenResponder,
803    },
804    /// An interaction was received which does not match any known method.
805    #[non_exhaustive]
806    _UnknownMethod {
807        /// Ordinal of the method that was called.
808        ordinal: u64,
809        control_handle: ElementControlControlHandle,
810        method_type: fidl::MethodType,
811    },
812}
813
814impl ElementControlRequest {
815    #[allow(irrefutable_let_patterns)]
816    pub fn into_open_status_channel(
817        self,
818    ) -> Option<(fidl::endpoints::ServerEnd<StatusMarker>, ElementControlControlHandle)> {
819        if let ElementControlRequest::OpenStatusChannel { status_channel, control_handle } = self {
820            Some((status_channel, control_handle))
821        } else {
822            None
823        }
824    }
825
826    #[allow(irrefutable_let_patterns)]
827    pub fn into_register_dependency_token(
828        self,
829    ) -> Option<(fidl::Event, ElementControlRegisterDependencyTokenResponder)> {
830        if let ElementControlRequest::RegisterDependencyToken { token, responder } = self {
831            Some((token, responder))
832        } else {
833            None
834        }
835    }
836
837    #[allow(irrefutable_let_patterns)]
838    pub fn into_unregister_dependency_token(
839        self,
840    ) -> Option<(fidl::Event, ElementControlUnregisterDependencyTokenResponder)> {
841        if let ElementControlRequest::UnregisterDependencyToken { token, responder } = self {
842            Some((token, responder))
843        } else {
844            None
845        }
846    }
847
848    /// Name of the method defined in FIDL
849    pub fn method_name(&self) -> &'static str {
850        match *self {
851            ElementControlRequest::OpenStatusChannel { .. } => "open_status_channel",
852            ElementControlRequest::RegisterDependencyToken { .. } => "register_dependency_token",
853            ElementControlRequest::UnregisterDependencyToken { .. } => {
854                "unregister_dependency_token"
855            }
856            ElementControlRequest::_UnknownMethod {
857                method_type: fidl::MethodType::OneWay, ..
858            } => "unknown one-way method",
859            ElementControlRequest::_UnknownMethod {
860                method_type: fidl::MethodType::TwoWay, ..
861            } => "unknown two-way method",
862        }
863    }
864}
865
866#[derive(Debug, Clone)]
867pub struct ElementControlControlHandle {
868    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
869}
870
871impl fidl::endpoints::ControlHandle for ElementControlControlHandle {
872    fn shutdown(&self) {
873        self.inner.shutdown()
874    }
875
876    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
877        self.inner.shutdown_with_epitaph(status)
878    }
879
880    fn is_closed(&self) -> bool {
881        self.inner.channel().is_closed()
882    }
883    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
884        self.inner.channel().on_closed()
885    }
886
887    #[cfg(target_os = "fuchsia")]
888    fn signal_peer(
889        &self,
890        clear_mask: zx::Signals,
891        set_mask: zx::Signals,
892    ) -> Result<(), zx_status::Status> {
893        use fidl::Peered;
894        self.inner.channel().signal_peer(clear_mask, set_mask)
895    }
896}
897
898impl ElementControlControlHandle {}
899
900#[must_use = "FIDL methods require a response to be sent"]
901#[derive(Debug)]
902pub struct ElementControlRegisterDependencyTokenResponder {
903    control_handle: std::mem::ManuallyDrop<ElementControlControlHandle>,
904    tx_id: u32,
905}
906
907/// Set the the channel to be shutdown (see [`ElementControlControlHandle::shutdown`])
908/// if the responder is dropped without sending a response, so that the client
909/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
910impl std::ops::Drop for ElementControlRegisterDependencyTokenResponder {
911    fn drop(&mut self) {
912        self.control_handle.shutdown();
913        // Safety: drops once, never accessed again
914        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
915    }
916}
917
918impl fidl::endpoints::Responder for ElementControlRegisterDependencyTokenResponder {
919    type ControlHandle = ElementControlControlHandle;
920
921    fn control_handle(&self) -> &ElementControlControlHandle {
922        &self.control_handle
923    }
924
925    fn drop_without_shutdown(mut self) {
926        // Safety: drops once, never accessed again due to mem::forget
927        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
928        // Prevent Drop from running (which would shut down the channel)
929        std::mem::forget(self);
930    }
931}
932
933impl ElementControlRegisterDependencyTokenResponder {
934    /// Sends a response to the FIDL transaction.
935    ///
936    /// Sets the channel to shutdown if an error occurs.
937    pub fn send(
938        self,
939        mut result: Result<(), RegisterDependencyTokenError>,
940    ) -> Result<(), fidl::Error> {
941        let _result = self.send_raw(result);
942        if _result.is_err() {
943            self.control_handle.shutdown();
944        }
945        self.drop_without_shutdown();
946        _result
947    }
948
949    /// Similar to "send" but does not shutdown the channel if an error occurs.
950    pub fn send_no_shutdown_on_err(
951        self,
952        mut result: Result<(), RegisterDependencyTokenError>,
953    ) -> Result<(), fidl::Error> {
954        let _result = self.send_raw(result);
955        self.drop_without_shutdown();
956        _result
957    }
958
959    fn send_raw(
960        &self,
961        mut result: Result<(), RegisterDependencyTokenError>,
962    ) -> Result<(), fidl::Error> {
963        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
964            fidl::encoding::EmptyStruct,
965            RegisterDependencyTokenError,
966        >>(
967            fidl::encoding::FlexibleResult::new(result),
968            self.tx_id,
969            0x3a5016663d198d61,
970            fidl::encoding::DynamicFlags::FLEXIBLE,
971        )
972    }
973}
974
975#[must_use = "FIDL methods require a response to be sent"]
976#[derive(Debug)]
977pub struct ElementControlUnregisterDependencyTokenResponder {
978    control_handle: std::mem::ManuallyDrop<ElementControlControlHandle>,
979    tx_id: u32,
980}
981
982/// Set the the channel to be shutdown (see [`ElementControlControlHandle::shutdown`])
983/// if the responder is dropped without sending a response, so that the client
984/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
985impl std::ops::Drop for ElementControlUnregisterDependencyTokenResponder {
986    fn drop(&mut self) {
987        self.control_handle.shutdown();
988        // Safety: drops once, never accessed again
989        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
990    }
991}
992
993impl fidl::endpoints::Responder for ElementControlUnregisterDependencyTokenResponder {
994    type ControlHandle = ElementControlControlHandle;
995
996    fn control_handle(&self) -> &ElementControlControlHandle {
997        &self.control_handle
998    }
999
1000    fn drop_without_shutdown(mut self) {
1001        // Safety: drops once, never accessed again due to mem::forget
1002        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1003        // Prevent Drop from running (which would shut down the channel)
1004        std::mem::forget(self);
1005    }
1006}
1007
1008impl ElementControlUnregisterDependencyTokenResponder {
1009    /// Sends a response to the FIDL transaction.
1010    ///
1011    /// Sets the channel to shutdown if an error occurs.
1012    pub fn send(
1013        self,
1014        mut result: Result<(), UnregisterDependencyTokenError>,
1015    ) -> Result<(), fidl::Error> {
1016        let _result = self.send_raw(result);
1017        if _result.is_err() {
1018            self.control_handle.shutdown();
1019        }
1020        self.drop_without_shutdown();
1021        _result
1022    }
1023
1024    /// Similar to "send" but does not shutdown the channel if an error occurs.
1025    pub fn send_no_shutdown_on_err(
1026        self,
1027        mut result: Result<(), UnregisterDependencyTokenError>,
1028    ) -> Result<(), fidl::Error> {
1029        let _result = self.send_raw(result);
1030        self.drop_without_shutdown();
1031        _result
1032    }
1033
1034    fn send_raw(
1035        &self,
1036        mut result: Result<(), UnregisterDependencyTokenError>,
1037    ) -> Result<(), fidl::Error> {
1038        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
1039            fidl::encoding::EmptyStruct,
1040            UnregisterDependencyTokenError,
1041        >>(
1042            fidl::encoding::FlexibleResult::new(result),
1043            self.tx_id,
1044            0x65a31a3661499529,
1045            fidl::encoding::DynamicFlags::FLEXIBLE,
1046        )
1047    }
1048}
1049
1050#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
1051pub struct ElementInfoProviderMarker;
1052
1053impl fidl::endpoints::ProtocolMarker for ElementInfoProviderMarker {
1054    type Proxy = ElementInfoProviderProxy;
1055    type RequestStream = ElementInfoProviderRequestStream;
1056    #[cfg(target_os = "fuchsia")]
1057    type SynchronousProxy = ElementInfoProviderSynchronousProxy;
1058
1059    const DEBUG_NAME: &'static str = "fuchsia.power.broker.ElementInfoProvider";
1060}
1061impl fidl::endpoints::DiscoverableProtocolMarker for ElementInfoProviderMarker {}
1062pub type ElementInfoProviderGetElementPowerLevelNamesResult =
1063    Result<Vec<ElementPowerLevelNames>, ElementInfoProviderError>;
1064pub type ElementInfoProviderGetStatusEndpointsResult =
1065    Result<Vec<ElementStatusEndpoint>, ElementInfoProviderError>;
1066
1067pub trait ElementInfoProviderProxyInterface: Send + Sync {
1068    type GetElementPowerLevelNamesResponseFut: std::future::Future<
1069            Output = Result<ElementInfoProviderGetElementPowerLevelNamesResult, fidl::Error>,
1070        > + Send;
1071    fn r#get_element_power_level_names(&self) -> Self::GetElementPowerLevelNamesResponseFut;
1072    type GetStatusEndpointsResponseFut: std::future::Future<
1073            Output = Result<ElementInfoProviderGetStatusEndpointsResult, fidl::Error>,
1074        > + Send;
1075    fn r#get_status_endpoints(&self) -> Self::GetStatusEndpointsResponseFut;
1076}
1077#[derive(Debug)]
1078#[cfg(target_os = "fuchsia")]
1079pub struct ElementInfoProviderSynchronousProxy {
1080    client: fidl::client::sync::Client,
1081}
1082
1083#[cfg(target_os = "fuchsia")]
1084impl fidl::endpoints::SynchronousProxy for ElementInfoProviderSynchronousProxy {
1085    type Proxy = ElementInfoProviderProxy;
1086    type Protocol = ElementInfoProviderMarker;
1087
1088    fn from_channel(inner: fidl::Channel) -> Self {
1089        Self::new(inner)
1090    }
1091
1092    fn into_channel(self) -> fidl::Channel {
1093        self.client.into_channel()
1094    }
1095
1096    fn as_channel(&self) -> &fidl::Channel {
1097        self.client.as_channel()
1098    }
1099}
1100
1101#[cfg(target_os = "fuchsia")]
1102impl ElementInfoProviderSynchronousProxy {
1103    pub fn new(channel: fidl::Channel) -> Self {
1104        let protocol_name =
1105            <ElementInfoProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1106        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
1107    }
1108
1109    pub fn into_channel(self) -> fidl::Channel {
1110        self.client.into_channel()
1111    }
1112
1113    /// Waits until an event arrives and returns it. It is safe for other
1114    /// threads to make concurrent requests while waiting for an event.
1115    pub fn wait_for_event(
1116        &self,
1117        deadline: zx::MonotonicInstant,
1118    ) -> Result<ElementInfoProviderEvent, fidl::Error> {
1119        ElementInfoProviderEvent::decode(self.client.wait_for_event(deadline)?)
1120    }
1121
1122    /// Returns mappings of PowerLevels to plaintext names for each element managed
1123    /// by a component. Returns an error if no mappings can be returned.
1124    pub fn r#get_element_power_level_names(
1125        &self,
1126        ___deadline: zx::MonotonicInstant,
1127    ) -> Result<ElementInfoProviderGetElementPowerLevelNamesResult, fidl::Error> {
1128        let _response = self
1129            .client
1130            .send_query::<fidl::encoding::EmptyPayload, fidl::encoding::FlexibleResultType<
1131                ElementInfoProviderGetElementPowerLevelNamesResponse,
1132                ElementInfoProviderError,
1133            >>(
1134                (), 0x298f63881fc9ed49, fidl::encoding::DynamicFlags::FLEXIBLE, ___deadline
1135            )?
1136            .into_result::<ElementInfoProviderMarker>("get_element_power_level_names")?;
1137        Ok(_response.map(|x| x.level_names))
1138    }
1139
1140    /// Returns available Status client endpoints and stable identifiers for each
1141    /// element managed by a component. Returns an error if no endpoints can be
1142    /// returned (i.e. no elements were able to implement the Status channel).
1143    pub fn r#get_status_endpoints(
1144        &self,
1145        ___deadline: zx::MonotonicInstant,
1146    ) -> Result<ElementInfoProviderGetStatusEndpointsResult, fidl::Error> {
1147        let _response = self
1148            .client
1149            .send_query::<fidl::encoding::EmptyPayload, fidl::encoding::FlexibleResultType<
1150                ElementInfoProviderGetStatusEndpointsResponse,
1151                ElementInfoProviderError,
1152            >>(
1153                (), 0x456f2b6c5bf0777c, fidl::encoding::DynamicFlags::FLEXIBLE, ___deadline
1154            )?
1155            .into_result::<ElementInfoProviderMarker>("get_status_endpoints")?;
1156        Ok(_response.map(|x| x.endpoints))
1157    }
1158}
1159
1160#[cfg(target_os = "fuchsia")]
1161impl From<ElementInfoProviderSynchronousProxy> for zx::NullableHandle {
1162    fn from(value: ElementInfoProviderSynchronousProxy) -> Self {
1163        value.into_channel().into()
1164    }
1165}
1166
1167#[cfg(target_os = "fuchsia")]
1168impl From<fidl::Channel> for ElementInfoProviderSynchronousProxy {
1169    fn from(value: fidl::Channel) -> Self {
1170        Self::new(value)
1171    }
1172}
1173
1174#[cfg(target_os = "fuchsia")]
1175impl fidl::endpoints::FromClient for ElementInfoProviderSynchronousProxy {
1176    type Protocol = ElementInfoProviderMarker;
1177
1178    fn from_client(value: fidl::endpoints::ClientEnd<ElementInfoProviderMarker>) -> Self {
1179        Self::new(value.into_channel())
1180    }
1181}
1182
1183#[derive(Debug, Clone)]
1184pub struct ElementInfoProviderProxy {
1185    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
1186}
1187
1188impl fidl::endpoints::Proxy for ElementInfoProviderProxy {
1189    type Protocol = ElementInfoProviderMarker;
1190
1191    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
1192        Self::new(inner)
1193    }
1194
1195    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
1196        self.client.into_channel().map_err(|client| Self { client })
1197    }
1198
1199    fn as_channel(&self) -> &::fidl::AsyncChannel {
1200        self.client.as_channel()
1201    }
1202}
1203
1204impl ElementInfoProviderProxy {
1205    /// Create a new Proxy for fuchsia.power.broker/ElementInfoProvider.
1206    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
1207        let protocol_name =
1208            <ElementInfoProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1209        Self { client: fidl::client::Client::new(channel, protocol_name) }
1210    }
1211
1212    /// Get a Stream of events from the remote end of the protocol.
1213    ///
1214    /// # Panics
1215    ///
1216    /// Panics if the event stream was already taken.
1217    pub fn take_event_stream(&self) -> ElementInfoProviderEventStream {
1218        ElementInfoProviderEventStream { event_receiver: self.client.take_event_receiver() }
1219    }
1220
1221    /// Returns mappings of PowerLevels to plaintext names for each element managed
1222    /// by a component. Returns an error if no mappings can be returned.
1223    pub fn r#get_element_power_level_names(
1224        &self,
1225    ) -> fidl::client::QueryResponseFut<
1226        ElementInfoProviderGetElementPowerLevelNamesResult,
1227        fidl::encoding::DefaultFuchsiaResourceDialect,
1228    > {
1229        ElementInfoProviderProxyInterface::r#get_element_power_level_names(self)
1230    }
1231
1232    /// Returns available Status client endpoints and stable identifiers for each
1233    /// element managed by a component. Returns an error if no endpoints can be
1234    /// returned (i.e. no elements were able to implement the Status channel).
1235    pub fn r#get_status_endpoints(
1236        &self,
1237    ) -> fidl::client::QueryResponseFut<
1238        ElementInfoProviderGetStatusEndpointsResult,
1239        fidl::encoding::DefaultFuchsiaResourceDialect,
1240    > {
1241        ElementInfoProviderProxyInterface::r#get_status_endpoints(self)
1242    }
1243}
1244
1245impl ElementInfoProviderProxyInterface for ElementInfoProviderProxy {
1246    type GetElementPowerLevelNamesResponseFut = fidl::client::QueryResponseFut<
1247        ElementInfoProviderGetElementPowerLevelNamesResult,
1248        fidl::encoding::DefaultFuchsiaResourceDialect,
1249    >;
1250    fn r#get_element_power_level_names(&self) -> Self::GetElementPowerLevelNamesResponseFut {
1251        fn _decode(
1252            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1253        ) -> Result<ElementInfoProviderGetElementPowerLevelNamesResult, fidl::Error> {
1254            let _response = fidl::client::decode_transaction_body::<
1255                fidl::encoding::FlexibleResultType<
1256                    ElementInfoProviderGetElementPowerLevelNamesResponse,
1257                    ElementInfoProviderError,
1258                >,
1259                fidl::encoding::DefaultFuchsiaResourceDialect,
1260                0x298f63881fc9ed49,
1261            >(_buf?)?
1262            .into_result::<ElementInfoProviderMarker>("get_element_power_level_names")?;
1263            Ok(_response.map(|x| x.level_names))
1264        }
1265        self.client.send_query_and_decode::<
1266            fidl::encoding::EmptyPayload,
1267            ElementInfoProviderGetElementPowerLevelNamesResult,
1268        >(
1269            (),
1270            0x298f63881fc9ed49,
1271            fidl::encoding::DynamicFlags::FLEXIBLE,
1272            _decode,
1273        )
1274    }
1275
1276    type GetStatusEndpointsResponseFut = fidl::client::QueryResponseFut<
1277        ElementInfoProviderGetStatusEndpointsResult,
1278        fidl::encoding::DefaultFuchsiaResourceDialect,
1279    >;
1280    fn r#get_status_endpoints(&self) -> Self::GetStatusEndpointsResponseFut {
1281        fn _decode(
1282            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1283        ) -> Result<ElementInfoProviderGetStatusEndpointsResult, fidl::Error> {
1284            let _response = fidl::client::decode_transaction_body::<
1285                fidl::encoding::FlexibleResultType<
1286                    ElementInfoProviderGetStatusEndpointsResponse,
1287                    ElementInfoProviderError,
1288                >,
1289                fidl::encoding::DefaultFuchsiaResourceDialect,
1290                0x456f2b6c5bf0777c,
1291            >(_buf?)?
1292            .into_result::<ElementInfoProviderMarker>("get_status_endpoints")?;
1293            Ok(_response.map(|x| x.endpoints))
1294        }
1295        self.client.send_query_and_decode::<
1296            fidl::encoding::EmptyPayload,
1297            ElementInfoProviderGetStatusEndpointsResult,
1298        >(
1299            (),
1300            0x456f2b6c5bf0777c,
1301            fidl::encoding::DynamicFlags::FLEXIBLE,
1302            _decode,
1303        )
1304    }
1305}
1306
1307pub struct ElementInfoProviderEventStream {
1308    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
1309}
1310
1311impl std::marker::Unpin for ElementInfoProviderEventStream {}
1312
1313impl futures::stream::FusedStream for ElementInfoProviderEventStream {
1314    fn is_terminated(&self) -> bool {
1315        self.event_receiver.is_terminated()
1316    }
1317}
1318
1319impl futures::Stream for ElementInfoProviderEventStream {
1320    type Item = Result<ElementInfoProviderEvent, fidl::Error>;
1321
1322    fn poll_next(
1323        mut self: std::pin::Pin<&mut Self>,
1324        cx: &mut std::task::Context<'_>,
1325    ) -> std::task::Poll<Option<Self::Item>> {
1326        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1327            &mut self.event_receiver,
1328            cx
1329        )?) {
1330            Some(buf) => std::task::Poll::Ready(Some(ElementInfoProviderEvent::decode(buf))),
1331            None => std::task::Poll::Ready(None),
1332        }
1333    }
1334}
1335
1336#[derive(Debug)]
1337pub enum ElementInfoProviderEvent {
1338    #[non_exhaustive]
1339    _UnknownEvent {
1340        /// Ordinal of the event that was sent.
1341        ordinal: u64,
1342    },
1343}
1344
1345impl ElementInfoProviderEvent {
1346    /// Decodes a message buffer as a [`ElementInfoProviderEvent`].
1347    fn decode(
1348        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1349    ) -> Result<ElementInfoProviderEvent, fidl::Error> {
1350        let (bytes, _handles) = buf.split_mut();
1351        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1352        debug_assert_eq!(tx_header.tx_id, 0);
1353        match tx_header.ordinal {
1354            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
1355                Ok(ElementInfoProviderEvent::_UnknownEvent { ordinal: tx_header.ordinal })
1356            }
1357            _ => Err(fidl::Error::UnknownOrdinal {
1358                ordinal: tx_header.ordinal,
1359                protocol_name:
1360                    <ElementInfoProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1361            }),
1362        }
1363    }
1364}
1365
1366/// A Stream of incoming requests for fuchsia.power.broker/ElementInfoProvider.
1367pub struct ElementInfoProviderRequestStream {
1368    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1369    is_terminated: bool,
1370}
1371
1372impl std::marker::Unpin for ElementInfoProviderRequestStream {}
1373
1374impl futures::stream::FusedStream for ElementInfoProviderRequestStream {
1375    fn is_terminated(&self) -> bool {
1376        self.is_terminated
1377    }
1378}
1379
1380impl fidl::endpoints::RequestStream for ElementInfoProviderRequestStream {
1381    type Protocol = ElementInfoProviderMarker;
1382    type ControlHandle = ElementInfoProviderControlHandle;
1383
1384    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
1385        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
1386    }
1387
1388    fn control_handle(&self) -> Self::ControlHandle {
1389        ElementInfoProviderControlHandle { inner: self.inner.clone() }
1390    }
1391
1392    fn into_inner(
1393        self,
1394    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
1395    {
1396        (self.inner, self.is_terminated)
1397    }
1398
1399    fn from_inner(
1400        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1401        is_terminated: bool,
1402    ) -> Self {
1403        Self { inner, is_terminated }
1404    }
1405}
1406
1407impl futures::Stream for ElementInfoProviderRequestStream {
1408    type Item = Result<ElementInfoProviderRequest, fidl::Error>;
1409
1410    fn poll_next(
1411        mut self: std::pin::Pin<&mut Self>,
1412        cx: &mut std::task::Context<'_>,
1413    ) -> std::task::Poll<Option<Self::Item>> {
1414        let this = &mut *self;
1415        if this.inner.check_shutdown(cx) {
1416            this.is_terminated = true;
1417            return std::task::Poll::Ready(None);
1418        }
1419        if this.is_terminated {
1420            panic!("polled ElementInfoProviderRequestStream after completion");
1421        }
1422        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
1423            |bytes, handles| {
1424                match this.inner.channel().read_etc(cx, bytes, handles) {
1425                    std::task::Poll::Ready(Ok(())) => {}
1426                    std::task::Poll::Pending => return std::task::Poll::Pending,
1427                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
1428                        this.is_terminated = true;
1429                        return std::task::Poll::Ready(None);
1430                    }
1431                    std::task::Poll::Ready(Err(e)) => {
1432                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
1433                            e.into(),
1434                        ))));
1435                    }
1436                }
1437
1438                // A message has been received from the channel
1439                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1440
1441                std::task::Poll::Ready(Some(match header.ordinal {
1442                0x298f63881fc9ed49 => {
1443                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1444                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fidl::encoding::DefaultFuchsiaResourceDialect);
1445                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
1446                    let control_handle = ElementInfoProviderControlHandle {
1447                        inner: this.inner.clone(),
1448                    };
1449                    Ok(ElementInfoProviderRequest::GetElementPowerLevelNames {
1450                        responder: ElementInfoProviderGetElementPowerLevelNamesResponder {
1451                            control_handle: std::mem::ManuallyDrop::new(control_handle),
1452                            tx_id: header.tx_id,
1453                        },
1454                    })
1455                }
1456                0x456f2b6c5bf0777c => {
1457                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1458                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fidl::encoding::DefaultFuchsiaResourceDialect);
1459                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
1460                    let control_handle = ElementInfoProviderControlHandle {
1461                        inner: this.inner.clone(),
1462                    };
1463                    Ok(ElementInfoProviderRequest::GetStatusEndpoints {
1464                        responder: ElementInfoProviderGetStatusEndpointsResponder {
1465                            control_handle: std::mem::ManuallyDrop::new(control_handle),
1466                            tx_id: header.tx_id,
1467                        },
1468                    })
1469                }
1470                _ if header.tx_id == 0 && header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
1471                    Ok(ElementInfoProviderRequest::_UnknownMethod {
1472                        ordinal: header.ordinal,
1473                        control_handle: ElementInfoProviderControlHandle { inner: this.inner.clone() },
1474                        method_type: fidl::MethodType::OneWay,
1475                    })
1476                }
1477                _ if header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
1478                    this.inner.send_framework_err(
1479                        fidl::encoding::FrameworkErr::UnknownMethod,
1480                        header.tx_id,
1481                        header.ordinal,
1482                        header.dynamic_flags(),
1483                        (bytes, handles),
1484                    )?;
1485                    Ok(ElementInfoProviderRequest::_UnknownMethod {
1486                        ordinal: header.ordinal,
1487                        control_handle: ElementInfoProviderControlHandle { inner: this.inner.clone() },
1488                        method_type: fidl::MethodType::TwoWay,
1489                    })
1490                }
1491                _ => Err(fidl::Error::UnknownOrdinal {
1492                    ordinal: header.ordinal,
1493                    protocol_name: <ElementInfoProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1494                }),
1495            }))
1496            },
1497        )
1498    }
1499}
1500
1501/// Provides an interface to retrieve information about PowerElements managed by a component.
1502#[derive(Debug)]
1503pub enum ElementInfoProviderRequest {
1504    /// Returns mappings of PowerLevels to plaintext names for each element managed
1505    /// by a component. Returns an error if no mappings can be returned.
1506    GetElementPowerLevelNames { responder: ElementInfoProviderGetElementPowerLevelNamesResponder },
1507    /// Returns available Status client endpoints and stable identifiers for each
1508    /// element managed by a component. Returns an error if no endpoints can be
1509    /// returned (i.e. no elements were able to implement the Status channel).
1510    GetStatusEndpoints { responder: ElementInfoProviderGetStatusEndpointsResponder },
1511    /// An interaction was received which does not match any known method.
1512    #[non_exhaustive]
1513    _UnknownMethod {
1514        /// Ordinal of the method that was called.
1515        ordinal: u64,
1516        control_handle: ElementInfoProviderControlHandle,
1517        method_type: fidl::MethodType,
1518    },
1519}
1520
1521impl ElementInfoProviderRequest {
1522    #[allow(irrefutable_let_patterns)]
1523    pub fn into_get_element_power_level_names(
1524        self,
1525    ) -> Option<(ElementInfoProviderGetElementPowerLevelNamesResponder)> {
1526        if let ElementInfoProviderRequest::GetElementPowerLevelNames { responder } = self {
1527            Some((responder))
1528        } else {
1529            None
1530        }
1531    }
1532
1533    #[allow(irrefutable_let_patterns)]
1534    pub fn into_get_status_endpoints(
1535        self,
1536    ) -> Option<(ElementInfoProviderGetStatusEndpointsResponder)> {
1537        if let ElementInfoProviderRequest::GetStatusEndpoints { responder } = self {
1538            Some((responder))
1539        } else {
1540            None
1541        }
1542    }
1543
1544    /// Name of the method defined in FIDL
1545    pub fn method_name(&self) -> &'static str {
1546        match *self {
1547            ElementInfoProviderRequest::GetElementPowerLevelNames { .. } => {
1548                "get_element_power_level_names"
1549            }
1550            ElementInfoProviderRequest::GetStatusEndpoints { .. } => "get_status_endpoints",
1551            ElementInfoProviderRequest::_UnknownMethod {
1552                method_type: fidl::MethodType::OneWay,
1553                ..
1554            } => "unknown one-way method",
1555            ElementInfoProviderRequest::_UnknownMethod {
1556                method_type: fidl::MethodType::TwoWay,
1557                ..
1558            } => "unknown two-way method",
1559        }
1560    }
1561}
1562
1563#[derive(Debug, Clone)]
1564pub struct ElementInfoProviderControlHandle {
1565    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1566}
1567
1568impl fidl::endpoints::ControlHandle for ElementInfoProviderControlHandle {
1569    fn shutdown(&self) {
1570        self.inner.shutdown()
1571    }
1572
1573    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
1574        self.inner.shutdown_with_epitaph(status)
1575    }
1576
1577    fn is_closed(&self) -> bool {
1578        self.inner.channel().is_closed()
1579    }
1580    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
1581        self.inner.channel().on_closed()
1582    }
1583
1584    #[cfg(target_os = "fuchsia")]
1585    fn signal_peer(
1586        &self,
1587        clear_mask: zx::Signals,
1588        set_mask: zx::Signals,
1589    ) -> Result<(), zx_status::Status> {
1590        use fidl::Peered;
1591        self.inner.channel().signal_peer(clear_mask, set_mask)
1592    }
1593}
1594
1595impl ElementInfoProviderControlHandle {}
1596
1597#[must_use = "FIDL methods require a response to be sent"]
1598#[derive(Debug)]
1599pub struct ElementInfoProviderGetElementPowerLevelNamesResponder {
1600    control_handle: std::mem::ManuallyDrop<ElementInfoProviderControlHandle>,
1601    tx_id: u32,
1602}
1603
1604/// Set the the channel to be shutdown (see [`ElementInfoProviderControlHandle::shutdown`])
1605/// if the responder is dropped without sending a response, so that the client
1606/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1607impl std::ops::Drop for ElementInfoProviderGetElementPowerLevelNamesResponder {
1608    fn drop(&mut self) {
1609        self.control_handle.shutdown();
1610        // Safety: drops once, never accessed again
1611        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1612    }
1613}
1614
1615impl fidl::endpoints::Responder for ElementInfoProviderGetElementPowerLevelNamesResponder {
1616    type ControlHandle = ElementInfoProviderControlHandle;
1617
1618    fn control_handle(&self) -> &ElementInfoProviderControlHandle {
1619        &self.control_handle
1620    }
1621
1622    fn drop_without_shutdown(mut self) {
1623        // Safety: drops once, never accessed again due to mem::forget
1624        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1625        // Prevent Drop from running (which would shut down the channel)
1626        std::mem::forget(self);
1627    }
1628}
1629
1630impl ElementInfoProviderGetElementPowerLevelNamesResponder {
1631    /// Sends a response to the FIDL transaction.
1632    ///
1633    /// Sets the channel to shutdown if an error occurs.
1634    pub fn send(
1635        self,
1636        mut result: Result<&[ElementPowerLevelNames], ElementInfoProviderError>,
1637    ) -> Result<(), fidl::Error> {
1638        let _result = self.send_raw(result);
1639        if _result.is_err() {
1640            self.control_handle.shutdown();
1641        }
1642        self.drop_without_shutdown();
1643        _result
1644    }
1645
1646    /// Similar to "send" but does not shutdown the channel if an error occurs.
1647    pub fn send_no_shutdown_on_err(
1648        self,
1649        mut result: Result<&[ElementPowerLevelNames], ElementInfoProviderError>,
1650    ) -> Result<(), fidl::Error> {
1651        let _result = self.send_raw(result);
1652        self.drop_without_shutdown();
1653        _result
1654    }
1655
1656    fn send_raw(
1657        &self,
1658        mut result: Result<&[ElementPowerLevelNames], ElementInfoProviderError>,
1659    ) -> Result<(), fidl::Error> {
1660        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
1661            ElementInfoProviderGetElementPowerLevelNamesResponse,
1662            ElementInfoProviderError,
1663        >>(
1664            fidl::encoding::FlexibleResult::new(result.map(|level_names| (level_names,))),
1665            self.tx_id,
1666            0x298f63881fc9ed49,
1667            fidl::encoding::DynamicFlags::FLEXIBLE,
1668        )
1669    }
1670}
1671
1672#[must_use = "FIDL methods require a response to be sent"]
1673#[derive(Debug)]
1674pub struct ElementInfoProviderGetStatusEndpointsResponder {
1675    control_handle: std::mem::ManuallyDrop<ElementInfoProviderControlHandle>,
1676    tx_id: u32,
1677}
1678
1679/// Set the the channel to be shutdown (see [`ElementInfoProviderControlHandle::shutdown`])
1680/// if the responder is dropped without sending a response, so that the client
1681/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1682impl std::ops::Drop for ElementInfoProviderGetStatusEndpointsResponder {
1683    fn drop(&mut self) {
1684        self.control_handle.shutdown();
1685        // Safety: drops once, never accessed again
1686        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1687    }
1688}
1689
1690impl fidl::endpoints::Responder for ElementInfoProviderGetStatusEndpointsResponder {
1691    type ControlHandle = ElementInfoProviderControlHandle;
1692
1693    fn control_handle(&self) -> &ElementInfoProviderControlHandle {
1694        &self.control_handle
1695    }
1696
1697    fn drop_without_shutdown(mut self) {
1698        // Safety: drops once, never accessed again due to mem::forget
1699        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1700        // Prevent Drop from running (which would shut down the channel)
1701        std::mem::forget(self);
1702    }
1703}
1704
1705impl ElementInfoProviderGetStatusEndpointsResponder {
1706    /// Sends a response to the FIDL transaction.
1707    ///
1708    /// Sets the channel to shutdown if an error occurs.
1709    pub fn send(
1710        self,
1711        mut result: Result<Vec<ElementStatusEndpoint>, ElementInfoProviderError>,
1712    ) -> Result<(), fidl::Error> {
1713        let _result = self.send_raw(result);
1714        if _result.is_err() {
1715            self.control_handle.shutdown();
1716        }
1717        self.drop_without_shutdown();
1718        _result
1719    }
1720
1721    /// Similar to "send" but does not shutdown the channel if an error occurs.
1722    pub fn send_no_shutdown_on_err(
1723        self,
1724        mut result: Result<Vec<ElementStatusEndpoint>, ElementInfoProviderError>,
1725    ) -> Result<(), fidl::Error> {
1726        let _result = self.send_raw(result);
1727        self.drop_without_shutdown();
1728        _result
1729    }
1730
1731    fn send_raw(
1732        &self,
1733        mut result: Result<Vec<ElementStatusEndpoint>, ElementInfoProviderError>,
1734    ) -> Result<(), fidl::Error> {
1735        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
1736            ElementInfoProviderGetStatusEndpointsResponse,
1737            ElementInfoProviderError,
1738        >>(
1739            fidl::encoding::FlexibleResult::new(
1740                result.as_mut().map_err(|e| *e).map(|endpoints| (endpoints.as_mut_slice(),)),
1741            ),
1742            self.tx_id,
1743            0x456f2b6c5bf0777c,
1744            fidl::encoding::DynamicFlags::FLEXIBLE,
1745        )
1746    }
1747}
1748
1749#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
1750pub struct ElementRunnerMarker;
1751
1752impl fidl::endpoints::ProtocolMarker for ElementRunnerMarker {
1753    type Proxy = ElementRunnerProxy;
1754    type RequestStream = ElementRunnerRequestStream;
1755    #[cfg(target_os = "fuchsia")]
1756    type SynchronousProxy = ElementRunnerSynchronousProxy;
1757
1758    const DEBUG_NAME: &'static str = "fuchsia.power.broker.ElementRunner";
1759}
1760impl fidl::endpoints::DiscoverableProtocolMarker for ElementRunnerMarker {}
1761
1762pub trait ElementRunnerProxyInterface: Send + Sync {
1763    type SetLevelResponseFut: std::future::Future<Output = Result<(), fidl::Error>> + Send;
1764    fn r#set_level(&self, level: u8) -> Self::SetLevelResponseFut;
1765}
1766#[derive(Debug)]
1767#[cfg(target_os = "fuchsia")]
1768pub struct ElementRunnerSynchronousProxy {
1769    client: fidl::client::sync::Client,
1770}
1771
1772#[cfg(target_os = "fuchsia")]
1773impl fidl::endpoints::SynchronousProxy for ElementRunnerSynchronousProxy {
1774    type Proxy = ElementRunnerProxy;
1775    type Protocol = ElementRunnerMarker;
1776
1777    fn from_channel(inner: fidl::Channel) -> Self {
1778        Self::new(inner)
1779    }
1780
1781    fn into_channel(self) -> fidl::Channel {
1782        self.client.into_channel()
1783    }
1784
1785    fn as_channel(&self) -> &fidl::Channel {
1786        self.client.as_channel()
1787    }
1788}
1789
1790#[cfg(target_os = "fuchsia")]
1791impl ElementRunnerSynchronousProxy {
1792    pub fn new(channel: fidl::Channel) -> Self {
1793        let protocol_name = <ElementRunnerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1794        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
1795    }
1796
1797    pub fn into_channel(self) -> fidl::Channel {
1798        self.client.into_channel()
1799    }
1800
1801    /// Waits until an event arrives and returns it. It is safe for other
1802    /// threads to make concurrent requests while waiting for an event.
1803    pub fn wait_for_event(
1804        &self,
1805        deadline: zx::MonotonicInstant,
1806    ) -> Result<ElementRunnerEvent, fidl::Error> {
1807        ElementRunnerEvent::decode(self.client.wait_for_event(deadline)?)
1808    }
1809
1810    /// Sets the level of the power element.
1811    ///
1812    /// The server blocks while making the level transition. It returns
1813    /// once the transition to the new required level is complete.
1814    /// If the element cannot transition to the new required level and
1815    /// it cannot retry, the channel will be closed.
1816    pub fn r#set_level(
1817        &self,
1818        mut level: u8,
1819        ___deadline: zx::MonotonicInstant,
1820    ) -> Result<(), fidl::Error> {
1821        let _response = self.client.send_query::<
1822            ElementRunnerSetLevelRequest,
1823            fidl::encoding::FlexibleType<fidl::encoding::EmptyStruct>,
1824        >(
1825            (level,),
1826            0x11a93092b228f0b,
1827            fidl::encoding::DynamicFlags::FLEXIBLE,
1828            ___deadline,
1829        )?
1830        .into_result::<ElementRunnerMarker>("set_level")?;
1831        Ok(_response)
1832    }
1833}
1834
1835#[cfg(target_os = "fuchsia")]
1836impl From<ElementRunnerSynchronousProxy> for zx::NullableHandle {
1837    fn from(value: ElementRunnerSynchronousProxy) -> Self {
1838        value.into_channel().into()
1839    }
1840}
1841
1842#[cfg(target_os = "fuchsia")]
1843impl From<fidl::Channel> for ElementRunnerSynchronousProxy {
1844    fn from(value: fidl::Channel) -> Self {
1845        Self::new(value)
1846    }
1847}
1848
1849#[cfg(target_os = "fuchsia")]
1850impl fidl::endpoints::FromClient for ElementRunnerSynchronousProxy {
1851    type Protocol = ElementRunnerMarker;
1852
1853    fn from_client(value: fidl::endpoints::ClientEnd<ElementRunnerMarker>) -> Self {
1854        Self::new(value.into_channel())
1855    }
1856}
1857
1858#[derive(Debug, Clone)]
1859pub struct ElementRunnerProxy {
1860    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
1861}
1862
1863impl fidl::endpoints::Proxy for ElementRunnerProxy {
1864    type Protocol = ElementRunnerMarker;
1865
1866    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
1867        Self::new(inner)
1868    }
1869
1870    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
1871        self.client.into_channel().map_err(|client| Self { client })
1872    }
1873
1874    fn as_channel(&self) -> &::fidl::AsyncChannel {
1875        self.client.as_channel()
1876    }
1877}
1878
1879impl ElementRunnerProxy {
1880    /// Create a new Proxy for fuchsia.power.broker/ElementRunner.
1881    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
1882        let protocol_name = <ElementRunnerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
1883        Self { client: fidl::client::Client::new(channel, protocol_name) }
1884    }
1885
1886    /// Get a Stream of events from the remote end of the protocol.
1887    ///
1888    /// # Panics
1889    ///
1890    /// Panics if the event stream was already taken.
1891    pub fn take_event_stream(&self) -> ElementRunnerEventStream {
1892        ElementRunnerEventStream { event_receiver: self.client.take_event_receiver() }
1893    }
1894
1895    /// Sets the level of the power element.
1896    ///
1897    /// The server blocks while making the level transition. It returns
1898    /// once the transition to the new required level is complete.
1899    /// If the element cannot transition to the new required level and
1900    /// it cannot retry, the channel will be closed.
1901    pub fn r#set_level(
1902        &self,
1903        mut level: u8,
1904    ) -> fidl::client::QueryResponseFut<(), fidl::encoding::DefaultFuchsiaResourceDialect> {
1905        ElementRunnerProxyInterface::r#set_level(self, level)
1906    }
1907}
1908
1909impl ElementRunnerProxyInterface for ElementRunnerProxy {
1910    type SetLevelResponseFut =
1911        fidl::client::QueryResponseFut<(), fidl::encoding::DefaultFuchsiaResourceDialect>;
1912    fn r#set_level(&self, mut level: u8) -> Self::SetLevelResponseFut {
1913        fn _decode(
1914            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1915        ) -> Result<(), fidl::Error> {
1916            let _response = fidl::client::decode_transaction_body::<
1917                fidl::encoding::FlexibleType<fidl::encoding::EmptyStruct>,
1918                fidl::encoding::DefaultFuchsiaResourceDialect,
1919                0x11a93092b228f0b,
1920            >(_buf?)?
1921            .into_result::<ElementRunnerMarker>("set_level")?;
1922            Ok(_response)
1923        }
1924        self.client.send_query_and_decode::<ElementRunnerSetLevelRequest, ()>(
1925            (level,),
1926            0x11a93092b228f0b,
1927            fidl::encoding::DynamicFlags::FLEXIBLE,
1928            _decode,
1929        )
1930    }
1931}
1932
1933pub struct ElementRunnerEventStream {
1934    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
1935}
1936
1937impl std::marker::Unpin for ElementRunnerEventStream {}
1938
1939impl futures::stream::FusedStream for ElementRunnerEventStream {
1940    fn is_terminated(&self) -> bool {
1941        self.event_receiver.is_terminated()
1942    }
1943}
1944
1945impl futures::Stream for ElementRunnerEventStream {
1946    type Item = Result<ElementRunnerEvent, fidl::Error>;
1947
1948    fn poll_next(
1949        mut self: std::pin::Pin<&mut Self>,
1950        cx: &mut std::task::Context<'_>,
1951    ) -> std::task::Poll<Option<Self::Item>> {
1952        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1953            &mut self.event_receiver,
1954            cx
1955        )?) {
1956            Some(buf) => std::task::Poll::Ready(Some(ElementRunnerEvent::decode(buf))),
1957            None => std::task::Poll::Ready(None),
1958        }
1959    }
1960}
1961
1962#[derive(Debug)]
1963pub enum ElementRunnerEvent {
1964    #[non_exhaustive]
1965    _UnknownEvent {
1966        /// Ordinal of the event that was sent.
1967        ordinal: u64,
1968    },
1969}
1970
1971impl ElementRunnerEvent {
1972    /// Decodes a message buffer as a [`ElementRunnerEvent`].
1973    fn decode(
1974        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1975    ) -> Result<ElementRunnerEvent, fidl::Error> {
1976        let (bytes, _handles) = buf.split_mut();
1977        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1978        debug_assert_eq!(tx_header.tx_id, 0);
1979        match tx_header.ordinal {
1980            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
1981                Ok(ElementRunnerEvent::_UnknownEvent { ordinal: tx_header.ordinal })
1982            }
1983            _ => Err(fidl::Error::UnknownOrdinal {
1984                ordinal: tx_header.ordinal,
1985                protocol_name: <ElementRunnerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1986            }),
1987        }
1988    }
1989}
1990
1991/// A Stream of incoming requests for fuchsia.power.broker/ElementRunner.
1992pub struct ElementRunnerRequestStream {
1993    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1994    is_terminated: bool,
1995}
1996
1997impl std::marker::Unpin for ElementRunnerRequestStream {}
1998
1999impl futures::stream::FusedStream for ElementRunnerRequestStream {
2000    fn is_terminated(&self) -> bool {
2001        self.is_terminated
2002    }
2003}
2004
2005impl fidl::endpoints::RequestStream for ElementRunnerRequestStream {
2006    type Protocol = ElementRunnerMarker;
2007    type ControlHandle = ElementRunnerControlHandle;
2008
2009    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
2010        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
2011    }
2012
2013    fn control_handle(&self) -> Self::ControlHandle {
2014        ElementRunnerControlHandle { inner: self.inner.clone() }
2015    }
2016
2017    fn into_inner(
2018        self,
2019    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
2020    {
2021        (self.inner, self.is_terminated)
2022    }
2023
2024    fn from_inner(
2025        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
2026        is_terminated: bool,
2027    ) -> Self {
2028        Self { inner, is_terminated }
2029    }
2030}
2031
2032impl futures::Stream for ElementRunnerRequestStream {
2033    type Item = Result<ElementRunnerRequest, fidl::Error>;
2034
2035    fn poll_next(
2036        mut self: std::pin::Pin<&mut Self>,
2037        cx: &mut std::task::Context<'_>,
2038    ) -> std::task::Poll<Option<Self::Item>> {
2039        let this = &mut *self;
2040        if this.inner.check_shutdown(cx) {
2041            this.is_terminated = true;
2042            return std::task::Poll::Ready(None);
2043        }
2044        if this.is_terminated {
2045            panic!("polled ElementRunnerRequestStream after completion");
2046        }
2047        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
2048            |bytes, handles| {
2049                match this.inner.channel().read_etc(cx, bytes, handles) {
2050                    std::task::Poll::Ready(Ok(())) => {}
2051                    std::task::Poll::Pending => return std::task::Poll::Pending,
2052                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
2053                        this.is_terminated = true;
2054                        return std::task::Poll::Ready(None);
2055                    }
2056                    std::task::Poll::Ready(Err(e)) => {
2057                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
2058                            e.into(),
2059                        ))));
2060                    }
2061                }
2062
2063                // A message has been received from the channel
2064                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
2065
2066                std::task::Poll::Ready(Some(match header.ordinal {
2067                    0x11a93092b228f0b => {
2068                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
2069                        let mut req = fidl::new_empty!(
2070                            ElementRunnerSetLevelRequest,
2071                            fidl::encoding::DefaultFuchsiaResourceDialect
2072                        );
2073                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ElementRunnerSetLevelRequest>(&header, _body_bytes, handles, &mut req)?;
2074                        let control_handle =
2075                            ElementRunnerControlHandle { inner: this.inner.clone() };
2076                        Ok(ElementRunnerRequest::SetLevel {
2077                            level: req.level,
2078
2079                            responder: ElementRunnerSetLevelResponder {
2080                                control_handle: std::mem::ManuallyDrop::new(control_handle),
2081                                tx_id: header.tx_id,
2082                            },
2083                        })
2084                    }
2085                    _ if header.tx_id == 0
2086                        && header
2087                            .dynamic_flags()
2088                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
2089                    {
2090                        Ok(ElementRunnerRequest::_UnknownMethod {
2091                            ordinal: header.ordinal,
2092                            control_handle: ElementRunnerControlHandle {
2093                                inner: this.inner.clone(),
2094                            },
2095                            method_type: fidl::MethodType::OneWay,
2096                        })
2097                    }
2098                    _ if header
2099                        .dynamic_flags()
2100                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
2101                    {
2102                        this.inner.send_framework_err(
2103                            fidl::encoding::FrameworkErr::UnknownMethod,
2104                            header.tx_id,
2105                            header.ordinal,
2106                            header.dynamic_flags(),
2107                            (bytes, handles),
2108                        )?;
2109                        Ok(ElementRunnerRequest::_UnknownMethod {
2110                            ordinal: header.ordinal,
2111                            control_handle: ElementRunnerControlHandle {
2112                                inner: this.inner.clone(),
2113                            },
2114                            method_type: fidl::MethodType::TwoWay,
2115                        })
2116                    }
2117                    _ => Err(fidl::Error::UnknownOrdinal {
2118                        ordinal: header.ordinal,
2119                        protocol_name:
2120                            <ElementRunnerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
2121                    }),
2122                }))
2123            },
2124        )
2125    }
2126}
2127
2128/// The runner or operator of an element.
2129/// This should be implemented by all element owners.
2130/// The client end is passed to Power Broker via ElementSchema.element_runner.
2131/// Power Broker calls SetLevel initially, and then whenever the required level
2132/// of the element changes.
2133#[derive(Debug)]
2134pub enum ElementRunnerRequest {
2135    /// Sets the level of the power element.
2136    ///
2137    /// The server blocks while making the level transition. It returns
2138    /// once the transition to the new required level is complete.
2139    /// If the element cannot transition to the new required level and
2140    /// it cannot retry, the channel will be closed.
2141    SetLevel { level: u8, responder: ElementRunnerSetLevelResponder },
2142    /// An interaction was received which does not match any known method.
2143    #[non_exhaustive]
2144    _UnknownMethod {
2145        /// Ordinal of the method that was called.
2146        ordinal: u64,
2147        control_handle: ElementRunnerControlHandle,
2148        method_type: fidl::MethodType,
2149    },
2150}
2151
2152impl ElementRunnerRequest {
2153    #[allow(irrefutable_let_patterns)]
2154    pub fn into_set_level(self) -> Option<(u8, ElementRunnerSetLevelResponder)> {
2155        if let ElementRunnerRequest::SetLevel { level, responder } = self {
2156            Some((level, responder))
2157        } else {
2158            None
2159        }
2160    }
2161
2162    /// Name of the method defined in FIDL
2163    pub fn method_name(&self) -> &'static str {
2164        match *self {
2165            ElementRunnerRequest::SetLevel { .. } => "set_level",
2166            ElementRunnerRequest::_UnknownMethod {
2167                method_type: fidl::MethodType::OneWay, ..
2168            } => "unknown one-way method",
2169            ElementRunnerRequest::_UnknownMethod {
2170                method_type: fidl::MethodType::TwoWay, ..
2171            } => "unknown two-way method",
2172        }
2173    }
2174}
2175
2176#[derive(Debug, Clone)]
2177pub struct ElementRunnerControlHandle {
2178    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
2179}
2180
2181impl fidl::endpoints::ControlHandle for ElementRunnerControlHandle {
2182    fn shutdown(&self) {
2183        self.inner.shutdown()
2184    }
2185
2186    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
2187        self.inner.shutdown_with_epitaph(status)
2188    }
2189
2190    fn is_closed(&self) -> bool {
2191        self.inner.channel().is_closed()
2192    }
2193    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
2194        self.inner.channel().on_closed()
2195    }
2196
2197    #[cfg(target_os = "fuchsia")]
2198    fn signal_peer(
2199        &self,
2200        clear_mask: zx::Signals,
2201        set_mask: zx::Signals,
2202    ) -> Result<(), zx_status::Status> {
2203        use fidl::Peered;
2204        self.inner.channel().signal_peer(clear_mask, set_mask)
2205    }
2206}
2207
2208impl ElementRunnerControlHandle {}
2209
2210#[must_use = "FIDL methods require a response to be sent"]
2211#[derive(Debug)]
2212pub struct ElementRunnerSetLevelResponder {
2213    control_handle: std::mem::ManuallyDrop<ElementRunnerControlHandle>,
2214    tx_id: u32,
2215}
2216
2217/// Set the the channel to be shutdown (see [`ElementRunnerControlHandle::shutdown`])
2218/// if the responder is dropped without sending a response, so that the client
2219/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
2220impl std::ops::Drop for ElementRunnerSetLevelResponder {
2221    fn drop(&mut self) {
2222        self.control_handle.shutdown();
2223        // Safety: drops once, never accessed again
2224        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2225    }
2226}
2227
2228impl fidl::endpoints::Responder for ElementRunnerSetLevelResponder {
2229    type ControlHandle = ElementRunnerControlHandle;
2230
2231    fn control_handle(&self) -> &ElementRunnerControlHandle {
2232        &self.control_handle
2233    }
2234
2235    fn drop_without_shutdown(mut self) {
2236        // Safety: drops once, never accessed again due to mem::forget
2237        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2238        // Prevent Drop from running (which would shut down the channel)
2239        std::mem::forget(self);
2240    }
2241}
2242
2243impl ElementRunnerSetLevelResponder {
2244    /// Sends a response to the FIDL transaction.
2245    ///
2246    /// Sets the channel to shutdown if an error occurs.
2247    pub fn send(self) -> Result<(), fidl::Error> {
2248        let _result = self.send_raw();
2249        if _result.is_err() {
2250            self.control_handle.shutdown();
2251        }
2252        self.drop_without_shutdown();
2253        _result
2254    }
2255
2256    /// Similar to "send" but does not shutdown the channel if an error occurs.
2257    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
2258        let _result = self.send_raw();
2259        self.drop_without_shutdown();
2260        _result
2261    }
2262
2263    fn send_raw(&self) -> Result<(), fidl::Error> {
2264        self.control_handle.inner.send::<fidl::encoding::FlexibleType<fidl::encoding::EmptyStruct>>(
2265            fidl::encoding::Flexible::new(()),
2266            self.tx_id,
2267            0x11a93092b228f0b,
2268            fidl::encoding::DynamicFlags::FLEXIBLE,
2269        )
2270    }
2271}
2272
2273#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
2274pub struct LeaseControlMarker;
2275
2276impl fidl::endpoints::ProtocolMarker for LeaseControlMarker {
2277    type Proxy = LeaseControlProxy;
2278    type RequestStream = LeaseControlRequestStream;
2279    #[cfg(target_os = "fuchsia")]
2280    type SynchronousProxy = LeaseControlSynchronousProxy;
2281
2282    const DEBUG_NAME: &'static str = "(anonymous) LeaseControl";
2283}
2284
2285pub trait LeaseControlProxyInterface: Send + Sync {
2286    type WatchStatusResponseFut: std::future::Future<Output = Result<LeaseStatus, fidl::Error>>
2287        + Send;
2288    fn r#watch_status(&self, last_status: LeaseStatus) -> Self::WatchStatusResponseFut;
2289}
2290#[derive(Debug)]
2291#[cfg(target_os = "fuchsia")]
2292pub struct LeaseControlSynchronousProxy {
2293    client: fidl::client::sync::Client,
2294}
2295
2296#[cfg(target_os = "fuchsia")]
2297impl fidl::endpoints::SynchronousProxy for LeaseControlSynchronousProxy {
2298    type Proxy = LeaseControlProxy;
2299    type Protocol = LeaseControlMarker;
2300
2301    fn from_channel(inner: fidl::Channel) -> Self {
2302        Self::new(inner)
2303    }
2304
2305    fn into_channel(self) -> fidl::Channel {
2306        self.client.into_channel()
2307    }
2308
2309    fn as_channel(&self) -> &fidl::Channel {
2310        self.client.as_channel()
2311    }
2312}
2313
2314#[cfg(target_os = "fuchsia")]
2315impl LeaseControlSynchronousProxy {
2316    pub fn new(channel: fidl::Channel) -> Self {
2317        let protocol_name = <LeaseControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
2318        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
2319    }
2320
2321    pub fn into_channel(self) -> fidl::Channel {
2322        self.client.into_channel()
2323    }
2324
2325    /// Waits until an event arrives and returns it. It is safe for other
2326    /// threads to make concurrent requests while waiting for an event.
2327    pub fn wait_for_event(
2328        &self,
2329        deadline: zx::MonotonicInstant,
2330    ) -> Result<LeaseControlEvent, fidl::Error> {
2331        LeaseControlEvent::decode(self.client.wait_for_event(deadline)?)
2332    }
2333
2334    /// Get the current status of the lease.
2335    /// If last_status is UNKNOWN, the call will return immediately
2336    /// with the current status. Otherwise, the call will block
2337    /// until the current status differs from last_status.
2338    pub fn r#watch_status(
2339        &self,
2340        mut last_status: LeaseStatus,
2341        ___deadline: zx::MonotonicInstant,
2342    ) -> Result<LeaseStatus, fidl::Error> {
2343        let _response = self.client.send_query::<
2344            LeaseControlWatchStatusRequest,
2345            fidl::encoding::FlexibleType<LeaseControlWatchStatusResponse>,
2346        >(
2347            (last_status,),
2348            0x293ab9b0301ca881,
2349            fidl::encoding::DynamicFlags::FLEXIBLE,
2350            ___deadline,
2351        )?
2352        .into_result::<LeaseControlMarker>("watch_status")?;
2353        Ok(_response.status)
2354    }
2355}
2356
2357#[cfg(target_os = "fuchsia")]
2358impl From<LeaseControlSynchronousProxy> for zx::NullableHandle {
2359    fn from(value: LeaseControlSynchronousProxy) -> Self {
2360        value.into_channel().into()
2361    }
2362}
2363
2364#[cfg(target_os = "fuchsia")]
2365impl From<fidl::Channel> for LeaseControlSynchronousProxy {
2366    fn from(value: fidl::Channel) -> Self {
2367        Self::new(value)
2368    }
2369}
2370
2371#[cfg(target_os = "fuchsia")]
2372impl fidl::endpoints::FromClient for LeaseControlSynchronousProxy {
2373    type Protocol = LeaseControlMarker;
2374
2375    fn from_client(value: fidl::endpoints::ClientEnd<LeaseControlMarker>) -> Self {
2376        Self::new(value.into_channel())
2377    }
2378}
2379
2380#[derive(Debug, Clone)]
2381pub struct LeaseControlProxy {
2382    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
2383}
2384
2385impl fidl::endpoints::Proxy for LeaseControlProxy {
2386    type Protocol = LeaseControlMarker;
2387
2388    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
2389        Self::new(inner)
2390    }
2391
2392    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
2393        self.client.into_channel().map_err(|client| Self { client })
2394    }
2395
2396    fn as_channel(&self) -> &::fidl::AsyncChannel {
2397        self.client.as_channel()
2398    }
2399}
2400
2401impl LeaseControlProxy {
2402    /// Create a new Proxy for fuchsia.power.broker/LeaseControl.
2403    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
2404        let protocol_name = <LeaseControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
2405        Self { client: fidl::client::Client::new(channel, protocol_name) }
2406    }
2407
2408    /// Get a Stream of events from the remote end of the protocol.
2409    ///
2410    /// # Panics
2411    ///
2412    /// Panics if the event stream was already taken.
2413    pub fn take_event_stream(&self) -> LeaseControlEventStream {
2414        LeaseControlEventStream { event_receiver: self.client.take_event_receiver() }
2415    }
2416
2417    /// Get the current status of the lease.
2418    /// If last_status is UNKNOWN, the call will return immediately
2419    /// with the current status. Otherwise, the call will block
2420    /// until the current status differs from last_status.
2421    pub fn r#watch_status(
2422        &self,
2423        mut last_status: LeaseStatus,
2424    ) -> fidl::client::QueryResponseFut<LeaseStatus, fidl::encoding::DefaultFuchsiaResourceDialect>
2425    {
2426        LeaseControlProxyInterface::r#watch_status(self, last_status)
2427    }
2428}
2429
2430impl LeaseControlProxyInterface for LeaseControlProxy {
2431    type WatchStatusResponseFut =
2432        fidl::client::QueryResponseFut<LeaseStatus, fidl::encoding::DefaultFuchsiaResourceDialect>;
2433    fn r#watch_status(&self, mut last_status: LeaseStatus) -> Self::WatchStatusResponseFut {
2434        fn _decode(
2435            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
2436        ) -> Result<LeaseStatus, fidl::Error> {
2437            let _response = fidl::client::decode_transaction_body::<
2438                fidl::encoding::FlexibleType<LeaseControlWatchStatusResponse>,
2439                fidl::encoding::DefaultFuchsiaResourceDialect,
2440                0x293ab9b0301ca881,
2441            >(_buf?)?
2442            .into_result::<LeaseControlMarker>("watch_status")?;
2443            Ok(_response.status)
2444        }
2445        self.client.send_query_and_decode::<LeaseControlWatchStatusRequest, LeaseStatus>(
2446            (last_status,),
2447            0x293ab9b0301ca881,
2448            fidl::encoding::DynamicFlags::FLEXIBLE,
2449            _decode,
2450        )
2451    }
2452}
2453
2454pub struct LeaseControlEventStream {
2455    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
2456}
2457
2458impl std::marker::Unpin for LeaseControlEventStream {}
2459
2460impl futures::stream::FusedStream for LeaseControlEventStream {
2461    fn is_terminated(&self) -> bool {
2462        self.event_receiver.is_terminated()
2463    }
2464}
2465
2466impl futures::Stream for LeaseControlEventStream {
2467    type Item = Result<LeaseControlEvent, fidl::Error>;
2468
2469    fn poll_next(
2470        mut self: std::pin::Pin<&mut Self>,
2471        cx: &mut std::task::Context<'_>,
2472    ) -> std::task::Poll<Option<Self::Item>> {
2473        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
2474            &mut self.event_receiver,
2475            cx
2476        )?) {
2477            Some(buf) => std::task::Poll::Ready(Some(LeaseControlEvent::decode(buf))),
2478            None => std::task::Poll::Ready(None),
2479        }
2480    }
2481}
2482
2483#[derive(Debug)]
2484pub enum LeaseControlEvent {
2485    #[non_exhaustive]
2486    _UnknownEvent {
2487        /// Ordinal of the event that was sent.
2488        ordinal: u64,
2489    },
2490}
2491
2492impl LeaseControlEvent {
2493    /// Decodes a message buffer as a [`LeaseControlEvent`].
2494    fn decode(
2495        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
2496    ) -> Result<LeaseControlEvent, fidl::Error> {
2497        let (bytes, _handles) = buf.split_mut();
2498        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
2499        debug_assert_eq!(tx_header.tx_id, 0);
2500        match tx_header.ordinal {
2501            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
2502                Ok(LeaseControlEvent::_UnknownEvent { ordinal: tx_header.ordinal })
2503            }
2504            _ => Err(fidl::Error::UnknownOrdinal {
2505                ordinal: tx_header.ordinal,
2506                protocol_name: <LeaseControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
2507            }),
2508        }
2509    }
2510}
2511
2512/// A Stream of incoming requests for fuchsia.power.broker/LeaseControl.
2513pub struct LeaseControlRequestStream {
2514    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
2515    is_terminated: bool,
2516}
2517
2518impl std::marker::Unpin for LeaseControlRequestStream {}
2519
2520impl futures::stream::FusedStream for LeaseControlRequestStream {
2521    fn is_terminated(&self) -> bool {
2522        self.is_terminated
2523    }
2524}
2525
2526impl fidl::endpoints::RequestStream for LeaseControlRequestStream {
2527    type Protocol = LeaseControlMarker;
2528    type ControlHandle = LeaseControlControlHandle;
2529
2530    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
2531        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
2532    }
2533
2534    fn control_handle(&self) -> Self::ControlHandle {
2535        LeaseControlControlHandle { inner: self.inner.clone() }
2536    }
2537
2538    fn into_inner(
2539        self,
2540    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
2541    {
2542        (self.inner, self.is_terminated)
2543    }
2544
2545    fn from_inner(
2546        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
2547        is_terminated: bool,
2548    ) -> Self {
2549        Self { inner, is_terminated }
2550    }
2551}
2552
2553impl futures::Stream for LeaseControlRequestStream {
2554    type Item = Result<LeaseControlRequest, fidl::Error>;
2555
2556    fn poll_next(
2557        mut self: std::pin::Pin<&mut Self>,
2558        cx: &mut std::task::Context<'_>,
2559    ) -> std::task::Poll<Option<Self::Item>> {
2560        let this = &mut *self;
2561        if this.inner.check_shutdown(cx) {
2562            this.is_terminated = true;
2563            return std::task::Poll::Ready(None);
2564        }
2565        if this.is_terminated {
2566            panic!("polled LeaseControlRequestStream after completion");
2567        }
2568        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
2569            |bytes, handles| {
2570                match this.inner.channel().read_etc(cx, bytes, handles) {
2571                    std::task::Poll::Ready(Ok(())) => {}
2572                    std::task::Poll::Pending => return std::task::Poll::Pending,
2573                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
2574                        this.is_terminated = true;
2575                        return std::task::Poll::Ready(None);
2576                    }
2577                    std::task::Poll::Ready(Err(e)) => {
2578                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
2579                            e.into(),
2580                        ))));
2581                    }
2582                }
2583
2584                // A message has been received from the channel
2585                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
2586
2587                std::task::Poll::Ready(Some(match header.ordinal {
2588                    0x293ab9b0301ca881 => {
2589                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
2590                        let mut req = fidl::new_empty!(
2591                            LeaseControlWatchStatusRequest,
2592                            fidl::encoding::DefaultFuchsiaResourceDialect
2593                        );
2594                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<LeaseControlWatchStatusRequest>(&header, _body_bytes, handles, &mut req)?;
2595                        let control_handle =
2596                            LeaseControlControlHandle { inner: this.inner.clone() };
2597                        Ok(LeaseControlRequest::WatchStatus {
2598                            last_status: req.last_status,
2599
2600                            responder: LeaseControlWatchStatusResponder {
2601                                control_handle: std::mem::ManuallyDrop::new(control_handle),
2602                                tx_id: header.tx_id,
2603                            },
2604                        })
2605                    }
2606                    _ if header.tx_id == 0
2607                        && header
2608                            .dynamic_flags()
2609                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
2610                    {
2611                        Ok(LeaseControlRequest::_UnknownMethod {
2612                            ordinal: header.ordinal,
2613                            control_handle: LeaseControlControlHandle { inner: this.inner.clone() },
2614                            method_type: fidl::MethodType::OneWay,
2615                        })
2616                    }
2617                    _ if header
2618                        .dynamic_flags()
2619                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
2620                    {
2621                        this.inner.send_framework_err(
2622                            fidl::encoding::FrameworkErr::UnknownMethod,
2623                            header.tx_id,
2624                            header.ordinal,
2625                            header.dynamic_flags(),
2626                            (bytes, handles),
2627                        )?;
2628                        Ok(LeaseControlRequest::_UnknownMethod {
2629                            ordinal: header.ordinal,
2630                            control_handle: LeaseControlControlHandle { inner: this.inner.clone() },
2631                            method_type: fidl::MethodType::TwoWay,
2632                        })
2633                    }
2634                    _ => Err(fidl::Error::UnknownOrdinal {
2635                        ordinal: header.ordinal,
2636                        protocol_name:
2637                            <LeaseControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
2638                    }),
2639                }))
2640            },
2641        )
2642    }
2643}
2644
2645/// Provides lease-scoped access to actions that can be taken on a lease
2646/// previously acquired via Lessor.Lease. Closing this control channel drops
2647/// the lease.
2648/// TODO(https://fxbug.dev/339474151): Switch from a protocol to an eventpair.
2649#[derive(Debug)]
2650pub enum LeaseControlRequest {
2651    /// Get the current status of the lease.
2652    /// If last_status is UNKNOWN, the call will return immediately
2653    /// with the current status. Otherwise, the call will block
2654    /// until the current status differs from last_status.
2655    WatchStatus { last_status: LeaseStatus, responder: LeaseControlWatchStatusResponder },
2656    /// An interaction was received which does not match any known method.
2657    #[non_exhaustive]
2658    _UnknownMethod {
2659        /// Ordinal of the method that was called.
2660        ordinal: u64,
2661        control_handle: LeaseControlControlHandle,
2662        method_type: fidl::MethodType,
2663    },
2664}
2665
2666impl LeaseControlRequest {
2667    #[allow(irrefutable_let_patterns)]
2668    pub fn into_watch_status(self) -> Option<(LeaseStatus, LeaseControlWatchStatusResponder)> {
2669        if let LeaseControlRequest::WatchStatus { last_status, responder } = self {
2670            Some((last_status, responder))
2671        } else {
2672            None
2673        }
2674    }
2675
2676    /// Name of the method defined in FIDL
2677    pub fn method_name(&self) -> &'static str {
2678        match *self {
2679            LeaseControlRequest::WatchStatus { .. } => "watch_status",
2680            LeaseControlRequest::_UnknownMethod {
2681                method_type: fidl::MethodType::OneWay, ..
2682            } => "unknown one-way method",
2683            LeaseControlRequest::_UnknownMethod {
2684                method_type: fidl::MethodType::TwoWay, ..
2685            } => "unknown two-way method",
2686        }
2687    }
2688}
2689
2690#[derive(Debug, Clone)]
2691pub struct LeaseControlControlHandle {
2692    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
2693}
2694
2695impl fidl::endpoints::ControlHandle for LeaseControlControlHandle {
2696    fn shutdown(&self) {
2697        self.inner.shutdown()
2698    }
2699
2700    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
2701        self.inner.shutdown_with_epitaph(status)
2702    }
2703
2704    fn is_closed(&self) -> bool {
2705        self.inner.channel().is_closed()
2706    }
2707    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
2708        self.inner.channel().on_closed()
2709    }
2710
2711    #[cfg(target_os = "fuchsia")]
2712    fn signal_peer(
2713        &self,
2714        clear_mask: zx::Signals,
2715        set_mask: zx::Signals,
2716    ) -> Result<(), zx_status::Status> {
2717        use fidl::Peered;
2718        self.inner.channel().signal_peer(clear_mask, set_mask)
2719    }
2720}
2721
2722impl LeaseControlControlHandle {}
2723
2724#[must_use = "FIDL methods require a response to be sent"]
2725#[derive(Debug)]
2726pub struct LeaseControlWatchStatusResponder {
2727    control_handle: std::mem::ManuallyDrop<LeaseControlControlHandle>,
2728    tx_id: u32,
2729}
2730
2731/// Set the the channel to be shutdown (see [`LeaseControlControlHandle::shutdown`])
2732/// if the responder is dropped without sending a response, so that the client
2733/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
2734impl std::ops::Drop for LeaseControlWatchStatusResponder {
2735    fn drop(&mut self) {
2736        self.control_handle.shutdown();
2737        // Safety: drops once, never accessed again
2738        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2739    }
2740}
2741
2742impl fidl::endpoints::Responder for LeaseControlWatchStatusResponder {
2743    type ControlHandle = LeaseControlControlHandle;
2744
2745    fn control_handle(&self) -> &LeaseControlControlHandle {
2746        &self.control_handle
2747    }
2748
2749    fn drop_without_shutdown(mut self) {
2750        // Safety: drops once, never accessed again due to mem::forget
2751        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2752        // Prevent Drop from running (which would shut down the channel)
2753        std::mem::forget(self);
2754    }
2755}
2756
2757impl LeaseControlWatchStatusResponder {
2758    /// Sends a response to the FIDL transaction.
2759    ///
2760    /// Sets the channel to shutdown if an error occurs.
2761    pub fn send(self, mut status: LeaseStatus) -> Result<(), fidl::Error> {
2762        let _result = self.send_raw(status);
2763        if _result.is_err() {
2764            self.control_handle.shutdown();
2765        }
2766        self.drop_without_shutdown();
2767        _result
2768    }
2769
2770    /// Similar to "send" but does not shutdown the channel if an error occurs.
2771    pub fn send_no_shutdown_on_err(self, mut status: LeaseStatus) -> Result<(), fidl::Error> {
2772        let _result = self.send_raw(status);
2773        self.drop_without_shutdown();
2774        _result
2775    }
2776
2777    fn send_raw(&self, mut status: LeaseStatus) -> Result<(), fidl::Error> {
2778        self.control_handle
2779            .inner
2780            .send::<fidl::encoding::FlexibleType<LeaseControlWatchStatusResponse>>(
2781                fidl::encoding::Flexible::new((status,)),
2782                self.tx_id,
2783                0x293ab9b0301ca881,
2784                fidl::encoding::DynamicFlags::FLEXIBLE,
2785            )
2786    }
2787}
2788
2789#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
2790pub struct LessorMarker;
2791
2792impl fidl::endpoints::ProtocolMarker for LessorMarker {
2793    type Proxy = LessorProxy;
2794    type RequestStream = LessorRequestStream;
2795    #[cfg(target_os = "fuchsia")]
2796    type SynchronousProxy = LessorSynchronousProxy;
2797
2798    const DEBUG_NAME: &'static str = "(anonymous) Lessor";
2799}
2800pub type LessorLeaseResult = Result<fidl::endpoints::ClientEnd<LeaseControlMarker>, LeaseError>;
2801
2802pub trait LessorProxyInterface: Send + Sync {
2803    type LeaseResponseFut: std::future::Future<Output = Result<LessorLeaseResult, fidl::Error>>
2804        + Send;
2805    fn r#lease(&self, level: u8) -> Self::LeaseResponseFut;
2806}
2807#[derive(Debug)]
2808#[cfg(target_os = "fuchsia")]
2809pub struct LessorSynchronousProxy {
2810    client: fidl::client::sync::Client,
2811}
2812
2813#[cfg(target_os = "fuchsia")]
2814impl fidl::endpoints::SynchronousProxy for LessorSynchronousProxy {
2815    type Proxy = LessorProxy;
2816    type Protocol = LessorMarker;
2817
2818    fn from_channel(inner: fidl::Channel) -> Self {
2819        Self::new(inner)
2820    }
2821
2822    fn into_channel(self) -> fidl::Channel {
2823        self.client.into_channel()
2824    }
2825
2826    fn as_channel(&self) -> &fidl::Channel {
2827        self.client.as_channel()
2828    }
2829}
2830
2831#[cfg(target_os = "fuchsia")]
2832impl LessorSynchronousProxy {
2833    pub fn new(channel: fidl::Channel) -> Self {
2834        let protocol_name = <LessorMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
2835        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
2836    }
2837
2838    pub fn into_channel(self) -> fidl::Channel {
2839        self.client.into_channel()
2840    }
2841
2842    /// Waits until an event arrives and returns it. It is safe for other
2843    /// threads to make concurrent requests while waiting for an event.
2844    pub fn wait_for_event(
2845        &self,
2846        deadline: zx::MonotonicInstant,
2847    ) -> Result<LessorEvent, fidl::Error> {
2848        LessorEvent::decode(self.client.wait_for_event(deadline)?)
2849    }
2850
2851    /// Request made to indicate the client wants the element raised to the given
2852    /// level. When the call returns, this **does** **not** mean the
2853    /// corresponding element is at the requested level, only that the requested
2854    /// level is valid and request is being worked on.
2855    ///
2856    /// Fulfilling the request will raise the level of all the level's direct
2857    /// and transitive power dependencies to their required levels. When
2858    /// `LeaseControl.WatchStatus` reports `LeaseStatus::SATISFIED` this means
2859    /// given element is at the level specified by the lease.
2860    ///
2861    /// Requesting an invalid level returns `LeaseError::INVALID_LEVEL`.
2862    pub fn r#lease(
2863        &self,
2864        mut level: u8,
2865        ___deadline: zx::MonotonicInstant,
2866    ) -> Result<LessorLeaseResult, fidl::Error> {
2867        let _response = self.client.send_query::<
2868            LessorLeaseRequest,
2869            fidl::encoding::FlexibleResultType<LessorLeaseResponse, LeaseError>,
2870        >(
2871            (level,),
2872            0x38999f84b2f1f9ad,
2873            fidl::encoding::DynamicFlags::FLEXIBLE,
2874            ___deadline,
2875        )?
2876        .into_result::<LessorMarker>("lease")?;
2877        Ok(_response.map(|x| x.lease_control))
2878    }
2879}
2880
2881#[cfg(target_os = "fuchsia")]
2882impl From<LessorSynchronousProxy> for zx::NullableHandle {
2883    fn from(value: LessorSynchronousProxy) -> Self {
2884        value.into_channel().into()
2885    }
2886}
2887
2888#[cfg(target_os = "fuchsia")]
2889impl From<fidl::Channel> for LessorSynchronousProxy {
2890    fn from(value: fidl::Channel) -> Self {
2891        Self::new(value)
2892    }
2893}
2894
2895#[cfg(target_os = "fuchsia")]
2896impl fidl::endpoints::FromClient for LessorSynchronousProxy {
2897    type Protocol = LessorMarker;
2898
2899    fn from_client(value: fidl::endpoints::ClientEnd<LessorMarker>) -> Self {
2900        Self::new(value.into_channel())
2901    }
2902}
2903
2904#[derive(Debug, Clone)]
2905pub struct LessorProxy {
2906    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
2907}
2908
2909impl fidl::endpoints::Proxy for LessorProxy {
2910    type Protocol = LessorMarker;
2911
2912    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
2913        Self::new(inner)
2914    }
2915
2916    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
2917        self.client.into_channel().map_err(|client| Self { client })
2918    }
2919
2920    fn as_channel(&self) -> &::fidl::AsyncChannel {
2921        self.client.as_channel()
2922    }
2923}
2924
2925impl LessorProxy {
2926    /// Create a new Proxy for fuchsia.power.broker/Lessor.
2927    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
2928        let protocol_name = <LessorMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
2929        Self { client: fidl::client::Client::new(channel, protocol_name) }
2930    }
2931
2932    /// Get a Stream of events from the remote end of the protocol.
2933    ///
2934    /// # Panics
2935    ///
2936    /// Panics if the event stream was already taken.
2937    pub fn take_event_stream(&self) -> LessorEventStream {
2938        LessorEventStream { event_receiver: self.client.take_event_receiver() }
2939    }
2940
2941    /// Request made to indicate the client wants the element raised to the given
2942    /// level. When the call returns, this **does** **not** mean the
2943    /// corresponding element is at the requested level, only that the requested
2944    /// level is valid and request is being worked on.
2945    ///
2946    /// Fulfilling the request will raise the level of all the level's direct
2947    /// and transitive power dependencies to their required levels. When
2948    /// `LeaseControl.WatchStatus` reports `LeaseStatus::SATISFIED` this means
2949    /// given element is at the level specified by the lease.
2950    ///
2951    /// Requesting an invalid level returns `LeaseError::INVALID_LEVEL`.
2952    pub fn r#lease(
2953        &self,
2954        mut level: u8,
2955    ) -> fidl::client::QueryResponseFut<
2956        LessorLeaseResult,
2957        fidl::encoding::DefaultFuchsiaResourceDialect,
2958    > {
2959        LessorProxyInterface::r#lease(self, level)
2960    }
2961}
2962
2963impl LessorProxyInterface for LessorProxy {
2964    type LeaseResponseFut = fidl::client::QueryResponseFut<
2965        LessorLeaseResult,
2966        fidl::encoding::DefaultFuchsiaResourceDialect,
2967    >;
2968    fn r#lease(&self, mut level: u8) -> Self::LeaseResponseFut {
2969        fn _decode(
2970            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
2971        ) -> Result<LessorLeaseResult, fidl::Error> {
2972            let _response = fidl::client::decode_transaction_body::<
2973                fidl::encoding::FlexibleResultType<LessorLeaseResponse, LeaseError>,
2974                fidl::encoding::DefaultFuchsiaResourceDialect,
2975                0x38999f84b2f1f9ad,
2976            >(_buf?)?
2977            .into_result::<LessorMarker>("lease")?;
2978            Ok(_response.map(|x| x.lease_control))
2979        }
2980        self.client.send_query_and_decode::<LessorLeaseRequest, LessorLeaseResult>(
2981            (level,),
2982            0x38999f84b2f1f9ad,
2983            fidl::encoding::DynamicFlags::FLEXIBLE,
2984            _decode,
2985        )
2986    }
2987}
2988
2989pub struct LessorEventStream {
2990    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
2991}
2992
2993impl std::marker::Unpin for LessorEventStream {}
2994
2995impl futures::stream::FusedStream for LessorEventStream {
2996    fn is_terminated(&self) -> bool {
2997        self.event_receiver.is_terminated()
2998    }
2999}
3000
3001impl futures::Stream for LessorEventStream {
3002    type Item = Result<LessorEvent, fidl::Error>;
3003
3004    fn poll_next(
3005        mut self: std::pin::Pin<&mut Self>,
3006        cx: &mut std::task::Context<'_>,
3007    ) -> std::task::Poll<Option<Self::Item>> {
3008        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
3009            &mut self.event_receiver,
3010            cx
3011        )?) {
3012            Some(buf) => std::task::Poll::Ready(Some(LessorEvent::decode(buf))),
3013            None => std::task::Poll::Ready(None),
3014        }
3015    }
3016}
3017
3018#[derive(Debug)]
3019pub enum LessorEvent {
3020    #[non_exhaustive]
3021    _UnknownEvent {
3022        /// Ordinal of the event that was sent.
3023        ordinal: u64,
3024    },
3025}
3026
3027impl LessorEvent {
3028    /// Decodes a message buffer as a [`LessorEvent`].
3029    fn decode(
3030        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
3031    ) -> Result<LessorEvent, fidl::Error> {
3032        let (bytes, _handles) = buf.split_mut();
3033        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
3034        debug_assert_eq!(tx_header.tx_id, 0);
3035        match tx_header.ordinal {
3036            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
3037                Ok(LessorEvent::_UnknownEvent { ordinal: tx_header.ordinal })
3038            }
3039            _ => Err(fidl::Error::UnknownOrdinal {
3040                ordinal: tx_header.ordinal,
3041                protocol_name: <LessorMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
3042            }),
3043        }
3044    }
3045}
3046
3047/// A Stream of incoming requests for fuchsia.power.broker/Lessor.
3048pub struct LessorRequestStream {
3049    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
3050    is_terminated: bool,
3051}
3052
3053impl std::marker::Unpin for LessorRequestStream {}
3054
3055impl futures::stream::FusedStream for LessorRequestStream {
3056    fn is_terminated(&self) -> bool {
3057        self.is_terminated
3058    }
3059}
3060
3061impl fidl::endpoints::RequestStream for LessorRequestStream {
3062    type Protocol = LessorMarker;
3063    type ControlHandle = LessorControlHandle;
3064
3065    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
3066        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
3067    }
3068
3069    fn control_handle(&self) -> Self::ControlHandle {
3070        LessorControlHandle { inner: self.inner.clone() }
3071    }
3072
3073    fn into_inner(
3074        self,
3075    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
3076    {
3077        (self.inner, self.is_terminated)
3078    }
3079
3080    fn from_inner(
3081        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
3082        is_terminated: bool,
3083    ) -> Self {
3084        Self { inner, is_terminated }
3085    }
3086}
3087
3088impl futures::Stream for LessorRequestStream {
3089    type Item = Result<LessorRequest, fidl::Error>;
3090
3091    fn poll_next(
3092        mut self: std::pin::Pin<&mut Self>,
3093        cx: &mut std::task::Context<'_>,
3094    ) -> std::task::Poll<Option<Self::Item>> {
3095        let this = &mut *self;
3096        if this.inner.check_shutdown(cx) {
3097            this.is_terminated = true;
3098            return std::task::Poll::Ready(None);
3099        }
3100        if this.is_terminated {
3101            panic!("polled LessorRequestStream after completion");
3102        }
3103        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
3104            |bytes, handles| {
3105                match this.inner.channel().read_etc(cx, bytes, handles) {
3106                    std::task::Poll::Ready(Ok(())) => {}
3107                    std::task::Poll::Pending => return std::task::Poll::Pending,
3108                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
3109                        this.is_terminated = true;
3110                        return std::task::Poll::Ready(None);
3111                    }
3112                    std::task::Poll::Ready(Err(e)) => {
3113                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
3114                            e.into(),
3115                        ))));
3116                    }
3117                }
3118
3119                // A message has been received from the channel
3120                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
3121
3122                std::task::Poll::Ready(Some(match header.ordinal {
3123                    0x38999f84b2f1f9ad => {
3124                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
3125                        let mut req = fidl::new_empty!(
3126                            LessorLeaseRequest,
3127                            fidl::encoding::DefaultFuchsiaResourceDialect
3128                        );
3129                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<LessorLeaseRequest>(&header, _body_bytes, handles, &mut req)?;
3130                        let control_handle = LessorControlHandle { inner: this.inner.clone() };
3131                        Ok(LessorRequest::Lease {
3132                            level: req.level,
3133
3134                            responder: LessorLeaseResponder {
3135                                control_handle: std::mem::ManuallyDrop::new(control_handle),
3136                                tx_id: header.tx_id,
3137                            },
3138                        })
3139                    }
3140                    _ if header.tx_id == 0
3141                        && header
3142                            .dynamic_flags()
3143                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
3144                    {
3145                        Ok(LessorRequest::_UnknownMethod {
3146                            ordinal: header.ordinal,
3147                            control_handle: LessorControlHandle { inner: this.inner.clone() },
3148                            method_type: fidl::MethodType::OneWay,
3149                        })
3150                    }
3151                    _ if header
3152                        .dynamic_flags()
3153                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
3154                    {
3155                        this.inner.send_framework_err(
3156                            fidl::encoding::FrameworkErr::UnknownMethod,
3157                            header.tx_id,
3158                            header.ordinal,
3159                            header.dynamic_flags(),
3160                            (bytes, handles),
3161                        )?;
3162                        Ok(LessorRequest::_UnknownMethod {
3163                            ordinal: header.ordinal,
3164                            control_handle: LessorControlHandle { inner: this.inner.clone() },
3165                            method_type: fidl::MethodType::TwoWay,
3166                        })
3167                    }
3168                    _ => Err(fidl::Error::UnknownOrdinal {
3169                        ordinal: header.ordinal,
3170                        protocol_name:
3171                            <LessorMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
3172                    }),
3173                }))
3174            },
3175        )
3176    }
3177}
3178
3179/// Provides element-scoped access to request leases to raise the levels of an
3180/// element previously added via Topology.AddElement.
3181#[derive(Debug)]
3182pub enum LessorRequest {
3183    /// Request made to indicate the client wants the element raised to the given
3184    /// level. When the call returns, this **does** **not** mean the
3185    /// corresponding element is at the requested level, only that the requested
3186    /// level is valid and request is being worked on.
3187    ///
3188    /// Fulfilling the request will raise the level of all the level's direct
3189    /// and transitive power dependencies to their required levels. When
3190    /// `LeaseControl.WatchStatus` reports `LeaseStatus::SATISFIED` this means
3191    /// given element is at the level specified by the lease.
3192    ///
3193    /// Requesting an invalid level returns `LeaseError::INVALID_LEVEL`.
3194    Lease { level: u8, responder: LessorLeaseResponder },
3195    /// An interaction was received which does not match any known method.
3196    #[non_exhaustive]
3197    _UnknownMethod {
3198        /// Ordinal of the method that was called.
3199        ordinal: u64,
3200        control_handle: LessorControlHandle,
3201        method_type: fidl::MethodType,
3202    },
3203}
3204
3205impl LessorRequest {
3206    #[allow(irrefutable_let_patterns)]
3207    pub fn into_lease(self) -> Option<(u8, LessorLeaseResponder)> {
3208        if let LessorRequest::Lease { level, responder } = self {
3209            Some((level, responder))
3210        } else {
3211            None
3212        }
3213    }
3214
3215    /// Name of the method defined in FIDL
3216    pub fn method_name(&self) -> &'static str {
3217        match *self {
3218            LessorRequest::Lease { .. } => "lease",
3219            LessorRequest::_UnknownMethod { method_type: fidl::MethodType::OneWay, .. } => {
3220                "unknown one-way method"
3221            }
3222            LessorRequest::_UnknownMethod { method_type: fidl::MethodType::TwoWay, .. } => {
3223                "unknown two-way method"
3224            }
3225        }
3226    }
3227}
3228
3229#[derive(Debug, Clone)]
3230pub struct LessorControlHandle {
3231    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
3232}
3233
3234impl fidl::endpoints::ControlHandle for LessorControlHandle {
3235    fn shutdown(&self) {
3236        self.inner.shutdown()
3237    }
3238
3239    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
3240        self.inner.shutdown_with_epitaph(status)
3241    }
3242
3243    fn is_closed(&self) -> bool {
3244        self.inner.channel().is_closed()
3245    }
3246    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
3247        self.inner.channel().on_closed()
3248    }
3249
3250    #[cfg(target_os = "fuchsia")]
3251    fn signal_peer(
3252        &self,
3253        clear_mask: zx::Signals,
3254        set_mask: zx::Signals,
3255    ) -> Result<(), zx_status::Status> {
3256        use fidl::Peered;
3257        self.inner.channel().signal_peer(clear_mask, set_mask)
3258    }
3259}
3260
3261impl LessorControlHandle {}
3262
3263#[must_use = "FIDL methods require a response to be sent"]
3264#[derive(Debug)]
3265pub struct LessorLeaseResponder {
3266    control_handle: std::mem::ManuallyDrop<LessorControlHandle>,
3267    tx_id: u32,
3268}
3269
3270/// Set the the channel to be shutdown (see [`LessorControlHandle::shutdown`])
3271/// if the responder is dropped without sending a response, so that the client
3272/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
3273impl std::ops::Drop for LessorLeaseResponder {
3274    fn drop(&mut self) {
3275        self.control_handle.shutdown();
3276        // Safety: drops once, never accessed again
3277        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3278    }
3279}
3280
3281impl fidl::endpoints::Responder for LessorLeaseResponder {
3282    type ControlHandle = LessorControlHandle;
3283
3284    fn control_handle(&self) -> &LessorControlHandle {
3285        &self.control_handle
3286    }
3287
3288    fn drop_without_shutdown(mut self) {
3289        // Safety: drops once, never accessed again due to mem::forget
3290        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3291        // Prevent Drop from running (which would shut down the channel)
3292        std::mem::forget(self);
3293    }
3294}
3295
3296impl LessorLeaseResponder {
3297    /// Sends a response to the FIDL transaction.
3298    ///
3299    /// Sets the channel to shutdown if an error occurs.
3300    pub fn send(
3301        self,
3302        mut result: Result<fidl::endpoints::ClientEnd<LeaseControlMarker>, LeaseError>,
3303    ) -> Result<(), fidl::Error> {
3304        let _result = self.send_raw(result);
3305        if _result.is_err() {
3306            self.control_handle.shutdown();
3307        }
3308        self.drop_without_shutdown();
3309        _result
3310    }
3311
3312    /// Similar to "send" but does not shutdown the channel if an error occurs.
3313    pub fn send_no_shutdown_on_err(
3314        self,
3315        mut result: Result<fidl::endpoints::ClientEnd<LeaseControlMarker>, LeaseError>,
3316    ) -> Result<(), fidl::Error> {
3317        let _result = self.send_raw(result);
3318        self.drop_without_shutdown();
3319        _result
3320    }
3321
3322    fn send_raw(
3323        &self,
3324        mut result: Result<fidl::endpoints::ClientEnd<LeaseControlMarker>, LeaseError>,
3325    ) -> Result<(), fidl::Error> {
3326        self.control_handle
3327            .inner
3328            .send::<fidl::encoding::FlexibleResultType<LessorLeaseResponse, LeaseError>>(
3329                fidl::encoding::FlexibleResult::new(result.map(|lease_control| (lease_control,))),
3330                self.tx_id,
3331                0x38999f84b2f1f9ad,
3332                fidl::encoding::DynamicFlags::FLEXIBLE,
3333            )
3334    }
3335}
3336
3337#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
3338pub struct StatusMarker;
3339
3340impl fidl::endpoints::ProtocolMarker for StatusMarker {
3341    type Proxy = StatusProxy;
3342    type RequestStream = StatusRequestStream;
3343    #[cfg(target_os = "fuchsia")]
3344    type SynchronousProxy = StatusSynchronousProxy;
3345
3346    const DEBUG_NAME: &'static str = "(anonymous) Status";
3347}
3348pub type StatusWatchPowerLevelResult = Result<u8, StatusError>;
3349
3350pub trait StatusProxyInterface: Send + Sync {
3351    type WatchPowerLevelResponseFut: std::future::Future<Output = Result<StatusWatchPowerLevelResult, fidl::Error>>
3352        + Send;
3353    fn r#watch_power_level(&self) -> Self::WatchPowerLevelResponseFut;
3354}
3355#[derive(Debug)]
3356#[cfg(target_os = "fuchsia")]
3357pub struct StatusSynchronousProxy {
3358    client: fidl::client::sync::Client,
3359}
3360
3361#[cfg(target_os = "fuchsia")]
3362impl fidl::endpoints::SynchronousProxy for StatusSynchronousProxy {
3363    type Proxy = StatusProxy;
3364    type Protocol = StatusMarker;
3365
3366    fn from_channel(inner: fidl::Channel) -> Self {
3367        Self::new(inner)
3368    }
3369
3370    fn into_channel(self) -> fidl::Channel {
3371        self.client.into_channel()
3372    }
3373
3374    fn as_channel(&self) -> &fidl::Channel {
3375        self.client.as_channel()
3376    }
3377}
3378
3379#[cfg(target_os = "fuchsia")]
3380impl StatusSynchronousProxy {
3381    pub fn new(channel: fidl::Channel) -> Self {
3382        let protocol_name = <StatusMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
3383        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
3384    }
3385
3386    pub fn into_channel(self) -> fidl::Channel {
3387        self.client.into_channel()
3388    }
3389
3390    /// Waits until an event arrives and returns it. It is safe for other
3391    /// threads to make concurrent requests while waiting for an event.
3392    pub fn wait_for_event(
3393        &self,
3394        deadline: zx::MonotonicInstant,
3395    ) -> Result<StatusEvent, fidl::Error> {
3396        StatusEvent::decode(self.client.wait_for_event(deadline)?)
3397    }
3398
3399    /// Returns the current power level for this element. The first call on
3400    /// this channel will return immediately. Subsequent calls will block until
3401    /// the current power level has changed.
3402    pub fn r#watch_power_level(
3403        &self,
3404        ___deadline: zx::MonotonicInstant,
3405    ) -> Result<StatusWatchPowerLevelResult, fidl::Error> {
3406        let _response = self.client.send_query::<
3407            fidl::encoding::EmptyPayload,
3408            fidl::encoding::FlexibleResultType<StatusWatchPowerLevelResponse, StatusError>,
3409        >(
3410            (),
3411            0x2f11ba8df9b5614e,
3412            fidl::encoding::DynamicFlags::FLEXIBLE,
3413            ___deadline,
3414        )?
3415        .into_result::<StatusMarker>("watch_power_level")?;
3416        Ok(_response.map(|x| x.current_level))
3417    }
3418}
3419
3420#[cfg(target_os = "fuchsia")]
3421impl From<StatusSynchronousProxy> for zx::NullableHandle {
3422    fn from(value: StatusSynchronousProxy) -> Self {
3423        value.into_channel().into()
3424    }
3425}
3426
3427#[cfg(target_os = "fuchsia")]
3428impl From<fidl::Channel> for StatusSynchronousProxy {
3429    fn from(value: fidl::Channel) -> Self {
3430        Self::new(value)
3431    }
3432}
3433
3434#[cfg(target_os = "fuchsia")]
3435impl fidl::endpoints::FromClient for StatusSynchronousProxy {
3436    type Protocol = StatusMarker;
3437
3438    fn from_client(value: fidl::endpoints::ClientEnd<StatusMarker>) -> Self {
3439        Self::new(value.into_channel())
3440    }
3441}
3442
3443#[derive(Debug, Clone)]
3444pub struct StatusProxy {
3445    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
3446}
3447
3448impl fidl::endpoints::Proxy for StatusProxy {
3449    type Protocol = StatusMarker;
3450
3451    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
3452        Self::new(inner)
3453    }
3454
3455    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
3456        self.client.into_channel().map_err(|client| Self { client })
3457    }
3458
3459    fn as_channel(&self) -> &::fidl::AsyncChannel {
3460        self.client.as_channel()
3461    }
3462}
3463
3464impl StatusProxy {
3465    /// Create a new Proxy for fuchsia.power.broker/Status.
3466    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
3467        let protocol_name = <StatusMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
3468        Self { client: fidl::client::Client::new(channel, protocol_name) }
3469    }
3470
3471    /// Get a Stream of events from the remote end of the protocol.
3472    ///
3473    /// # Panics
3474    ///
3475    /// Panics if the event stream was already taken.
3476    pub fn take_event_stream(&self) -> StatusEventStream {
3477        StatusEventStream { event_receiver: self.client.take_event_receiver() }
3478    }
3479
3480    /// Returns the current power level for this element. The first call on
3481    /// this channel will return immediately. Subsequent calls will block until
3482    /// the current power level has changed.
3483    pub fn r#watch_power_level(
3484        &self,
3485    ) -> fidl::client::QueryResponseFut<
3486        StatusWatchPowerLevelResult,
3487        fidl::encoding::DefaultFuchsiaResourceDialect,
3488    > {
3489        StatusProxyInterface::r#watch_power_level(self)
3490    }
3491}
3492
3493impl StatusProxyInterface for StatusProxy {
3494    type WatchPowerLevelResponseFut = fidl::client::QueryResponseFut<
3495        StatusWatchPowerLevelResult,
3496        fidl::encoding::DefaultFuchsiaResourceDialect,
3497    >;
3498    fn r#watch_power_level(&self) -> Self::WatchPowerLevelResponseFut {
3499        fn _decode(
3500            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
3501        ) -> Result<StatusWatchPowerLevelResult, fidl::Error> {
3502            let _response = fidl::client::decode_transaction_body::<
3503                fidl::encoding::FlexibleResultType<StatusWatchPowerLevelResponse, StatusError>,
3504                fidl::encoding::DefaultFuchsiaResourceDialect,
3505                0x2f11ba8df9b5614e,
3506            >(_buf?)?
3507            .into_result::<StatusMarker>("watch_power_level")?;
3508            Ok(_response.map(|x| x.current_level))
3509        }
3510        self.client
3511            .send_query_and_decode::<fidl::encoding::EmptyPayload, StatusWatchPowerLevelResult>(
3512                (),
3513                0x2f11ba8df9b5614e,
3514                fidl::encoding::DynamicFlags::FLEXIBLE,
3515                _decode,
3516            )
3517    }
3518}
3519
3520pub struct StatusEventStream {
3521    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
3522}
3523
3524impl std::marker::Unpin for StatusEventStream {}
3525
3526impl futures::stream::FusedStream for StatusEventStream {
3527    fn is_terminated(&self) -> bool {
3528        self.event_receiver.is_terminated()
3529    }
3530}
3531
3532impl futures::Stream for StatusEventStream {
3533    type Item = Result<StatusEvent, fidl::Error>;
3534
3535    fn poll_next(
3536        mut self: std::pin::Pin<&mut Self>,
3537        cx: &mut std::task::Context<'_>,
3538    ) -> std::task::Poll<Option<Self::Item>> {
3539        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
3540            &mut self.event_receiver,
3541            cx
3542        )?) {
3543            Some(buf) => std::task::Poll::Ready(Some(StatusEvent::decode(buf))),
3544            None => std::task::Poll::Ready(None),
3545        }
3546    }
3547}
3548
3549#[derive(Debug)]
3550pub enum StatusEvent {
3551    #[non_exhaustive]
3552    _UnknownEvent {
3553        /// Ordinal of the event that was sent.
3554        ordinal: u64,
3555    },
3556}
3557
3558impl StatusEvent {
3559    /// Decodes a message buffer as a [`StatusEvent`].
3560    fn decode(
3561        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
3562    ) -> Result<StatusEvent, fidl::Error> {
3563        let (bytes, _handles) = buf.split_mut();
3564        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
3565        debug_assert_eq!(tx_header.tx_id, 0);
3566        match tx_header.ordinal {
3567            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
3568                Ok(StatusEvent::_UnknownEvent { ordinal: tx_header.ordinal })
3569            }
3570            _ => Err(fidl::Error::UnknownOrdinal {
3571                ordinal: tx_header.ordinal,
3572                protocol_name: <StatusMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
3573            }),
3574        }
3575    }
3576}
3577
3578/// A Stream of incoming requests for fuchsia.power.broker/Status.
3579pub struct StatusRequestStream {
3580    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
3581    is_terminated: bool,
3582}
3583
3584impl std::marker::Unpin for StatusRequestStream {}
3585
3586impl futures::stream::FusedStream for StatusRequestStream {
3587    fn is_terminated(&self) -> bool {
3588        self.is_terminated
3589    }
3590}
3591
3592impl fidl::endpoints::RequestStream for StatusRequestStream {
3593    type Protocol = StatusMarker;
3594    type ControlHandle = StatusControlHandle;
3595
3596    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
3597        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
3598    }
3599
3600    fn control_handle(&self) -> Self::ControlHandle {
3601        StatusControlHandle { inner: self.inner.clone() }
3602    }
3603
3604    fn into_inner(
3605        self,
3606    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
3607    {
3608        (self.inner, self.is_terminated)
3609    }
3610
3611    fn from_inner(
3612        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
3613        is_terminated: bool,
3614    ) -> Self {
3615        Self { inner, is_terminated }
3616    }
3617}
3618
3619impl futures::Stream for StatusRequestStream {
3620    type Item = Result<StatusRequest, fidl::Error>;
3621
3622    fn poll_next(
3623        mut self: std::pin::Pin<&mut Self>,
3624        cx: &mut std::task::Context<'_>,
3625    ) -> std::task::Poll<Option<Self::Item>> {
3626        let this = &mut *self;
3627        if this.inner.check_shutdown(cx) {
3628            this.is_terminated = true;
3629            return std::task::Poll::Ready(None);
3630        }
3631        if this.is_terminated {
3632            panic!("polled StatusRequestStream after completion");
3633        }
3634        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
3635            |bytes, handles| {
3636                match this.inner.channel().read_etc(cx, bytes, handles) {
3637                    std::task::Poll::Ready(Ok(())) => {}
3638                    std::task::Poll::Pending => return std::task::Poll::Pending,
3639                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
3640                        this.is_terminated = true;
3641                        return std::task::Poll::Ready(None);
3642                    }
3643                    std::task::Poll::Ready(Err(e)) => {
3644                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
3645                            e.into(),
3646                        ))));
3647                    }
3648                }
3649
3650                // A message has been received from the channel
3651                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
3652
3653                std::task::Poll::Ready(Some(match header.ordinal {
3654                    0x2f11ba8df9b5614e => {
3655                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
3656                        let mut req = fidl::new_empty!(
3657                            fidl::encoding::EmptyPayload,
3658                            fidl::encoding::DefaultFuchsiaResourceDialect
3659                        );
3660                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
3661                        let control_handle = StatusControlHandle { inner: this.inner.clone() };
3662                        Ok(StatusRequest::WatchPowerLevel {
3663                            responder: StatusWatchPowerLevelResponder {
3664                                control_handle: std::mem::ManuallyDrop::new(control_handle),
3665                                tx_id: header.tx_id,
3666                            },
3667                        })
3668                    }
3669                    _ if header.tx_id == 0
3670                        && header
3671                            .dynamic_flags()
3672                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
3673                    {
3674                        Ok(StatusRequest::_UnknownMethod {
3675                            ordinal: header.ordinal,
3676                            control_handle: StatusControlHandle { inner: this.inner.clone() },
3677                            method_type: fidl::MethodType::OneWay,
3678                        })
3679                    }
3680                    _ if header
3681                        .dynamic_flags()
3682                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
3683                    {
3684                        this.inner.send_framework_err(
3685                            fidl::encoding::FrameworkErr::UnknownMethod,
3686                            header.tx_id,
3687                            header.ordinal,
3688                            header.dynamic_flags(),
3689                            (bytes, handles),
3690                        )?;
3691                        Ok(StatusRequest::_UnknownMethod {
3692                            ordinal: header.ordinal,
3693                            control_handle: StatusControlHandle { inner: this.inner.clone() },
3694                            method_type: fidl::MethodType::TwoWay,
3695                        })
3696                    }
3697                    _ => Err(fidl::Error::UnknownOrdinal {
3698                        ordinal: header.ordinal,
3699                        protocol_name:
3700                            <StatusMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
3701                    }),
3702                }))
3703            },
3704        )
3705    }
3706}
3707
3708/// Provides read-only access to the current PowerLevel of an element and the
3709/// ability to watch changes to an element's power level. A new channel to
3710/// this protocol can be obtained by calling OpenStatus on the element's
3711/// ElementControl channel (and passed to other clients who need access
3712/// to the element's current power level).
3713#[derive(Debug)]
3714pub enum StatusRequest {
3715    /// Returns the current power level for this element. The first call on
3716    /// this channel will return immediately. Subsequent calls will block until
3717    /// the current power level has changed.
3718    WatchPowerLevel { responder: StatusWatchPowerLevelResponder },
3719    /// An interaction was received which does not match any known method.
3720    #[non_exhaustive]
3721    _UnknownMethod {
3722        /// Ordinal of the method that was called.
3723        ordinal: u64,
3724        control_handle: StatusControlHandle,
3725        method_type: fidl::MethodType,
3726    },
3727}
3728
3729impl StatusRequest {
3730    #[allow(irrefutable_let_patterns)]
3731    pub fn into_watch_power_level(self) -> Option<(StatusWatchPowerLevelResponder)> {
3732        if let StatusRequest::WatchPowerLevel { responder } = self {
3733            Some((responder))
3734        } else {
3735            None
3736        }
3737    }
3738
3739    /// Name of the method defined in FIDL
3740    pub fn method_name(&self) -> &'static str {
3741        match *self {
3742            StatusRequest::WatchPowerLevel { .. } => "watch_power_level",
3743            StatusRequest::_UnknownMethod { method_type: fidl::MethodType::OneWay, .. } => {
3744                "unknown one-way method"
3745            }
3746            StatusRequest::_UnknownMethod { method_type: fidl::MethodType::TwoWay, .. } => {
3747                "unknown two-way method"
3748            }
3749        }
3750    }
3751}
3752
3753#[derive(Debug, Clone)]
3754pub struct StatusControlHandle {
3755    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
3756}
3757
3758impl fidl::endpoints::ControlHandle for StatusControlHandle {
3759    fn shutdown(&self) {
3760        self.inner.shutdown()
3761    }
3762
3763    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
3764        self.inner.shutdown_with_epitaph(status)
3765    }
3766
3767    fn is_closed(&self) -> bool {
3768        self.inner.channel().is_closed()
3769    }
3770    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
3771        self.inner.channel().on_closed()
3772    }
3773
3774    #[cfg(target_os = "fuchsia")]
3775    fn signal_peer(
3776        &self,
3777        clear_mask: zx::Signals,
3778        set_mask: zx::Signals,
3779    ) -> Result<(), zx_status::Status> {
3780        use fidl::Peered;
3781        self.inner.channel().signal_peer(clear_mask, set_mask)
3782    }
3783}
3784
3785impl StatusControlHandle {}
3786
3787#[must_use = "FIDL methods require a response to be sent"]
3788#[derive(Debug)]
3789pub struct StatusWatchPowerLevelResponder {
3790    control_handle: std::mem::ManuallyDrop<StatusControlHandle>,
3791    tx_id: u32,
3792}
3793
3794/// Set the the channel to be shutdown (see [`StatusControlHandle::shutdown`])
3795/// if the responder is dropped without sending a response, so that the client
3796/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
3797impl std::ops::Drop for StatusWatchPowerLevelResponder {
3798    fn drop(&mut self) {
3799        self.control_handle.shutdown();
3800        // Safety: drops once, never accessed again
3801        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3802    }
3803}
3804
3805impl fidl::endpoints::Responder for StatusWatchPowerLevelResponder {
3806    type ControlHandle = StatusControlHandle;
3807
3808    fn control_handle(&self) -> &StatusControlHandle {
3809        &self.control_handle
3810    }
3811
3812    fn drop_without_shutdown(mut self) {
3813        // Safety: drops once, never accessed again due to mem::forget
3814        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3815        // Prevent Drop from running (which would shut down the channel)
3816        std::mem::forget(self);
3817    }
3818}
3819
3820impl StatusWatchPowerLevelResponder {
3821    /// Sends a response to the FIDL transaction.
3822    ///
3823    /// Sets the channel to shutdown if an error occurs.
3824    pub fn send(self, mut result: Result<u8, StatusError>) -> Result<(), fidl::Error> {
3825        let _result = self.send_raw(result);
3826        if _result.is_err() {
3827            self.control_handle.shutdown();
3828        }
3829        self.drop_without_shutdown();
3830        _result
3831    }
3832
3833    /// Similar to "send" but does not shutdown the channel if an error occurs.
3834    pub fn send_no_shutdown_on_err(
3835        self,
3836        mut result: Result<u8, StatusError>,
3837    ) -> Result<(), fidl::Error> {
3838        let _result = self.send_raw(result);
3839        self.drop_without_shutdown();
3840        _result
3841    }
3842
3843    fn send_raw(&self, mut result: Result<u8, StatusError>) -> Result<(), fidl::Error> {
3844        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
3845            StatusWatchPowerLevelResponse,
3846            StatusError,
3847        >>(
3848            fidl::encoding::FlexibleResult::new(result.map(|current_level| (current_level,))),
3849            self.tx_id,
3850            0x2f11ba8df9b5614e,
3851            fidl::encoding::DynamicFlags::FLEXIBLE,
3852        )
3853    }
3854}
3855
3856#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
3857pub struct TopologyMarker;
3858
3859impl fidl::endpoints::ProtocolMarker for TopologyMarker {
3860    type Proxy = TopologyProxy;
3861    type RequestStream = TopologyRequestStream;
3862    #[cfg(target_os = "fuchsia")]
3863    type SynchronousProxy = TopologySynchronousProxy;
3864
3865    const DEBUG_NAME: &'static str = "fuchsia.power.broker.Topology";
3866}
3867impl fidl::endpoints::DiscoverableProtocolMarker for TopologyMarker {}
3868pub type TopologyAddElementResult = Result<(), AddElementError>;
3869pub type TopologyLeaseResult = Result<(), LeaseError>;
3870
3871pub trait TopologyProxyInterface: Send + Sync {
3872    type AddElementResponseFut: std::future::Future<Output = Result<TopologyAddElementResult, fidl::Error>>
3873        + Send;
3874    fn r#add_element(&self, payload: ElementSchema) -> Self::AddElementResponseFut;
3875    type LeaseResponseFut: std::future::Future<Output = Result<TopologyLeaseResult, fidl::Error>>
3876        + Send;
3877    fn r#lease(&self, payload: LeaseSchema) -> Self::LeaseResponseFut;
3878}
3879#[derive(Debug)]
3880#[cfg(target_os = "fuchsia")]
3881pub struct TopologySynchronousProxy {
3882    client: fidl::client::sync::Client,
3883}
3884
3885#[cfg(target_os = "fuchsia")]
3886impl fidl::endpoints::SynchronousProxy for TopologySynchronousProxy {
3887    type Proxy = TopologyProxy;
3888    type Protocol = TopologyMarker;
3889
3890    fn from_channel(inner: fidl::Channel) -> Self {
3891        Self::new(inner)
3892    }
3893
3894    fn into_channel(self) -> fidl::Channel {
3895        self.client.into_channel()
3896    }
3897
3898    fn as_channel(&self) -> &fidl::Channel {
3899        self.client.as_channel()
3900    }
3901}
3902
3903#[cfg(target_os = "fuchsia")]
3904impl TopologySynchronousProxy {
3905    pub fn new(channel: fidl::Channel) -> Self {
3906        let protocol_name = <TopologyMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
3907        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
3908    }
3909
3910    pub fn into_channel(self) -> fidl::Channel {
3911        self.client.into_channel()
3912    }
3913
3914    /// Waits until an event arrives and returns it. It is safe for other
3915    /// threads to make concurrent requests while waiting for an event.
3916    pub fn wait_for_event(
3917        &self,
3918        deadline: zx::MonotonicInstant,
3919    ) -> Result<TopologyEvent, fidl::Error> {
3920        TopologyEvent::decode(self.client.wait_for_event(deadline)?)
3921    }
3922
3923    /// Called by a Power Element owner to register a new Power Element and
3924    /// open control channels for that element.
3925    pub fn r#add_element(
3926        &self,
3927        mut payload: ElementSchema,
3928        ___deadline: zx::MonotonicInstant,
3929    ) -> Result<TopologyAddElementResult, fidl::Error> {
3930        let _response = self.client.send_query::<
3931            ElementSchema,
3932            fidl::encoding::FlexibleResultType<fidl::encoding::EmptyStruct, AddElementError>,
3933        >(
3934            &mut payload,
3935            0x269ed93c9e87fa03,
3936            fidl::encoding::DynamicFlags::FLEXIBLE,
3937            ___deadline,
3938        )?
3939        .into_result::<TopologyMarker>("add_element")?;
3940        Ok(_response.map(|x| x))
3941    }
3942
3943    /// Called by a client to directly open a lease on the given dependencies
3944    /// without the need for creating and managing a new element.
3945    pub fn r#lease(
3946        &self,
3947        mut payload: LeaseSchema,
3948        ___deadline: zx::MonotonicInstant,
3949    ) -> Result<TopologyLeaseResult, fidl::Error> {
3950        let _response = self.client.send_query::<
3951            LeaseSchema,
3952            fidl::encoding::FlexibleResultType<fidl::encoding::EmptyStruct, LeaseError>,
3953        >(
3954            &mut payload,
3955            0x7f39c02fb9775330,
3956            fidl::encoding::DynamicFlags::FLEXIBLE,
3957            ___deadline,
3958        )?
3959        .into_result::<TopologyMarker>("lease")?;
3960        Ok(_response.map(|x| x))
3961    }
3962}
3963
3964#[cfg(target_os = "fuchsia")]
3965impl From<TopologySynchronousProxy> for zx::NullableHandle {
3966    fn from(value: TopologySynchronousProxy) -> Self {
3967        value.into_channel().into()
3968    }
3969}
3970
3971#[cfg(target_os = "fuchsia")]
3972impl From<fidl::Channel> for TopologySynchronousProxy {
3973    fn from(value: fidl::Channel) -> Self {
3974        Self::new(value)
3975    }
3976}
3977
3978#[cfg(target_os = "fuchsia")]
3979impl fidl::endpoints::FromClient for TopologySynchronousProxy {
3980    type Protocol = TopologyMarker;
3981
3982    fn from_client(value: fidl::endpoints::ClientEnd<TopologyMarker>) -> Self {
3983        Self::new(value.into_channel())
3984    }
3985}
3986
3987#[derive(Debug, Clone)]
3988pub struct TopologyProxy {
3989    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
3990}
3991
3992impl fidl::endpoints::Proxy for TopologyProxy {
3993    type Protocol = TopologyMarker;
3994
3995    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
3996        Self::new(inner)
3997    }
3998
3999    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
4000        self.client.into_channel().map_err(|client| Self { client })
4001    }
4002
4003    fn as_channel(&self) -> &::fidl::AsyncChannel {
4004        self.client.as_channel()
4005    }
4006}
4007
4008impl TopologyProxy {
4009    /// Create a new Proxy for fuchsia.power.broker/Topology.
4010    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
4011        let protocol_name = <TopologyMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
4012        Self { client: fidl::client::Client::new(channel, protocol_name) }
4013    }
4014
4015    /// Get a Stream of events from the remote end of the protocol.
4016    ///
4017    /// # Panics
4018    ///
4019    /// Panics if the event stream was already taken.
4020    pub fn take_event_stream(&self) -> TopologyEventStream {
4021        TopologyEventStream { event_receiver: self.client.take_event_receiver() }
4022    }
4023
4024    /// Called by a Power Element owner to register a new Power Element and
4025    /// open control channels for that element.
4026    pub fn r#add_element(
4027        &self,
4028        mut payload: ElementSchema,
4029    ) -> fidl::client::QueryResponseFut<
4030        TopologyAddElementResult,
4031        fidl::encoding::DefaultFuchsiaResourceDialect,
4032    > {
4033        TopologyProxyInterface::r#add_element(self, payload)
4034    }
4035
4036    /// Called by a client to directly open a lease on the given dependencies
4037    /// without the need for creating and managing a new element.
4038    pub fn r#lease(
4039        &self,
4040        mut payload: LeaseSchema,
4041    ) -> fidl::client::QueryResponseFut<
4042        TopologyLeaseResult,
4043        fidl::encoding::DefaultFuchsiaResourceDialect,
4044    > {
4045        TopologyProxyInterface::r#lease(self, payload)
4046    }
4047}
4048
4049impl TopologyProxyInterface for TopologyProxy {
4050    type AddElementResponseFut = fidl::client::QueryResponseFut<
4051        TopologyAddElementResult,
4052        fidl::encoding::DefaultFuchsiaResourceDialect,
4053    >;
4054    fn r#add_element(&self, mut payload: ElementSchema) -> Self::AddElementResponseFut {
4055        fn _decode(
4056            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
4057        ) -> Result<TopologyAddElementResult, fidl::Error> {
4058            let _response = fidl::client::decode_transaction_body::<
4059                fidl::encoding::FlexibleResultType<fidl::encoding::EmptyStruct, AddElementError>,
4060                fidl::encoding::DefaultFuchsiaResourceDialect,
4061                0x269ed93c9e87fa03,
4062            >(_buf?)?
4063            .into_result::<TopologyMarker>("add_element")?;
4064            Ok(_response.map(|x| x))
4065        }
4066        self.client.send_query_and_decode::<ElementSchema, TopologyAddElementResult>(
4067            &mut payload,
4068            0x269ed93c9e87fa03,
4069            fidl::encoding::DynamicFlags::FLEXIBLE,
4070            _decode,
4071        )
4072    }
4073
4074    type LeaseResponseFut = fidl::client::QueryResponseFut<
4075        TopologyLeaseResult,
4076        fidl::encoding::DefaultFuchsiaResourceDialect,
4077    >;
4078    fn r#lease(&self, mut payload: LeaseSchema) -> Self::LeaseResponseFut {
4079        fn _decode(
4080            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
4081        ) -> Result<TopologyLeaseResult, fidl::Error> {
4082            let _response = fidl::client::decode_transaction_body::<
4083                fidl::encoding::FlexibleResultType<fidl::encoding::EmptyStruct, LeaseError>,
4084                fidl::encoding::DefaultFuchsiaResourceDialect,
4085                0x7f39c02fb9775330,
4086            >(_buf?)?
4087            .into_result::<TopologyMarker>("lease")?;
4088            Ok(_response.map(|x| x))
4089        }
4090        self.client.send_query_and_decode::<LeaseSchema, TopologyLeaseResult>(
4091            &mut payload,
4092            0x7f39c02fb9775330,
4093            fidl::encoding::DynamicFlags::FLEXIBLE,
4094            _decode,
4095        )
4096    }
4097}
4098
4099pub struct TopologyEventStream {
4100    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
4101}
4102
4103impl std::marker::Unpin for TopologyEventStream {}
4104
4105impl futures::stream::FusedStream for TopologyEventStream {
4106    fn is_terminated(&self) -> bool {
4107        self.event_receiver.is_terminated()
4108    }
4109}
4110
4111impl futures::Stream for TopologyEventStream {
4112    type Item = Result<TopologyEvent, fidl::Error>;
4113
4114    fn poll_next(
4115        mut self: std::pin::Pin<&mut Self>,
4116        cx: &mut std::task::Context<'_>,
4117    ) -> std::task::Poll<Option<Self::Item>> {
4118        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
4119            &mut self.event_receiver,
4120            cx
4121        )?) {
4122            Some(buf) => std::task::Poll::Ready(Some(TopologyEvent::decode(buf))),
4123            None => std::task::Poll::Ready(None),
4124        }
4125    }
4126}
4127
4128#[derive(Debug)]
4129pub enum TopologyEvent {
4130    #[non_exhaustive]
4131    _UnknownEvent {
4132        /// Ordinal of the event that was sent.
4133        ordinal: u64,
4134    },
4135}
4136
4137impl TopologyEvent {
4138    /// Decodes a message buffer as a [`TopologyEvent`].
4139    fn decode(
4140        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
4141    ) -> Result<TopologyEvent, fidl::Error> {
4142        let (bytes, _handles) = buf.split_mut();
4143        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
4144        debug_assert_eq!(tx_header.tx_id, 0);
4145        match tx_header.ordinal {
4146            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
4147                Ok(TopologyEvent::_UnknownEvent { ordinal: tx_header.ordinal })
4148            }
4149            _ => Err(fidl::Error::UnknownOrdinal {
4150                ordinal: tx_header.ordinal,
4151                protocol_name: <TopologyMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
4152            }),
4153        }
4154    }
4155}
4156
4157/// A Stream of incoming requests for fuchsia.power.broker/Topology.
4158pub struct TopologyRequestStream {
4159    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
4160    is_terminated: bool,
4161}
4162
4163impl std::marker::Unpin for TopologyRequestStream {}
4164
4165impl futures::stream::FusedStream for TopologyRequestStream {
4166    fn is_terminated(&self) -> bool {
4167        self.is_terminated
4168    }
4169}
4170
4171impl fidl::endpoints::RequestStream for TopologyRequestStream {
4172    type Protocol = TopologyMarker;
4173    type ControlHandle = TopologyControlHandle;
4174
4175    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
4176        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
4177    }
4178
4179    fn control_handle(&self) -> Self::ControlHandle {
4180        TopologyControlHandle { inner: self.inner.clone() }
4181    }
4182
4183    fn into_inner(
4184        self,
4185    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
4186    {
4187        (self.inner, self.is_terminated)
4188    }
4189
4190    fn from_inner(
4191        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
4192        is_terminated: bool,
4193    ) -> Self {
4194        Self { inner, is_terminated }
4195    }
4196}
4197
4198impl futures::Stream for TopologyRequestStream {
4199    type Item = Result<TopologyRequest, fidl::Error>;
4200
4201    fn poll_next(
4202        mut self: std::pin::Pin<&mut Self>,
4203        cx: &mut std::task::Context<'_>,
4204    ) -> std::task::Poll<Option<Self::Item>> {
4205        let this = &mut *self;
4206        if this.inner.check_shutdown(cx) {
4207            this.is_terminated = true;
4208            return std::task::Poll::Ready(None);
4209        }
4210        if this.is_terminated {
4211            panic!("polled TopologyRequestStream after completion");
4212        }
4213        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
4214            |bytes, handles| {
4215                match this.inner.channel().read_etc(cx, bytes, handles) {
4216                    std::task::Poll::Ready(Ok(())) => {}
4217                    std::task::Poll::Pending => return std::task::Poll::Pending,
4218                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
4219                        this.is_terminated = true;
4220                        return std::task::Poll::Ready(None);
4221                    }
4222                    std::task::Poll::Ready(Err(e)) => {
4223                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
4224                            e.into(),
4225                        ))));
4226                    }
4227                }
4228
4229                // A message has been received from the channel
4230                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
4231
4232                std::task::Poll::Ready(Some(match header.ordinal {
4233                    0x269ed93c9e87fa03 => {
4234                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
4235                        let mut req = fidl::new_empty!(
4236                            ElementSchema,
4237                            fidl::encoding::DefaultFuchsiaResourceDialect
4238                        );
4239                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ElementSchema>(&header, _body_bytes, handles, &mut req)?;
4240                        let control_handle = TopologyControlHandle { inner: this.inner.clone() };
4241                        Ok(TopologyRequest::AddElement {
4242                            payload: req,
4243                            responder: TopologyAddElementResponder {
4244                                control_handle: std::mem::ManuallyDrop::new(control_handle),
4245                                tx_id: header.tx_id,
4246                            },
4247                        })
4248                    }
4249                    0x7f39c02fb9775330 => {
4250                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
4251                        let mut req = fidl::new_empty!(
4252                            LeaseSchema,
4253                            fidl::encoding::DefaultFuchsiaResourceDialect
4254                        );
4255                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<LeaseSchema>(&header, _body_bytes, handles, &mut req)?;
4256                        let control_handle = TopologyControlHandle { inner: this.inner.clone() };
4257                        Ok(TopologyRequest::Lease {
4258                            payload: req,
4259                            responder: TopologyLeaseResponder {
4260                                control_handle: std::mem::ManuallyDrop::new(control_handle),
4261                                tx_id: header.tx_id,
4262                            },
4263                        })
4264                    }
4265                    _ if header.tx_id == 0
4266                        && header
4267                            .dynamic_flags()
4268                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
4269                    {
4270                        Ok(TopologyRequest::_UnknownMethod {
4271                            ordinal: header.ordinal,
4272                            control_handle: TopologyControlHandle { inner: this.inner.clone() },
4273                            method_type: fidl::MethodType::OneWay,
4274                        })
4275                    }
4276                    _ if header
4277                        .dynamic_flags()
4278                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
4279                    {
4280                        this.inner.send_framework_err(
4281                            fidl::encoding::FrameworkErr::UnknownMethod,
4282                            header.tx_id,
4283                            header.ordinal,
4284                            header.dynamic_flags(),
4285                            (bytes, handles),
4286                        )?;
4287                        Ok(TopologyRequest::_UnknownMethod {
4288                            ordinal: header.ordinal,
4289                            control_handle: TopologyControlHandle { inner: this.inner.clone() },
4290                            method_type: fidl::MethodType::TwoWay,
4291                        })
4292                    }
4293                    _ => Err(fidl::Error::UnknownOrdinal {
4294                        ordinal: header.ordinal,
4295                        protocol_name:
4296                            <TopologyMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
4297                    }),
4298                }))
4299            },
4300        )
4301    }
4302}
4303
4304/// This is the primary initial protocol used by Power Element Owners to
4305/// communicate with Power Broker. Power Element Owners should add the
4306/// elements they own to the Power Topology through AddElement. All further
4307/// interactions with Power Broker are done through channels opened by the
4308/// AddElement call, which are scoped to the added element.
4309#[derive(Debug)]
4310pub enum TopologyRequest {
4311    /// Called by a Power Element owner to register a new Power Element and
4312    /// open control channels for that element.
4313    AddElement { payload: ElementSchema, responder: TopologyAddElementResponder },
4314    /// Called by a client to directly open a lease on the given dependencies
4315    /// without the need for creating and managing a new element.
4316    Lease { payload: LeaseSchema, responder: TopologyLeaseResponder },
4317    /// An interaction was received which does not match any known method.
4318    #[non_exhaustive]
4319    _UnknownMethod {
4320        /// Ordinal of the method that was called.
4321        ordinal: u64,
4322        control_handle: TopologyControlHandle,
4323        method_type: fidl::MethodType,
4324    },
4325}
4326
4327impl TopologyRequest {
4328    #[allow(irrefutable_let_patterns)]
4329    pub fn into_add_element(self) -> Option<(ElementSchema, TopologyAddElementResponder)> {
4330        if let TopologyRequest::AddElement { payload, responder } = self {
4331            Some((payload, responder))
4332        } else {
4333            None
4334        }
4335    }
4336
4337    #[allow(irrefutable_let_patterns)]
4338    pub fn into_lease(self) -> Option<(LeaseSchema, TopologyLeaseResponder)> {
4339        if let TopologyRequest::Lease { payload, responder } = self {
4340            Some((payload, responder))
4341        } else {
4342            None
4343        }
4344    }
4345
4346    /// Name of the method defined in FIDL
4347    pub fn method_name(&self) -> &'static str {
4348        match *self {
4349            TopologyRequest::AddElement { .. } => "add_element",
4350            TopologyRequest::Lease { .. } => "lease",
4351            TopologyRequest::_UnknownMethod { method_type: fidl::MethodType::OneWay, .. } => {
4352                "unknown one-way method"
4353            }
4354            TopologyRequest::_UnknownMethod { method_type: fidl::MethodType::TwoWay, .. } => {
4355                "unknown two-way method"
4356            }
4357        }
4358    }
4359}
4360
4361#[derive(Debug, Clone)]
4362pub struct TopologyControlHandle {
4363    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
4364}
4365
4366impl fidl::endpoints::ControlHandle for TopologyControlHandle {
4367    fn shutdown(&self) {
4368        self.inner.shutdown()
4369    }
4370
4371    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
4372        self.inner.shutdown_with_epitaph(status)
4373    }
4374
4375    fn is_closed(&self) -> bool {
4376        self.inner.channel().is_closed()
4377    }
4378    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
4379        self.inner.channel().on_closed()
4380    }
4381
4382    #[cfg(target_os = "fuchsia")]
4383    fn signal_peer(
4384        &self,
4385        clear_mask: zx::Signals,
4386        set_mask: zx::Signals,
4387    ) -> Result<(), zx_status::Status> {
4388        use fidl::Peered;
4389        self.inner.channel().signal_peer(clear_mask, set_mask)
4390    }
4391}
4392
4393impl TopologyControlHandle {}
4394
4395#[must_use = "FIDL methods require a response to be sent"]
4396#[derive(Debug)]
4397pub struct TopologyAddElementResponder {
4398    control_handle: std::mem::ManuallyDrop<TopologyControlHandle>,
4399    tx_id: u32,
4400}
4401
4402/// Set the the channel to be shutdown (see [`TopologyControlHandle::shutdown`])
4403/// if the responder is dropped without sending a response, so that the client
4404/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
4405impl std::ops::Drop for TopologyAddElementResponder {
4406    fn drop(&mut self) {
4407        self.control_handle.shutdown();
4408        // Safety: drops once, never accessed again
4409        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4410    }
4411}
4412
4413impl fidl::endpoints::Responder for TopologyAddElementResponder {
4414    type ControlHandle = TopologyControlHandle;
4415
4416    fn control_handle(&self) -> &TopologyControlHandle {
4417        &self.control_handle
4418    }
4419
4420    fn drop_without_shutdown(mut self) {
4421        // Safety: drops once, never accessed again due to mem::forget
4422        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4423        // Prevent Drop from running (which would shut down the channel)
4424        std::mem::forget(self);
4425    }
4426}
4427
4428impl TopologyAddElementResponder {
4429    /// Sends a response to the FIDL transaction.
4430    ///
4431    /// Sets the channel to shutdown if an error occurs.
4432    pub fn send(self, mut result: Result<(), AddElementError>) -> Result<(), fidl::Error> {
4433        let _result = self.send_raw(result);
4434        if _result.is_err() {
4435            self.control_handle.shutdown();
4436        }
4437        self.drop_without_shutdown();
4438        _result
4439    }
4440
4441    /// Similar to "send" but does not shutdown the channel if an error occurs.
4442    pub fn send_no_shutdown_on_err(
4443        self,
4444        mut result: Result<(), AddElementError>,
4445    ) -> Result<(), fidl::Error> {
4446        let _result = self.send_raw(result);
4447        self.drop_without_shutdown();
4448        _result
4449    }
4450
4451    fn send_raw(&self, mut result: Result<(), AddElementError>) -> Result<(), fidl::Error> {
4452        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
4453            fidl::encoding::EmptyStruct,
4454            AddElementError,
4455        >>(
4456            fidl::encoding::FlexibleResult::new(result),
4457            self.tx_id,
4458            0x269ed93c9e87fa03,
4459            fidl::encoding::DynamicFlags::FLEXIBLE,
4460        )
4461    }
4462}
4463
4464#[must_use = "FIDL methods require a response to be sent"]
4465#[derive(Debug)]
4466pub struct TopologyLeaseResponder {
4467    control_handle: std::mem::ManuallyDrop<TopologyControlHandle>,
4468    tx_id: u32,
4469}
4470
4471/// Set the the channel to be shutdown (see [`TopologyControlHandle::shutdown`])
4472/// if the responder is dropped without sending a response, so that the client
4473/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
4474impl std::ops::Drop for TopologyLeaseResponder {
4475    fn drop(&mut self) {
4476        self.control_handle.shutdown();
4477        // Safety: drops once, never accessed again
4478        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4479    }
4480}
4481
4482impl fidl::endpoints::Responder for TopologyLeaseResponder {
4483    type ControlHandle = TopologyControlHandle;
4484
4485    fn control_handle(&self) -> &TopologyControlHandle {
4486        &self.control_handle
4487    }
4488
4489    fn drop_without_shutdown(mut self) {
4490        // Safety: drops once, never accessed again due to mem::forget
4491        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4492        // Prevent Drop from running (which would shut down the channel)
4493        std::mem::forget(self);
4494    }
4495}
4496
4497impl TopologyLeaseResponder {
4498    /// Sends a response to the FIDL transaction.
4499    ///
4500    /// Sets the channel to shutdown if an error occurs.
4501    pub fn send(self, mut result: Result<(), LeaseError>) -> Result<(), fidl::Error> {
4502        let _result = self.send_raw(result);
4503        if _result.is_err() {
4504            self.control_handle.shutdown();
4505        }
4506        self.drop_without_shutdown();
4507        _result
4508    }
4509
4510    /// Similar to "send" but does not shutdown the channel if an error occurs.
4511    pub fn send_no_shutdown_on_err(
4512        self,
4513        mut result: Result<(), LeaseError>,
4514    ) -> Result<(), fidl::Error> {
4515        let _result = self.send_raw(result);
4516        self.drop_without_shutdown();
4517        _result
4518    }
4519
4520    fn send_raw(&self, mut result: Result<(), LeaseError>) -> Result<(), fidl::Error> {
4521        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
4522            fidl::encoding::EmptyStruct,
4523            LeaseError,
4524        >>(
4525            fidl::encoding::FlexibleResult::new(result),
4526            self.tx_id,
4527            0x7f39c02fb9775330,
4528            fidl::encoding::DynamicFlags::FLEXIBLE,
4529        )
4530    }
4531}
4532
4533#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
4534pub struct ElementInfoProviderServiceMarker;
4535
4536#[cfg(target_os = "fuchsia")]
4537impl fidl::endpoints::ServiceMarker for ElementInfoProviderServiceMarker {
4538    type Proxy = ElementInfoProviderServiceProxy;
4539    type Request = ElementInfoProviderServiceRequest;
4540    const SERVICE_NAME: &'static str = "fuchsia.power.broker.ElementInfoProviderService";
4541}
4542
4543/// A request for one of the member protocols of ElementInfoProviderService.
4544///
4545#[cfg(target_os = "fuchsia")]
4546pub enum ElementInfoProviderServiceRequest {
4547    StatusProvider(ElementInfoProviderRequestStream),
4548}
4549
4550#[cfg(target_os = "fuchsia")]
4551impl fidl::endpoints::ServiceRequest for ElementInfoProviderServiceRequest {
4552    type Service = ElementInfoProviderServiceMarker;
4553
4554    fn dispatch(name: &str, _channel: fidl::AsyncChannel) -> Self {
4555        match name {
4556            "status_provider" => Self::StatusProvider(
4557                <ElementInfoProviderRequestStream as fidl::endpoints::RequestStream>::from_channel(
4558                    _channel,
4559                ),
4560            ),
4561            _ => panic!("no such member protocol name for service ElementInfoProviderService"),
4562        }
4563    }
4564
4565    fn member_names() -> &'static [&'static str] {
4566        &["status_provider"]
4567    }
4568}
4569#[cfg(target_os = "fuchsia")]
4570pub struct ElementInfoProviderServiceProxy(
4571    #[allow(dead_code)] Box<dyn fidl::endpoints::MemberOpener>,
4572);
4573
4574#[cfg(target_os = "fuchsia")]
4575impl fidl::endpoints::ServiceProxy for ElementInfoProviderServiceProxy {
4576    type Service = ElementInfoProviderServiceMarker;
4577
4578    fn from_member_opener(opener: Box<dyn fidl::endpoints::MemberOpener>) -> Self {
4579        Self(opener)
4580    }
4581}
4582
4583#[cfg(target_os = "fuchsia")]
4584impl ElementInfoProviderServiceProxy {
4585    pub fn connect_to_status_provider(&self) -> Result<ElementInfoProviderProxy, fidl::Error> {
4586        let (proxy, server_end) = fidl::endpoints::create_proxy::<ElementInfoProviderMarker>();
4587        self.connect_channel_to_status_provider(server_end)?;
4588        Ok(proxy)
4589    }
4590
4591    /// Like `connect_to_status_provider`, but returns a sync proxy.
4592    /// See [`Self::connect_to_status_provider`] for more details.
4593    pub fn connect_to_status_provider_sync(
4594        &self,
4595    ) -> Result<ElementInfoProviderSynchronousProxy, fidl::Error> {
4596        let (proxy, server_end) = fidl::endpoints::create_sync_proxy::<ElementInfoProviderMarker>();
4597        self.connect_channel_to_status_provider(server_end)?;
4598        Ok(proxy)
4599    }
4600
4601    /// Like `connect_to_status_provider`, but accepts a server end.
4602    /// See [`Self::connect_to_status_provider`] for more details.
4603    pub fn connect_channel_to_status_provider(
4604        &self,
4605        server_end: fidl::endpoints::ServerEnd<ElementInfoProviderMarker>,
4606    ) -> Result<(), fidl::Error> {
4607        self.0.open_member("status_provider", server_end.into_channel())
4608    }
4609
4610    pub fn instance_name(&self) -> &str {
4611        self.0.instance_name()
4612    }
4613}
4614
4615mod internal {
4616    use super::*;
4617
4618    impl fidl::encoding::ResourceTypeMarker for ElementControlOpenStatusChannelRequest {
4619        type Borrowed<'a> = &'a mut Self;
4620        fn take_or_borrow<'a>(
4621            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
4622        ) -> Self::Borrowed<'a> {
4623            value
4624        }
4625    }
4626
4627    unsafe impl fidl::encoding::TypeMarker for ElementControlOpenStatusChannelRequest {
4628        type Owned = Self;
4629
4630        #[inline(always)]
4631        fn inline_align(_context: fidl::encoding::Context) -> usize {
4632            4
4633        }
4634
4635        #[inline(always)]
4636        fn inline_size(_context: fidl::encoding::Context) -> usize {
4637            4
4638        }
4639    }
4640
4641    unsafe impl
4642        fidl::encoding::Encode<
4643            ElementControlOpenStatusChannelRequest,
4644            fidl::encoding::DefaultFuchsiaResourceDialect,
4645        > for &mut ElementControlOpenStatusChannelRequest
4646    {
4647        #[inline]
4648        unsafe fn encode(
4649            self,
4650            encoder: &mut fidl::encoding::Encoder<
4651                '_,
4652                fidl::encoding::DefaultFuchsiaResourceDialect,
4653            >,
4654            offset: usize,
4655            _depth: fidl::encoding::Depth,
4656        ) -> fidl::Result<()> {
4657            encoder.debug_check_bounds::<ElementControlOpenStatusChannelRequest>(offset);
4658            // Delegate to tuple encoding.
4659            fidl::encoding::Encode::<ElementControlOpenStatusChannelRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
4660                (
4661                    <fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<StatusMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.status_channel),
4662                ),
4663                encoder, offset, _depth
4664            )
4665        }
4666    }
4667    unsafe impl<
4668        T0: fidl::encoding::Encode<
4669                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<StatusMarker>>,
4670                fidl::encoding::DefaultFuchsiaResourceDialect,
4671            >,
4672    >
4673        fidl::encoding::Encode<
4674            ElementControlOpenStatusChannelRequest,
4675            fidl::encoding::DefaultFuchsiaResourceDialect,
4676        > for (T0,)
4677    {
4678        #[inline]
4679        unsafe fn encode(
4680            self,
4681            encoder: &mut fidl::encoding::Encoder<
4682                '_,
4683                fidl::encoding::DefaultFuchsiaResourceDialect,
4684            >,
4685            offset: usize,
4686            depth: fidl::encoding::Depth,
4687        ) -> fidl::Result<()> {
4688            encoder.debug_check_bounds::<ElementControlOpenStatusChannelRequest>(offset);
4689            // Zero out padding regions. There's no need to apply masks
4690            // because the unmasked parts will be overwritten by fields.
4691            // Write the fields.
4692            self.0.encode(encoder, offset + 0, depth)?;
4693            Ok(())
4694        }
4695    }
4696
4697    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
4698        for ElementControlOpenStatusChannelRequest
4699    {
4700        #[inline(always)]
4701        fn new_empty() -> Self {
4702            Self {
4703                status_channel: fidl::new_empty!(
4704                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<StatusMarker>>,
4705                    fidl::encoding::DefaultFuchsiaResourceDialect
4706                ),
4707            }
4708        }
4709
4710        #[inline]
4711        unsafe fn decode(
4712            &mut self,
4713            decoder: &mut fidl::encoding::Decoder<
4714                '_,
4715                fidl::encoding::DefaultFuchsiaResourceDialect,
4716            >,
4717            offset: usize,
4718            _depth: fidl::encoding::Depth,
4719        ) -> fidl::Result<()> {
4720            decoder.debug_check_bounds::<Self>(offset);
4721            // Verify that padding bytes are zero.
4722            fidl::decode!(
4723                fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<StatusMarker>>,
4724                fidl::encoding::DefaultFuchsiaResourceDialect,
4725                &mut self.status_channel,
4726                decoder,
4727                offset + 0,
4728                _depth
4729            )?;
4730            Ok(())
4731        }
4732    }
4733
4734    impl fidl::encoding::ResourceTypeMarker for ElementControlRegisterDependencyTokenRequest {
4735        type Borrowed<'a> = &'a mut Self;
4736        fn take_or_borrow<'a>(
4737            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
4738        ) -> Self::Borrowed<'a> {
4739            value
4740        }
4741    }
4742
4743    unsafe impl fidl::encoding::TypeMarker for ElementControlRegisterDependencyTokenRequest {
4744        type Owned = Self;
4745
4746        #[inline(always)]
4747        fn inline_align(_context: fidl::encoding::Context) -> usize {
4748            4
4749        }
4750
4751        #[inline(always)]
4752        fn inline_size(_context: fidl::encoding::Context) -> usize {
4753            4
4754        }
4755    }
4756
4757    unsafe impl
4758        fidl::encoding::Encode<
4759            ElementControlRegisterDependencyTokenRequest,
4760            fidl::encoding::DefaultFuchsiaResourceDialect,
4761        > for &mut ElementControlRegisterDependencyTokenRequest
4762    {
4763        #[inline]
4764        unsafe fn encode(
4765            self,
4766            encoder: &mut fidl::encoding::Encoder<
4767                '_,
4768                fidl::encoding::DefaultFuchsiaResourceDialect,
4769            >,
4770            offset: usize,
4771            _depth: fidl::encoding::Depth,
4772        ) -> fidl::Result<()> {
4773            encoder.debug_check_bounds::<ElementControlRegisterDependencyTokenRequest>(offset);
4774            // Delegate to tuple encoding.
4775            fidl::encoding::Encode::<
4776                ElementControlRegisterDependencyTokenRequest,
4777                fidl::encoding::DefaultFuchsiaResourceDialect,
4778            >::encode(
4779                (<fidl::encoding::HandleType<
4780                    fidl::Event,
4781                    { fidl::ObjectType::EVENT.into_raw() },
4782                    2147483648,
4783                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
4784                    &mut self.token
4785                ),),
4786                encoder,
4787                offset,
4788                _depth,
4789            )
4790        }
4791    }
4792    unsafe impl<
4793        T0: fidl::encoding::Encode<
4794                fidl::encoding::HandleType<
4795                    fidl::Event,
4796                    { fidl::ObjectType::EVENT.into_raw() },
4797                    2147483648,
4798                >,
4799                fidl::encoding::DefaultFuchsiaResourceDialect,
4800            >,
4801    >
4802        fidl::encoding::Encode<
4803            ElementControlRegisterDependencyTokenRequest,
4804            fidl::encoding::DefaultFuchsiaResourceDialect,
4805        > for (T0,)
4806    {
4807        #[inline]
4808        unsafe fn encode(
4809            self,
4810            encoder: &mut fidl::encoding::Encoder<
4811                '_,
4812                fidl::encoding::DefaultFuchsiaResourceDialect,
4813            >,
4814            offset: usize,
4815            depth: fidl::encoding::Depth,
4816        ) -> fidl::Result<()> {
4817            encoder.debug_check_bounds::<ElementControlRegisterDependencyTokenRequest>(offset);
4818            // Zero out padding regions. There's no need to apply masks
4819            // because the unmasked parts will be overwritten by fields.
4820            // Write the fields.
4821            self.0.encode(encoder, offset + 0, depth)?;
4822            Ok(())
4823        }
4824    }
4825
4826    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
4827        for ElementControlRegisterDependencyTokenRequest
4828    {
4829        #[inline(always)]
4830        fn new_empty() -> Self {
4831            Self {
4832                token: fidl::new_empty!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
4833            }
4834        }
4835
4836        #[inline]
4837        unsafe fn decode(
4838            &mut self,
4839            decoder: &mut fidl::encoding::Decoder<
4840                '_,
4841                fidl::encoding::DefaultFuchsiaResourceDialect,
4842            >,
4843            offset: usize,
4844            _depth: fidl::encoding::Depth,
4845        ) -> fidl::Result<()> {
4846            decoder.debug_check_bounds::<Self>(offset);
4847            // Verify that padding bytes are zero.
4848            fidl::decode!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.token, decoder, offset + 0, _depth)?;
4849            Ok(())
4850        }
4851    }
4852
4853    impl fidl::encoding::ResourceTypeMarker for ElementControlUnregisterDependencyTokenRequest {
4854        type Borrowed<'a> = &'a mut Self;
4855        fn take_or_borrow<'a>(
4856            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
4857        ) -> Self::Borrowed<'a> {
4858            value
4859        }
4860    }
4861
4862    unsafe impl fidl::encoding::TypeMarker for ElementControlUnregisterDependencyTokenRequest {
4863        type Owned = Self;
4864
4865        #[inline(always)]
4866        fn inline_align(_context: fidl::encoding::Context) -> usize {
4867            4
4868        }
4869
4870        #[inline(always)]
4871        fn inline_size(_context: fidl::encoding::Context) -> usize {
4872            4
4873        }
4874    }
4875
4876    unsafe impl
4877        fidl::encoding::Encode<
4878            ElementControlUnregisterDependencyTokenRequest,
4879            fidl::encoding::DefaultFuchsiaResourceDialect,
4880        > for &mut ElementControlUnregisterDependencyTokenRequest
4881    {
4882        #[inline]
4883        unsafe fn encode(
4884            self,
4885            encoder: &mut fidl::encoding::Encoder<
4886                '_,
4887                fidl::encoding::DefaultFuchsiaResourceDialect,
4888            >,
4889            offset: usize,
4890            _depth: fidl::encoding::Depth,
4891        ) -> fidl::Result<()> {
4892            encoder.debug_check_bounds::<ElementControlUnregisterDependencyTokenRequest>(offset);
4893            // Delegate to tuple encoding.
4894            fidl::encoding::Encode::<
4895                ElementControlUnregisterDependencyTokenRequest,
4896                fidl::encoding::DefaultFuchsiaResourceDialect,
4897            >::encode(
4898                (<fidl::encoding::HandleType<
4899                    fidl::Event,
4900                    { fidl::ObjectType::EVENT.into_raw() },
4901                    2147483648,
4902                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
4903                    &mut self.token
4904                ),),
4905                encoder,
4906                offset,
4907                _depth,
4908            )
4909        }
4910    }
4911    unsafe impl<
4912        T0: fidl::encoding::Encode<
4913                fidl::encoding::HandleType<
4914                    fidl::Event,
4915                    { fidl::ObjectType::EVENT.into_raw() },
4916                    2147483648,
4917                >,
4918                fidl::encoding::DefaultFuchsiaResourceDialect,
4919            >,
4920    >
4921        fidl::encoding::Encode<
4922            ElementControlUnregisterDependencyTokenRequest,
4923            fidl::encoding::DefaultFuchsiaResourceDialect,
4924        > for (T0,)
4925    {
4926        #[inline]
4927        unsafe fn encode(
4928            self,
4929            encoder: &mut fidl::encoding::Encoder<
4930                '_,
4931                fidl::encoding::DefaultFuchsiaResourceDialect,
4932            >,
4933            offset: usize,
4934            depth: fidl::encoding::Depth,
4935        ) -> fidl::Result<()> {
4936            encoder.debug_check_bounds::<ElementControlUnregisterDependencyTokenRequest>(offset);
4937            // Zero out padding regions. There's no need to apply masks
4938            // because the unmasked parts will be overwritten by fields.
4939            // Write the fields.
4940            self.0.encode(encoder, offset + 0, depth)?;
4941            Ok(())
4942        }
4943    }
4944
4945    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
4946        for ElementControlUnregisterDependencyTokenRequest
4947    {
4948        #[inline(always)]
4949        fn new_empty() -> Self {
4950            Self {
4951                token: fidl::new_empty!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
4952            }
4953        }
4954
4955        #[inline]
4956        unsafe fn decode(
4957            &mut self,
4958            decoder: &mut fidl::encoding::Decoder<
4959                '_,
4960                fidl::encoding::DefaultFuchsiaResourceDialect,
4961            >,
4962            offset: usize,
4963            _depth: fidl::encoding::Depth,
4964        ) -> fidl::Result<()> {
4965            decoder.debug_check_bounds::<Self>(offset);
4966            // Verify that padding bytes are zero.
4967            fidl::decode!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.token, decoder, offset + 0, _depth)?;
4968            Ok(())
4969        }
4970    }
4971
4972    impl fidl::encoding::ResourceTypeMarker for ElementInfoProviderGetElementPowerLevelNamesResponse {
4973        type Borrowed<'a> = &'a mut Self;
4974        fn take_or_borrow<'a>(
4975            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
4976        ) -> Self::Borrowed<'a> {
4977            value
4978        }
4979    }
4980
4981    unsafe impl fidl::encoding::TypeMarker for ElementInfoProviderGetElementPowerLevelNamesResponse {
4982        type Owned = Self;
4983
4984        #[inline(always)]
4985        fn inline_align(_context: fidl::encoding::Context) -> usize {
4986            8
4987        }
4988
4989        #[inline(always)]
4990        fn inline_size(_context: fidl::encoding::Context) -> usize {
4991            16
4992        }
4993    }
4994
4995    unsafe impl
4996        fidl::encoding::Encode<
4997            ElementInfoProviderGetElementPowerLevelNamesResponse,
4998            fidl::encoding::DefaultFuchsiaResourceDialect,
4999        > for &mut ElementInfoProviderGetElementPowerLevelNamesResponse
5000    {
5001        #[inline]
5002        unsafe fn encode(
5003            self,
5004            encoder: &mut fidl::encoding::Encoder<
5005                '_,
5006                fidl::encoding::DefaultFuchsiaResourceDialect,
5007            >,
5008            offset: usize,
5009            _depth: fidl::encoding::Depth,
5010        ) -> fidl::Result<()> {
5011            encoder
5012                .debug_check_bounds::<ElementInfoProviderGetElementPowerLevelNamesResponse>(offset);
5013            // Delegate to tuple encoding.
5014            fidl::encoding::Encode::<ElementInfoProviderGetElementPowerLevelNamesResponse, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
5015                (
5016                    <fidl::encoding::UnboundedVector<ElementPowerLevelNames> as fidl::encoding::ValueTypeMarker>::borrow(&self.level_names),
5017                ),
5018                encoder, offset, _depth
5019            )
5020        }
5021    }
5022    unsafe impl<
5023        T0: fidl::encoding::Encode<
5024                fidl::encoding::UnboundedVector<ElementPowerLevelNames>,
5025                fidl::encoding::DefaultFuchsiaResourceDialect,
5026            >,
5027    >
5028        fidl::encoding::Encode<
5029            ElementInfoProviderGetElementPowerLevelNamesResponse,
5030            fidl::encoding::DefaultFuchsiaResourceDialect,
5031        > for (T0,)
5032    {
5033        #[inline]
5034        unsafe fn encode(
5035            self,
5036            encoder: &mut fidl::encoding::Encoder<
5037                '_,
5038                fidl::encoding::DefaultFuchsiaResourceDialect,
5039            >,
5040            offset: usize,
5041            depth: fidl::encoding::Depth,
5042        ) -> fidl::Result<()> {
5043            encoder
5044                .debug_check_bounds::<ElementInfoProviderGetElementPowerLevelNamesResponse>(offset);
5045            // Zero out padding regions. There's no need to apply masks
5046            // because the unmasked parts will be overwritten by fields.
5047            // Write the fields.
5048            self.0.encode(encoder, offset + 0, depth)?;
5049            Ok(())
5050        }
5051    }
5052
5053    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
5054        for ElementInfoProviderGetElementPowerLevelNamesResponse
5055    {
5056        #[inline(always)]
5057        fn new_empty() -> Self {
5058            Self {
5059                level_names: fidl::new_empty!(
5060                    fidl::encoding::UnboundedVector<ElementPowerLevelNames>,
5061                    fidl::encoding::DefaultFuchsiaResourceDialect
5062                ),
5063            }
5064        }
5065
5066        #[inline]
5067        unsafe fn decode(
5068            &mut self,
5069            decoder: &mut fidl::encoding::Decoder<
5070                '_,
5071                fidl::encoding::DefaultFuchsiaResourceDialect,
5072            >,
5073            offset: usize,
5074            _depth: fidl::encoding::Depth,
5075        ) -> fidl::Result<()> {
5076            decoder.debug_check_bounds::<Self>(offset);
5077            // Verify that padding bytes are zero.
5078            fidl::decode!(
5079                fidl::encoding::UnboundedVector<ElementPowerLevelNames>,
5080                fidl::encoding::DefaultFuchsiaResourceDialect,
5081                &mut self.level_names,
5082                decoder,
5083                offset + 0,
5084                _depth
5085            )?;
5086            Ok(())
5087        }
5088    }
5089
5090    impl fidl::encoding::ResourceTypeMarker for ElementInfoProviderGetStatusEndpointsResponse {
5091        type Borrowed<'a> = &'a mut Self;
5092        fn take_or_borrow<'a>(
5093            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
5094        ) -> Self::Borrowed<'a> {
5095            value
5096        }
5097    }
5098
5099    unsafe impl fidl::encoding::TypeMarker for ElementInfoProviderGetStatusEndpointsResponse {
5100        type Owned = Self;
5101
5102        #[inline(always)]
5103        fn inline_align(_context: fidl::encoding::Context) -> usize {
5104            8
5105        }
5106
5107        #[inline(always)]
5108        fn inline_size(_context: fidl::encoding::Context) -> usize {
5109            16
5110        }
5111    }
5112
5113    unsafe impl
5114        fidl::encoding::Encode<
5115            ElementInfoProviderGetStatusEndpointsResponse,
5116            fidl::encoding::DefaultFuchsiaResourceDialect,
5117        > for &mut ElementInfoProviderGetStatusEndpointsResponse
5118    {
5119        #[inline]
5120        unsafe fn encode(
5121            self,
5122            encoder: &mut fidl::encoding::Encoder<
5123                '_,
5124                fidl::encoding::DefaultFuchsiaResourceDialect,
5125            >,
5126            offset: usize,
5127            _depth: fidl::encoding::Depth,
5128        ) -> fidl::Result<()> {
5129            encoder.debug_check_bounds::<ElementInfoProviderGetStatusEndpointsResponse>(offset);
5130            // Delegate to tuple encoding.
5131            fidl::encoding::Encode::<ElementInfoProviderGetStatusEndpointsResponse, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
5132                (
5133                    <fidl::encoding::UnboundedVector<ElementStatusEndpoint> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.endpoints),
5134                ),
5135                encoder, offset, _depth
5136            )
5137        }
5138    }
5139    unsafe impl<
5140        T0: fidl::encoding::Encode<
5141                fidl::encoding::UnboundedVector<ElementStatusEndpoint>,
5142                fidl::encoding::DefaultFuchsiaResourceDialect,
5143            >,
5144    >
5145        fidl::encoding::Encode<
5146            ElementInfoProviderGetStatusEndpointsResponse,
5147            fidl::encoding::DefaultFuchsiaResourceDialect,
5148        > for (T0,)
5149    {
5150        #[inline]
5151        unsafe fn encode(
5152            self,
5153            encoder: &mut fidl::encoding::Encoder<
5154                '_,
5155                fidl::encoding::DefaultFuchsiaResourceDialect,
5156            >,
5157            offset: usize,
5158            depth: fidl::encoding::Depth,
5159        ) -> fidl::Result<()> {
5160            encoder.debug_check_bounds::<ElementInfoProviderGetStatusEndpointsResponse>(offset);
5161            // Zero out padding regions. There's no need to apply masks
5162            // because the unmasked parts will be overwritten by fields.
5163            // Write the fields.
5164            self.0.encode(encoder, offset + 0, depth)?;
5165            Ok(())
5166        }
5167    }
5168
5169    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
5170        for ElementInfoProviderGetStatusEndpointsResponse
5171    {
5172        #[inline(always)]
5173        fn new_empty() -> Self {
5174            Self {
5175                endpoints: fidl::new_empty!(
5176                    fidl::encoding::UnboundedVector<ElementStatusEndpoint>,
5177                    fidl::encoding::DefaultFuchsiaResourceDialect
5178                ),
5179            }
5180        }
5181
5182        #[inline]
5183        unsafe fn decode(
5184            &mut self,
5185            decoder: &mut fidl::encoding::Decoder<
5186                '_,
5187                fidl::encoding::DefaultFuchsiaResourceDialect,
5188            >,
5189            offset: usize,
5190            _depth: fidl::encoding::Depth,
5191        ) -> fidl::Result<()> {
5192            decoder.debug_check_bounds::<Self>(offset);
5193            // Verify that padding bytes are zero.
5194            fidl::decode!(
5195                fidl::encoding::UnboundedVector<ElementStatusEndpoint>,
5196                fidl::encoding::DefaultFuchsiaResourceDialect,
5197                &mut self.endpoints,
5198                decoder,
5199                offset + 0,
5200                _depth
5201            )?;
5202            Ok(())
5203        }
5204    }
5205
5206    impl fidl::encoding::ResourceTypeMarker for LessorLeaseRequest {
5207        type Borrowed<'a> = &'a mut Self;
5208        fn take_or_borrow<'a>(
5209            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
5210        ) -> Self::Borrowed<'a> {
5211            value
5212        }
5213    }
5214
5215    unsafe impl fidl::encoding::TypeMarker for LessorLeaseRequest {
5216        type Owned = Self;
5217
5218        #[inline(always)]
5219        fn inline_align(_context: fidl::encoding::Context) -> usize {
5220            1
5221        }
5222
5223        #[inline(always)]
5224        fn inline_size(_context: fidl::encoding::Context) -> usize {
5225            1
5226        }
5227        #[inline(always)]
5228        fn encode_is_copy() -> bool {
5229            true
5230        }
5231
5232        #[inline(always)]
5233        fn decode_is_copy() -> bool {
5234            true
5235        }
5236    }
5237
5238    unsafe impl
5239        fidl::encoding::Encode<LessorLeaseRequest, fidl::encoding::DefaultFuchsiaResourceDialect>
5240        for &mut LessorLeaseRequest
5241    {
5242        #[inline]
5243        unsafe fn encode(
5244            self,
5245            encoder: &mut fidl::encoding::Encoder<
5246                '_,
5247                fidl::encoding::DefaultFuchsiaResourceDialect,
5248            >,
5249            offset: usize,
5250            _depth: fidl::encoding::Depth,
5251        ) -> fidl::Result<()> {
5252            encoder.debug_check_bounds::<LessorLeaseRequest>(offset);
5253            unsafe {
5254                // Copy the object into the buffer.
5255                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
5256                (buf_ptr as *mut LessorLeaseRequest)
5257                    .write_unaligned((self as *const LessorLeaseRequest).read());
5258                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
5259                // done second because the memcpy will write garbage to these bytes.
5260            }
5261            Ok(())
5262        }
5263    }
5264    unsafe impl<T0: fidl::encoding::Encode<u8, fidl::encoding::DefaultFuchsiaResourceDialect>>
5265        fidl::encoding::Encode<LessorLeaseRequest, fidl::encoding::DefaultFuchsiaResourceDialect>
5266        for (T0,)
5267    {
5268        #[inline]
5269        unsafe fn encode(
5270            self,
5271            encoder: &mut fidl::encoding::Encoder<
5272                '_,
5273                fidl::encoding::DefaultFuchsiaResourceDialect,
5274            >,
5275            offset: usize,
5276            depth: fidl::encoding::Depth,
5277        ) -> fidl::Result<()> {
5278            encoder.debug_check_bounds::<LessorLeaseRequest>(offset);
5279            // Zero out padding regions. There's no need to apply masks
5280            // because the unmasked parts will be overwritten by fields.
5281            // Write the fields.
5282            self.0.encode(encoder, offset + 0, depth)?;
5283            Ok(())
5284        }
5285    }
5286
5287    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
5288        for LessorLeaseRequest
5289    {
5290        #[inline(always)]
5291        fn new_empty() -> Self {
5292            Self { level: fidl::new_empty!(u8, fidl::encoding::DefaultFuchsiaResourceDialect) }
5293        }
5294
5295        #[inline]
5296        unsafe fn decode(
5297            &mut self,
5298            decoder: &mut fidl::encoding::Decoder<
5299                '_,
5300                fidl::encoding::DefaultFuchsiaResourceDialect,
5301            >,
5302            offset: usize,
5303            _depth: fidl::encoding::Depth,
5304        ) -> fidl::Result<()> {
5305            decoder.debug_check_bounds::<Self>(offset);
5306            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
5307            // Verify that padding bytes are zero.
5308            // Copy from the buffer into the object.
5309            unsafe {
5310                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 1);
5311            }
5312            Ok(())
5313        }
5314    }
5315
5316    impl fidl::encoding::ResourceTypeMarker for LessorLeaseResponse {
5317        type Borrowed<'a> = &'a mut Self;
5318        fn take_or_borrow<'a>(
5319            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
5320        ) -> Self::Borrowed<'a> {
5321            value
5322        }
5323    }
5324
5325    unsafe impl fidl::encoding::TypeMarker for LessorLeaseResponse {
5326        type Owned = Self;
5327
5328        #[inline(always)]
5329        fn inline_align(_context: fidl::encoding::Context) -> usize {
5330            4
5331        }
5332
5333        #[inline(always)]
5334        fn inline_size(_context: fidl::encoding::Context) -> usize {
5335            4
5336        }
5337    }
5338
5339    unsafe impl
5340        fidl::encoding::Encode<LessorLeaseResponse, fidl::encoding::DefaultFuchsiaResourceDialect>
5341        for &mut LessorLeaseResponse
5342    {
5343        #[inline]
5344        unsafe fn encode(
5345            self,
5346            encoder: &mut fidl::encoding::Encoder<
5347                '_,
5348                fidl::encoding::DefaultFuchsiaResourceDialect,
5349            >,
5350            offset: usize,
5351            _depth: fidl::encoding::Depth,
5352        ) -> fidl::Result<()> {
5353            encoder.debug_check_bounds::<LessorLeaseResponse>(offset);
5354            // Delegate to tuple encoding.
5355            fidl::encoding::Encode::<LessorLeaseResponse, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
5356                (
5357                    <fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<LeaseControlMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.lease_control),
5358                ),
5359                encoder, offset, _depth
5360            )
5361        }
5362    }
5363    unsafe impl<
5364        T0: fidl::encoding::Encode<
5365                fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<LeaseControlMarker>>,
5366                fidl::encoding::DefaultFuchsiaResourceDialect,
5367            >,
5368    > fidl::encoding::Encode<LessorLeaseResponse, fidl::encoding::DefaultFuchsiaResourceDialect>
5369        for (T0,)
5370    {
5371        #[inline]
5372        unsafe fn encode(
5373            self,
5374            encoder: &mut fidl::encoding::Encoder<
5375                '_,
5376                fidl::encoding::DefaultFuchsiaResourceDialect,
5377            >,
5378            offset: usize,
5379            depth: fidl::encoding::Depth,
5380        ) -> fidl::Result<()> {
5381            encoder.debug_check_bounds::<LessorLeaseResponse>(offset);
5382            // Zero out padding regions. There's no need to apply masks
5383            // because the unmasked parts will be overwritten by fields.
5384            // Write the fields.
5385            self.0.encode(encoder, offset + 0, depth)?;
5386            Ok(())
5387        }
5388    }
5389
5390    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
5391        for LessorLeaseResponse
5392    {
5393        #[inline(always)]
5394        fn new_empty() -> Self {
5395            Self {
5396                lease_control: fidl::new_empty!(
5397                    fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<LeaseControlMarker>>,
5398                    fidl::encoding::DefaultFuchsiaResourceDialect
5399                ),
5400            }
5401        }
5402
5403        #[inline]
5404        unsafe fn decode(
5405            &mut self,
5406            decoder: &mut fidl::encoding::Decoder<
5407                '_,
5408                fidl::encoding::DefaultFuchsiaResourceDialect,
5409            >,
5410            offset: usize,
5411            _depth: fidl::encoding::Depth,
5412        ) -> fidl::Result<()> {
5413            decoder.debug_check_bounds::<Self>(offset);
5414            // Verify that padding bytes are zero.
5415            fidl::decode!(
5416                fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<LeaseControlMarker>>,
5417                fidl::encoding::DefaultFuchsiaResourceDialect,
5418                &mut self.lease_control,
5419                decoder,
5420                offset + 0,
5421                _depth
5422            )?;
5423            Ok(())
5424        }
5425    }
5426
5427    impl fidl::encoding::ResourceTypeMarker for LevelDependency {
5428        type Borrowed<'a> = &'a mut Self;
5429        fn take_or_borrow<'a>(
5430            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
5431        ) -> Self::Borrowed<'a> {
5432            value
5433        }
5434    }
5435
5436    unsafe impl fidl::encoding::TypeMarker for LevelDependency {
5437        type Owned = Self;
5438
5439        #[inline(always)]
5440        fn inline_align(_context: fidl::encoding::Context) -> usize {
5441            8
5442        }
5443
5444        #[inline(always)]
5445        fn inline_size(_context: fidl::encoding::Context) -> usize {
5446            24
5447        }
5448    }
5449
5450    unsafe impl
5451        fidl::encoding::Encode<LevelDependency, fidl::encoding::DefaultFuchsiaResourceDialect>
5452        for &mut LevelDependency
5453    {
5454        #[inline]
5455        unsafe fn encode(
5456            self,
5457            encoder: &mut fidl::encoding::Encoder<
5458                '_,
5459                fidl::encoding::DefaultFuchsiaResourceDialect,
5460            >,
5461            offset: usize,
5462            _depth: fidl::encoding::Depth,
5463        ) -> fidl::Result<()> {
5464            encoder.debug_check_bounds::<LevelDependency>(offset);
5465            // Delegate to tuple encoding.
5466            fidl::encoding::Encode::<LevelDependency, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
5467                (
5468                    <u8 as fidl::encoding::ValueTypeMarker>::borrow(&self.dependent_level),
5469                    <fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.requires_token),
5470                    <fidl::encoding::Vector<u8, 256> as fidl::encoding::ValueTypeMarker>::borrow(&self.requires_level_by_preference),
5471                ),
5472                encoder, offset, _depth
5473            )
5474        }
5475    }
5476    unsafe impl<
5477        T0: fidl::encoding::Encode<u8, fidl::encoding::DefaultFuchsiaResourceDialect>,
5478        T1: fidl::encoding::Encode<
5479                fidl::encoding::HandleType<
5480                    fidl::Event,
5481                    { fidl::ObjectType::EVENT.into_raw() },
5482                    2147483648,
5483                >,
5484                fidl::encoding::DefaultFuchsiaResourceDialect,
5485            >,
5486        T2: fidl::encoding::Encode<
5487                fidl::encoding::Vector<u8, 256>,
5488                fidl::encoding::DefaultFuchsiaResourceDialect,
5489            >,
5490    > fidl::encoding::Encode<LevelDependency, fidl::encoding::DefaultFuchsiaResourceDialect>
5491        for (T0, T1, T2)
5492    {
5493        #[inline]
5494        unsafe fn encode(
5495            self,
5496            encoder: &mut fidl::encoding::Encoder<
5497                '_,
5498                fidl::encoding::DefaultFuchsiaResourceDialect,
5499            >,
5500            offset: usize,
5501            depth: fidl::encoding::Depth,
5502        ) -> fidl::Result<()> {
5503            encoder.debug_check_bounds::<LevelDependency>(offset);
5504            // Zero out padding regions. There's no need to apply masks
5505            // because the unmasked parts will be overwritten by fields.
5506            unsafe {
5507                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
5508                (ptr as *mut u64).write_unaligned(0);
5509            }
5510            // Write the fields.
5511            self.0.encode(encoder, offset + 0, depth)?;
5512            self.1.encode(encoder, offset + 4, depth)?;
5513            self.2.encode(encoder, offset + 8, depth)?;
5514            Ok(())
5515        }
5516    }
5517
5518    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
5519        for LevelDependency
5520    {
5521        #[inline(always)]
5522        fn new_empty() -> Self {
5523            Self {
5524                dependent_level: fidl::new_empty!(
5525                    u8,
5526                    fidl::encoding::DefaultFuchsiaResourceDialect
5527                ),
5528                requires_token: fidl::new_empty!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
5529                requires_level_by_preference: fidl::new_empty!(fidl::encoding::Vector<u8, 256>, fidl::encoding::DefaultFuchsiaResourceDialect),
5530            }
5531        }
5532
5533        #[inline]
5534        unsafe fn decode(
5535            &mut self,
5536            decoder: &mut fidl::encoding::Decoder<
5537                '_,
5538                fidl::encoding::DefaultFuchsiaResourceDialect,
5539            >,
5540            offset: usize,
5541            _depth: fidl::encoding::Depth,
5542        ) -> fidl::Result<()> {
5543            decoder.debug_check_bounds::<Self>(offset);
5544            // Verify that padding bytes are zero.
5545            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
5546            let padval = unsafe { (ptr as *const u64).read_unaligned() };
5547            let mask = 0xffffff00u64;
5548            let maskedval = padval & mask;
5549            if maskedval != 0 {
5550                return Err(fidl::Error::NonZeroPadding {
5551                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
5552                });
5553            }
5554            fidl::decode!(
5555                u8,
5556                fidl::encoding::DefaultFuchsiaResourceDialect,
5557                &mut self.dependent_level,
5558                decoder,
5559                offset + 0,
5560                _depth
5561            )?;
5562            fidl::decode!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.requires_token, decoder, offset + 4, _depth)?;
5563            fidl::decode!(fidl::encoding::Vector<u8, 256>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.requires_level_by_preference, decoder, offset + 8, _depth)?;
5564            Ok(())
5565        }
5566    }
5567
5568    impl fidl::encoding::ResourceTypeMarker for StatusWatchPowerLevelResponse {
5569        type Borrowed<'a> = &'a mut Self;
5570        fn take_or_borrow<'a>(
5571            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
5572        ) -> Self::Borrowed<'a> {
5573            value
5574        }
5575    }
5576
5577    unsafe impl fidl::encoding::TypeMarker for StatusWatchPowerLevelResponse {
5578        type Owned = Self;
5579
5580        #[inline(always)]
5581        fn inline_align(_context: fidl::encoding::Context) -> usize {
5582            1
5583        }
5584
5585        #[inline(always)]
5586        fn inline_size(_context: fidl::encoding::Context) -> usize {
5587            1
5588        }
5589        #[inline(always)]
5590        fn encode_is_copy() -> bool {
5591            true
5592        }
5593
5594        #[inline(always)]
5595        fn decode_is_copy() -> bool {
5596            true
5597        }
5598    }
5599
5600    unsafe impl
5601        fidl::encoding::Encode<
5602            StatusWatchPowerLevelResponse,
5603            fidl::encoding::DefaultFuchsiaResourceDialect,
5604        > for &mut StatusWatchPowerLevelResponse
5605    {
5606        #[inline]
5607        unsafe fn encode(
5608            self,
5609            encoder: &mut fidl::encoding::Encoder<
5610                '_,
5611                fidl::encoding::DefaultFuchsiaResourceDialect,
5612            >,
5613            offset: usize,
5614            _depth: fidl::encoding::Depth,
5615        ) -> fidl::Result<()> {
5616            encoder.debug_check_bounds::<StatusWatchPowerLevelResponse>(offset);
5617            unsafe {
5618                // Copy the object into the buffer.
5619                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
5620                (buf_ptr as *mut StatusWatchPowerLevelResponse)
5621                    .write_unaligned((self as *const StatusWatchPowerLevelResponse).read());
5622                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
5623                // done second because the memcpy will write garbage to these bytes.
5624            }
5625            Ok(())
5626        }
5627    }
5628    unsafe impl<T0: fidl::encoding::Encode<u8, fidl::encoding::DefaultFuchsiaResourceDialect>>
5629        fidl::encoding::Encode<
5630            StatusWatchPowerLevelResponse,
5631            fidl::encoding::DefaultFuchsiaResourceDialect,
5632        > for (T0,)
5633    {
5634        #[inline]
5635        unsafe fn encode(
5636            self,
5637            encoder: &mut fidl::encoding::Encoder<
5638                '_,
5639                fidl::encoding::DefaultFuchsiaResourceDialect,
5640            >,
5641            offset: usize,
5642            depth: fidl::encoding::Depth,
5643        ) -> fidl::Result<()> {
5644            encoder.debug_check_bounds::<StatusWatchPowerLevelResponse>(offset);
5645            // Zero out padding regions. There's no need to apply masks
5646            // because the unmasked parts will be overwritten by fields.
5647            // Write the fields.
5648            self.0.encode(encoder, offset + 0, depth)?;
5649            Ok(())
5650        }
5651    }
5652
5653    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
5654        for StatusWatchPowerLevelResponse
5655    {
5656        #[inline(always)]
5657        fn new_empty() -> Self {
5658            Self {
5659                current_level: fidl::new_empty!(u8, fidl::encoding::DefaultFuchsiaResourceDialect),
5660            }
5661        }
5662
5663        #[inline]
5664        unsafe fn decode(
5665            &mut self,
5666            decoder: &mut fidl::encoding::Decoder<
5667                '_,
5668                fidl::encoding::DefaultFuchsiaResourceDialect,
5669            >,
5670            offset: usize,
5671            _depth: fidl::encoding::Depth,
5672        ) -> fidl::Result<()> {
5673            decoder.debug_check_bounds::<Self>(offset);
5674            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
5675            // Verify that padding bytes are zero.
5676            // Copy from the buffer into the object.
5677            unsafe {
5678                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 1);
5679            }
5680            Ok(())
5681        }
5682    }
5683
5684    impl ElementSchema {
5685        #[inline(always)]
5686        fn max_ordinal_present(&self) -> u64 {
5687            if let Some(_) = self.element_runner {
5688                return 10;
5689            }
5690            if let Some(_) = self.element_control {
5691                return 9;
5692            }
5693            if let Some(_) = self.lessor_channel {
5694                return 8;
5695            }
5696            if let Some(_) = self.dependencies {
5697                return 4;
5698            }
5699            if let Some(_) = self.valid_levels {
5700                return 3;
5701            }
5702            if let Some(_) = self.initial_current_level {
5703                return 2;
5704            }
5705            if let Some(_) = self.element_name {
5706                return 1;
5707            }
5708            0
5709        }
5710    }
5711
5712    impl fidl::encoding::ResourceTypeMarker for ElementSchema {
5713        type Borrowed<'a> = &'a mut Self;
5714        fn take_or_borrow<'a>(
5715            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
5716        ) -> Self::Borrowed<'a> {
5717            value
5718        }
5719    }
5720
5721    unsafe impl fidl::encoding::TypeMarker for ElementSchema {
5722        type Owned = Self;
5723
5724        #[inline(always)]
5725        fn inline_align(_context: fidl::encoding::Context) -> usize {
5726            8
5727        }
5728
5729        #[inline(always)]
5730        fn inline_size(_context: fidl::encoding::Context) -> usize {
5731            16
5732        }
5733    }
5734
5735    unsafe impl fidl::encoding::Encode<ElementSchema, fidl::encoding::DefaultFuchsiaResourceDialect>
5736        for &mut ElementSchema
5737    {
5738        unsafe fn encode(
5739            self,
5740            encoder: &mut fidl::encoding::Encoder<
5741                '_,
5742                fidl::encoding::DefaultFuchsiaResourceDialect,
5743            >,
5744            offset: usize,
5745            mut depth: fidl::encoding::Depth,
5746        ) -> fidl::Result<()> {
5747            encoder.debug_check_bounds::<ElementSchema>(offset);
5748            // Vector header
5749            let max_ordinal: u64 = self.max_ordinal_present();
5750            encoder.write_num(max_ordinal, offset);
5751            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
5752            // Calling encoder.out_of_line_offset(0) is not allowed.
5753            if max_ordinal == 0 {
5754                return Ok(());
5755            }
5756            depth.increment()?;
5757            let envelope_size = 8;
5758            let bytes_len = max_ordinal as usize * envelope_size;
5759            #[allow(unused_variables)]
5760            let offset = encoder.out_of_line_offset(bytes_len);
5761            let mut _prev_end_offset: usize = 0;
5762            if 1 > max_ordinal {
5763                return Ok(());
5764            }
5765
5766            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5767            // are envelope_size bytes.
5768            let cur_offset: usize = (1 - 1) * envelope_size;
5769
5770            // Zero reserved fields.
5771            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5772
5773            // Safety:
5774            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5775            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5776            //   envelope_size bytes, there is always sufficient room.
5777            fidl::encoding::encode_in_envelope_optional::<
5778                fidl::encoding::BoundedString<64>,
5779                fidl::encoding::DefaultFuchsiaResourceDialect,
5780            >(
5781                self.element_name.as_ref().map(
5782                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
5783                ),
5784                encoder,
5785                offset + cur_offset,
5786                depth,
5787            )?;
5788
5789            _prev_end_offset = cur_offset + envelope_size;
5790            if 2 > max_ordinal {
5791                return Ok(());
5792            }
5793
5794            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5795            // are envelope_size bytes.
5796            let cur_offset: usize = (2 - 1) * envelope_size;
5797
5798            // Zero reserved fields.
5799            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5800
5801            // Safety:
5802            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5803            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5804            //   envelope_size bytes, there is always sufficient room.
5805            fidl::encoding::encode_in_envelope_optional::<
5806                u8,
5807                fidl::encoding::DefaultFuchsiaResourceDialect,
5808            >(
5809                self.initial_current_level
5810                    .as_ref()
5811                    .map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
5812                encoder,
5813                offset + cur_offset,
5814                depth,
5815            )?;
5816
5817            _prev_end_offset = cur_offset + envelope_size;
5818            if 3 > max_ordinal {
5819                return Ok(());
5820            }
5821
5822            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5823            // are envelope_size bytes.
5824            let cur_offset: usize = (3 - 1) * envelope_size;
5825
5826            // Zero reserved fields.
5827            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5828
5829            // Safety:
5830            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5831            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5832            //   envelope_size bytes, there is always sufficient room.
5833            fidl::encoding::encode_in_envelope_optional::<
5834                fidl::encoding::Vector<u8, 256>,
5835                fidl::encoding::DefaultFuchsiaResourceDialect,
5836            >(
5837                self.valid_levels.as_ref().map(
5838                    <fidl::encoding::Vector<u8, 256> as fidl::encoding::ValueTypeMarker>::borrow,
5839                ),
5840                encoder,
5841                offset + cur_offset,
5842                depth,
5843            )?;
5844
5845            _prev_end_offset = cur_offset + envelope_size;
5846            if 4 > max_ordinal {
5847                return Ok(());
5848            }
5849
5850            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5851            // are envelope_size bytes.
5852            let cur_offset: usize = (4 - 1) * envelope_size;
5853
5854            // Zero reserved fields.
5855            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5856
5857            // Safety:
5858            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5859            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5860            //   envelope_size bytes, there is always sufficient room.
5861            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<LevelDependency, 128>, fidl::encoding::DefaultFuchsiaResourceDialect>(
5862            self.dependencies.as_mut().map(<fidl::encoding::Vector<LevelDependency, 128> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
5863            encoder, offset + cur_offset, depth
5864        )?;
5865
5866            _prev_end_offset = cur_offset + envelope_size;
5867            if 8 > max_ordinal {
5868                return Ok(());
5869            }
5870
5871            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5872            // are envelope_size bytes.
5873            let cur_offset: usize = (8 - 1) * envelope_size;
5874
5875            // Zero reserved fields.
5876            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5877
5878            // Safety:
5879            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5880            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5881            //   envelope_size bytes, there is always sufficient room.
5882            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<LessorMarker>>, fidl::encoding::DefaultFuchsiaResourceDialect>(
5883            self.lessor_channel.as_mut().map(<fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<LessorMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
5884            encoder, offset + cur_offset, depth
5885        )?;
5886
5887            _prev_end_offset = cur_offset + envelope_size;
5888            if 9 > max_ordinal {
5889                return Ok(());
5890            }
5891
5892            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5893            // are envelope_size bytes.
5894            let cur_offset: usize = (9 - 1) * envelope_size;
5895
5896            // Zero reserved fields.
5897            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5898
5899            // Safety:
5900            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5901            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5902            //   envelope_size bytes, there is always sufficient room.
5903            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<ElementControlMarker>>, fidl::encoding::DefaultFuchsiaResourceDialect>(
5904            self.element_control.as_mut().map(<fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<ElementControlMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
5905            encoder, offset + cur_offset, depth
5906        )?;
5907
5908            _prev_end_offset = cur_offset + envelope_size;
5909            if 10 > max_ordinal {
5910                return Ok(());
5911            }
5912
5913            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5914            // are envelope_size bytes.
5915            let cur_offset: usize = (10 - 1) * envelope_size;
5916
5917            // Zero reserved fields.
5918            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5919
5920            // Safety:
5921            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5922            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5923            //   envelope_size bytes, there is always sufficient room.
5924            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<ElementRunnerMarker>>, fidl::encoding::DefaultFuchsiaResourceDialect>(
5925            self.element_runner.as_mut().map(<fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<ElementRunnerMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
5926            encoder, offset + cur_offset, depth
5927        )?;
5928
5929            _prev_end_offset = cur_offset + envelope_size;
5930
5931            Ok(())
5932        }
5933    }
5934
5935    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for ElementSchema {
5936        #[inline(always)]
5937        fn new_empty() -> Self {
5938            Self::default()
5939        }
5940
5941        unsafe fn decode(
5942            &mut self,
5943            decoder: &mut fidl::encoding::Decoder<
5944                '_,
5945                fidl::encoding::DefaultFuchsiaResourceDialect,
5946            >,
5947            offset: usize,
5948            mut depth: fidl::encoding::Depth,
5949        ) -> fidl::Result<()> {
5950            decoder.debug_check_bounds::<Self>(offset);
5951            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
5952                None => return Err(fidl::Error::NotNullable),
5953                Some(len) => len,
5954            };
5955            // Calling decoder.out_of_line_offset(0) is not allowed.
5956            if len == 0 {
5957                return Ok(());
5958            };
5959            depth.increment()?;
5960            let envelope_size = 8;
5961            let bytes_len = len * envelope_size;
5962            let offset = decoder.out_of_line_offset(bytes_len)?;
5963            // Decode the envelope for each type.
5964            let mut _next_ordinal_to_read = 0;
5965            let mut next_offset = offset;
5966            let end_offset = offset + bytes_len;
5967            _next_ordinal_to_read += 1;
5968            if next_offset >= end_offset {
5969                return Ok(());
5970            }
5971
5972            // Decode unknown envelopes for gaps in ordinals.
5973            while _next_ordinal_to_read < 1 {
5974                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5975                _next_ordinal_to_read += 1;
5976                next_offset += envelope_size;
5977            }
5978
5979            let next_out_of_line = decoder.next_out_of_line();
5980            let handles_before = decoder.remaining_handles();
5981            if let Some((inlined, num_bytes, num_handles)) =
5982                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5983            {
5984                let member_inline_size =
5985                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
5986                        decoder.context,
5987                    );
5988                if inlined != (member_inline_size <= 4) {
5989                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5990                }
5991                let inner_offset;
5992                let mut inner_depth = depth.clone();
5993                if inlined {
5994                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5995                    inner_offset = next_offset;
5996                } else {
5997                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5998                    inner_depth.increment()?;
5999                }
6000                let val_ref = self.element_name.get_or_insert_with(|| {
6001                    fidl::new_empty!(
6002                        fidl::encoding::BoundedString<64>,
6003                        fidl::encoding::DefaultFuchsiaResourceDialect
6004                    )
6005                });
6006                fidl::decode!(
6007                    fidl::encoding::BoundedString<64>,
6008                    fidl::encoding::DefaultFuchsiaResourceDialect,
6009                    val_ref,
6010                    decoder,
6011                    inner_offset,
6012                    inner_depth
6013                )?;
6014                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6015                {
6016                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6017                }
6018                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6019                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6020                }
6021            }
6022
6023            next_offset += envelope_size;
6024            _next_ordinal_to_read += 1;
6025            if next_offset >= end_offset {
6026                return Ok(());
6027            }
6028
6029            // Decode unknown envelopes for gaps in ordinals.
6030            while _next_ordinal_to_read < 2 {
6031                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6032                _next_ordinal_to_read += 1;
6033                next_offset += envelope_size;
6034            }
6035
6036            let next_out_of_line = decoder.next_out_of_line();
6037            let handles_before = decoder.remaining_handles();
6038            if let Some((inlined, num_bytes, num_handles)) =
6039                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6040            {
6041                let member_inline_size =
6042                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
6043                if inlined != (member_inline_size <= 4) {
6044                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6045                }
6046                let inner_offset;
6047                let mut inner_depth = depth.clone();
6048                if inlined {
6049                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6050                    inner_offset = next_offset;
6051                } else {
6052                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6053                    inner_depth.increment()?;
6054                }
6055                let val_ref = self.initial_current_level.get_or_insert_with(|| {
6056                    fidl::new_empty!(u8, fidl::encoding::DefaultFuchsiaResourceDialect)
6057                });
6058                fidl::decode!(
6059                    u8,
6060                    fidl::encoding::DefaultFuchsiaResourceDialect,
6061                    val_ref,
6062                    decoder,
6063                    inner_offset,
6064                    inner_depth
6065                )?;
6066                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6067                {
6068                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6069                }
6070                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6071                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6072                }
6073            }
6074
6075            next_offset += envelope_size;
6076            _next_ordinal_to_read += 1;
6077            if next_offset >= end_offset {
6078                return Ok(());
6079            }
6080
6081            // Decode unknown envelopes for gaps in ordinals.
6082            while _next_ordinal_to_read < 3 {
6083                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6084                _next_ordinal_to_read += 1;
6085                next_offset += envelope_size;
6086            }
6087
6088            let next_out_of_line = decoder.next_out_of_line();
6089            let handles_before = decoder.remaining_handles();
6090            if let Some((inlined, num_bytes, num_handles)) =
6091                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6092            {
6093                let member_inline_size =
6094                    <fidl::encoding::Vector<u8, 256> as fidl::encoding::TypeMarker>::inline_size(
6095                        decoder.context,
6096                    );
6097                if inlined != (member_inline_size <= 4) {
6098                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6099                }
6100                let inner_offset;
6101                let mut inner_depth = depth.clone();
6102                if inlined {
6103                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6104                    inner_offset = next_offset;
6105                } else {
6106                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6107                    inner_depth.increment()?;
6108                }
6109                let val_ref =
6110                self.valid_levels.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u8, 256>, fidl::encoding::DefaultFuchsiaResourceDialect));
6111                fidl::decode!(fidl::encoding::Vector<u8, 256>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
6112                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6113                {
6114                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6115                }
6116                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6117                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6118                }
6119            }
6120
6121            next_offset += envelope_size;
6122            _next_ordinal_to_read += 1;
6123            if next_offset >= end_offset {
6124                return Ok(());
6125            }
6126
6127            // Decode unknown envelopes for gaps in ordinals.
6128            while _next_ordinal_to_read < 4 {
6129                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6130                _next_ordinal_to_read += 1;
6131                next_offset += envelope_size;
6132            }
6133
6134            let next_out_of_line = decoder.next_out_of_line();
6135            let handles_before = decoder.remaining_handles();
6136            if let Some((inlined, num_bytes, num_handles)) =
6137                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6138            {
6139                let member_inline_size = <fidl::encoding::Vector<LevelDependency, 128> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
6140                if inlined != (member_inline_size <= 4) {
6141                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6142                }
6143                let inner_offset;
6144                let mut inner_depth = depth.clone();
6145                if inlined {
6146                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6147                    inner_offset = next_offset;
6148                } else {
6149                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6150                    inner_depth.increment()?;
6151                }
6152                let val_ref =
6153                self.dependencies.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<LevelDependency, 128>, fidl::encoding::DefaultFuchsiaResourceDialect));
6154                fidl::decode!(fidl::encoding::Vector<LevelDependency, 128>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
6155                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6156                {
6157                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6158                }
6159                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6160                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6161                }
6162            }
6163
6164            next_offset += envelope_size;
6165            _next_ordinal_to_read += 1;
6166            if next_offset >= end_offset {
6167                return Ok(());
6168            }
6169
6170            // Decode unknown envelopes for gaps in ordinals.
6171            while _next_ordinal_to_read < 8 {
6172                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6173                _next_ordinal_to_read += 1;
6174                next_offset += envelope_size;
6175            }
6176
6177            let next_out_of_line = decoder.next_out_of_line();
6178            let handles_before = decoder.remaining_handles();
6179            if let Some((inlined, num_bytes, num_handles)) =
6180                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6181            {
6182                let member_inline_size = <fidl::encoding::Endpoint<
6183                    fidl::endpoints::ServerEnd<LessorMarker>,
6184                > as fidl::encoding::TypeMarker>::inline_size(
6185                    decoder.context
6186                );
6187                if inlined != (member_inline_size <= 4) {
6188                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6189                }
6190                let inner_offset;
6191                let mut inner_depth = depth.clone();
6192                if inlined {
6193                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6194                    inner_offset = next_offset;
6195                } else {
6196                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6197                    inner_depth.increment()?;
6198                }
6199                let val_ref = self.lessor_channel.get_or_insert_with(|| {
6200                    fidl::new_empty!(
6201                        fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<LessorMarker>>,
6202                        fidl::encoding::DefaultFuchsiaResourceDialect
6203                    )
6204                });
6205                fidl::decode!(
6206                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<LessorMarker>>,
6207                    fidl::encoding::DefaultFuchsiaResourceDialect,
6208                    val_ref,
6209                    decoder,
6210                    inner_offset,
6211                    inner_depth
6212                )?;
6213                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6214                {
6215                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6216                }
6217                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6218                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6219                }
6220            }
6221
6222            next_offset += envelope_size;
6223            _next_ordinal_to_read += 1;
6224            if next_offset >= end_offset {
6225                return Ok(());
6226            }
6227
6228            // Decode unknown envelopes for gaps in ordinals.
6229            while _next_ordinal_to_read < 9 {
6230                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6231                _next_ordinal_to_read += 1;
6232                next_offset += envelope_size;
6233            }
6234
6235            let next_out_of_line = decoder.next_out_of_line();
6236            let handles_before = decoder.remaining_handles();
6237            if let Some((inlined, num_bytes, num_handles)) =
6238                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6239            {
6240                let member_inline_size = <fidl::encoding::Endpoint<
6241                    fidl::endpoints::ServerEnd<ElementControlMarker>,
6242                > as fidl::encoding::TypeMarker>::inline_size(
6243                    decoder.context
6244                );
6245                if inlined != (member_inline_size <= 4) {
6246                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6247                }
6248                let inner_offset;
6249                let mut inner_depth = depth.clone();
6250                if inlined {
6251                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6252                    inner_offset = next_offset;
6253                } else {
6254                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6255                    inner_depth.increment()?;
6256                }
6257                let val_ref = self.element_control.get_or_insert_with(|| {
6258                    fidl::new_empty!(
6259                        fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<ElementControlMarker>>,
6260                        fidl::encoding::DefaultFuchsiaResourceDialect
6261                    )
6262                });
6263                fidl::decode!(
6264                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<ElementControlMarker>>,
6265                    fidl::encoding::DefaultFuchsiaResourceDialect,
6266                    val_ref,
6267                    decoder,
6268                    inner_offset,
6269                    inner_depth
6270                )?;
6271                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6272                {
6273                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6274                }
6275                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6276                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6277                }
6278            }
6279
6280            next_offset += envelope_size;
6281            _next_ordinal_to_read += 1;
6282            if next_offset >= end_offset {
6283                return Ok(());
6284            }
6285
6286            // Decode unknown envelopes for gaps in ordinals.
6287            while _next_ordinal_to_read < 10 {
6288                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6289                _next_ordinal_to_read += 1;
6290                next_offset += envelope_size;
6291            }
6292
6293            let next_out_of_line = decoder.next_out_of_line();
6294            let handles_before = decoder.remaining_handles();
6295            if let Some((inlined, num_bytes, num_handles)) =
6296                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6297            {
6298                let member_inline_size = <fidl::encoding::Endpoint<
6299                    fidl::endpoints::ClientEnd<ElementRunnerMarker>,
6300                > as fidl::encoding::TypeMarker>::inline_size(
6301                    decoder.context
6302                );
6303                if inlined != (member_inline_size <= 4) {
6304                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6305                }
6306                let inner_offset;
6307                let mut inner_depth = depth.clone();
6308                if inlined {
6309                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6310                    inner_offset = next_offset;
6311                } else {
6312                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6313                    inner_depth.increment()?;
6314                }
6315                let val_ref = self.element_runner.get_or_insert_with(|| {
6316                    fidl::new_empty!(
6317                        fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<ElementRunnerMarker>>,
6318                        fidl::encoding::DefaultFuchsiaResourceDialect
6319                    )
6320                });
6321                fidl::decode!(
6322                    fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<ElementRunnerMarker>>,
6323                    fidl::encoding::DefaultFuchsiaResourceDialect,
6324                    val_ref,
6325                    decoder,
6326                    inner_offset,
6327                    inner_depth
6328                )?;
6329                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6330                {
6331                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6332                }
6333                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6334                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6335                }
6336            }
6337
6338            next_offset += envelope_size;
6339
6340            // Decode the remaining unknown envelopes.
6341            while next_offset < end_offset {
6342                _next_ordinal_to_read += 1;
6343                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6344                next_offset += envelope_size;
6345            }
6346
6347            Ok(())
6348        }
6349    }
6350
6351    impl ElementStatusEndpoint {
6352        #[inline(always)]
6353        fn max_ordinal_present(&self) -> u64 {
6354            if let Some(_) = self.status {
6355                return 2;
6356            }
6357            if let Some(_) = self.identifier {
6358                return 1;
6359            }
6360            0
6361        }
6362    }
6363
6364    impl fidl::encoding::ResourceTypeMarker for ElementStatusEndpoint {
6365        type Borrowed<'a> = &'a mut Self;
6366        fn take_or_borrow<'a>(
6367            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
6368        ) -> Self::Borrowed<'a> {
6369            value
6370        }
6371    }
6372
6373    unsafe impl fidl::encoding::TypeMarker for ElementStatusEndpoint {
6374        type Owned = Self;
6375
6376        #[inline(always)]
6377        fn inline_align(_context: fidl::encoding::Context) -> usize {
6378            8
6379        }
6380
6381        #[inline(always)]
6382        fn inline_size(_context: fidl::encoding::Context) -> usize {
6383            16
6384        }
6385    }
6386
6387    unsafe impl
6388        fidl::encoding::Encode<ElementStatusEndpoint, fidl::encoding::DefaultFuchsiaResourceDialect>
6389        for &mut ElementStatusEndpoint
6390    {
6391        unsafe fn encode(
6392            self,
6393            encoder: &mut fidl::encoding::Encoder<
6394                '_,
6395                fidl::encoding::DefaultFuchsiaResourceDialect,
6396            >,
6397            offset: usize,
6398            mut depth: fidl::encoding::Depth,
6399        ) -> fidl::Result<()> {
6400            encoder.debug_check_bounds::<ElementStatusEndpoint>(offset);
6401            // Vector header
6402            let max_ordinal: u64 = self.max_ordinal_present();
6403            encoder.write_num(max_ordinal, offset);
6404            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
6405            // Calling encoder.out_of_line_offset(0) is not allowed.
6406            if max_ordinal == 0 {
6407                return Ok(());
6408            }
6409            depth.increment()?;
6410            let envelope_size = 8;
6411            let bytes_len = max_ordinal as usize * envelope_size;
6412            #[allow(unused_variables)]
6413            let offset = encoder.out_of_line_offset(bytes_len);
6414            let mut _prev_end_offset: usize = 0;
6415            if 1 > max_ordinal {
6416                return Ok(());
6417            }
6418
6419            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
6420            // are envelope_size bytes.
6421            let cur_offset: usize = (1 - 1) * envelope_size;
6422
6423            // Zero reserved fields.
6424            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
6425
6426            // Safety:
6427            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
6428            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
6429            //   envelope_size bytes, there is always sufficient room.
6430            fidl::encoding::encode_in_envelope_optional::<
6431                fidl::encoding::BoundedString<64>,
6432                fidl::encoding::DefaultFuchsiaResourceDialect,
6433            >(
6434                self.identifier.as_ref().map(
6435                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
6436                ),
6437                encoder,
6438                offset + cur_offset,
6439                depth,
6440            )?;
6441
6442            _prev_end_offset = cur_offset + envelope_size;
6443            if 2 > max_ordinal {
6444                return Ok(());
6445            }
6446
6447            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
6448            // are envelope_size bytes.
6449            let cur_offset: usize = (2 - 1) * envelope_size;
6450
6451            // Zero reserved fields.
6452            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
6453
6454            // Safety:
6455            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
6456            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
6457            //   envelope_size bytes, there is always sufficient room.
6458            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<StatusMarker>>, fidl::encoding::DefaultFuchsiaResourceDialect>(
6459            self.status.as_mut().map(<fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<StatusMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
6460            encoder, offset + cur_offset, depth
6461        )?;
6462
6463            _prev_end_offset = cur_offset + envelope_size;
6464
6465            Ok(())
6466        }
6467    }
6468
6469    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
6470        for ElementStatusEndpoint
6471    {
6472        #[inline(always)]
6473        fn new_empty() -> Self {
6474            Self::default()
6475        }
6476
6477        unsafe fn decode(
6478            &mut self,
6479            decoder: &mut fidl::encoding::Decoder<
6480                '_,
6481                fidl::encoding::DefaultFuchsiaResourceDialect,
6482            >,
6483            offset: usize,
6484            mut depth: fidl::encoding::Depth,
6485        ) -> fidl::Result<()> {
6486            decoder.debug_check_bounds::<Self>(offset);
6487            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
6488                None => return Err(fidl::Error::NotNullable),
6489                Some(len) => len,
6490            };
6491            // Calling decoder.out_of_line_offset(0) is not allowed.
6492            if len == 0 {
6493                return Ok(());
6494            };
6495            depth.increment()?;
6496            let envelope_size = 8;
6497            let bytes_len = len * envelope_size;
6498            let offset = decoder.out_of_line_offset(bytes_len)?;
6499            // Decode the envelope for each type.
6500            let mut _next_ordinal_to_read = 0;
6501            let mut next_offset = offset;
6502            let end_offset = offset + bytes_len;
6503            _next_ordinal_to_read += 1;
6504            if next_offset >= end_offset {
6505                return Ok(());
6506            }
6507
6508            // Decode unknown envelopes for gaps in ordinals.
6509            while _next_ordinal_to_read < 1 {
6510                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6511                _next_ordinal_to_read += 1;
6512                next_offset += envelope_size;
6513            }
6514
6515            let next_out_of_line = decoder.next_out_of_line();
6516            let handles_before = decoder.remaining_handles();
6517            if let Some((inlined, num_bytes, num_handles)) =
6518                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6519            {
6520                let member_inline_size =
6521                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
6522                        decoder.context,
6523                    );
6524                if inlined != (member_inline_size <= 4) {
6525                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6526                }
6527                let inner_offset;
6528                let mut inner_depth = depth.clone();
6529                if inlined {
6530                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6531                    inner_offset = next_offset;
6532                } else {
6533                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6534                    inner_depth.increment()?;
6535                }
6536                let val_ref = self.identifier.get_or_insert_with(|| {
6537                    fidl::new_empty!(
6538                        fidl::encoding::BoundedString<64>,
6539                        fidl::encoding::DefaultFuchsiaResourceDialect
6540                    )
6541                });
6542                fidl::decode!(
6543                    fidl::encoding::BoundedString<64>,
6544                    fidl::encoding::DefaultFuchsiaResourceDialect,
6545                    val_ref,
6546                    decoder,
6547                    inner_offset,
6548                    inner_depth
6549                )?;
6550                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6551                {
6552                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6553                }
6554                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6555                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6556                }
6557            }
6558
6559            next_offset += envelope_size;
6560            _next_ordinal_to_read += 1;
6561            if next_offset >= end_offset {
6562                return Ok(());
6563            }
6564
6565            // Decode unknown envelopes for gaps in ordinals.
6566            while _next_ordinal_to_read < 2 {
6567                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6568                _next_ordinal_to_read += 1;
6569                next_offset += envelope_size;
6570            }
6571
6572            let next_out_of_line = decoder.next_out_of_line();
6573            let handles_before = decoder.remaining_handles();
6574            if let Some((inlined, num_bytes, num_handles)) =
6575                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6576            {
6577                let member_inline_size = <fidl::encoding::Endpoint<
6578                    fidl::endpoints::ClientEnd<StatusMarker>,
6579                > as fidl::encoding::TypeMarker>::inline_size(
6580                    decoder.context
6581                );
6582                if inlined != (member_inline_size <= 4) {
6583                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6584                }
6585                let inner_offset;
6586                let mut inner_depth = depth.clone();
6587                if inlined {
6588                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6589                    inner_offset = next_offset;
6590                } else {
6591                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6592                    inner_depth.increment()?;
6593                }
6594                let val_ref = self.status.get_or_insert_with(|| {
6595                    fidl::new_empty!(
6596                        fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<StatusMarker>>,
6597                        fidl::encoding::DefaultFuchsiaResourceDialect
6598                    )
6599                });
6600                fidl::decode!(
6601                    fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<StatusMarker>>,
6602                    fidl::encoding::DefaultFuchsiaResourceDialect,
6603                    val_ref,
6604                    decoder,
6605                    inner_offset,
6606                    inner_depth
6607                )?;
6608                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6609                {
6610                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6611                }
6612                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6613                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6614                }
6615            }
6616
6617            next_offset += envelope_size;
6618
6619            // Decode the remaining unknown envelopes.
6620            while next_offset < end_offset {
6621                _next_ordinal_to_read += 1;
6622                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6623                next_offset += envelope_size;
6624            }
6625
6626            Ok(())
6627        }
6628    }
6629
6630    impl LeaseDependency {
6631        #[inline(always)]
6632        fn max_ordinal_present(&self) -> u64 {
6633            if let Some(_) = self.requires_level_by_preference {
6634                return 3;
6635            }
6636            if let Some(_) = self.requires_level {
6637                return 2;
6638            }
6639            if let Some(_) = self.requires_token {
6640                return 1;
6641            }
6642            0
6643        }
6644    }
6645
6646    impl fidl::encoding::ResourceTypeMarker for LeaseDependency {
6647        type Borrowed<'a> = &'a mut Self;
6648        fn take_or_borrow<'a>(
6649            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
6650        ) -> Self::Borrowed<'a> {
6651            value
6652        }
6653    }
6654
6655    unsafe impl fidl::encoding::TypeMarker for LeaseDependency {
6656        type Owned = Self;
6657
6658        #[inline(always)]
6659        fn inline_align(_context: fidl::encoding::Context) -> usize {
6660            8
6661        }
6662
6663        #[inline(always)]
6664        fn inline_size(_context: fidl::encoding::Context) -> usize {
6665            16
6666        }
6667    }
6668
6669    unsafe impl
6670        fidl::encoding::Encode<LeaseDependency, fidl::encoding::DefaultFuchsiaResourceDialect>
6671        for &mut LeaseDependency
6672    {
6673        unsafe fn encode(
6674            self,
6675            encoder: &mut fidl::encoding::Encoder<
6676                '_,
6677                fidl::encoding::DefaultFuchsiaResourceDialect,
6678            >,
6679            offset: usize,
6680            mut depth: fidl::encoding::Depth,
6681        ) -> fidl::Result<()> {
6682            encoder.debug_check_bounds::<LeaseDependency>(offset);
6683            // Vector header
6684            let max_ordinal: u64 = self.max_ordinal_present();
6685            encoder.write_num(max_ordinal, offset);
6686            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
6687            // Calling encoder.out_of_line_offset(0) is not allowed.
6688            if max_ordinal == 0 {
6689                return Ok(());
6690            }
6691            depth.increment()?;
6692            let envelope_size = 8;
6693            let bytes_len = max_ordinal as usize * envelope_size;
6694            #[allow(unused_variables)]
6695            let offset = encoder.out_of_line_offset(bytes_len);
6696            let mut _prev_end_offset: usize = 0;
6697            if 1 > max_ordinal {
6698                return Ok(());
6699            }
6700
6701            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
6702            // are envelope_size bytes.
6703            let cur_offset: usize = (1 - 1) * envelope_size;
6704
6705            // Zero reserved fields.
6706            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
6707
6708            // Safety:
6709            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
6710            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
6711            //   envelope_size bytes, there is always sufficient room.
6712            fidl::encoding::encode_in_envelope_optional::<
6713                fidl::encoding::HandleType<
6714                    fidl::Event,
6715                    { fidl::ObjectType::EVENT.into_raw() },
6716                    2147483648,
6717                >,
6718                fidl::encoding::DefaultFuchsiaResourceDialect,
6719            >(
6720                self.requires_token.as_mut().map(
6721                    <fidl::encoding::HandleType<
6722                        fidl::Event,
6723                        { fidl::ObjectType::EVENT.into_raw() },
6724                        2147483648,
6725                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
6726                ),
6727                encoder,
6728                offset + cur_offset,
6729                depth,
6730            )?;
6731
6732            _prev_end_offset = cur_offset + envelope_size;
6733            if 2 > max_ordinal {
6734                return Ok(());
6735            }
6736
6737            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
6738            // are envelope_size bytes.
6739            let cur_offset: usize = (2 - 1) * envelope_size;
6740
6741            // Zero reserved fields.
6742            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
6743
6744            // Safety:
6745            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
6746            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
6747            //   envelope_size bytes, there is always sufficient room.
6748            fidl::encoding::encode_in_envelope_optional::<
6749                u8,
6750                fidl::encoding::DefaultFuchsiaResourceDialect,
6751            >(
6752                self.requires_level.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
6753                encoder,
6754                offset + cur_offset,
6755                depth,
6756            )?;
6757
6758            _prev_end_offset = cur_offset + envelope_size;
6759            if 3 > max_ordinal {
6760                return Ok(());
6761            }
6762
6763            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
6764            // are envelope_size bytes.
6765            let cur_offset: usize = (3 - 1) * envelope_size;
6766
6767            // Zero reserved fields.
6768            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
6769
6770            // Safety:
6771            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
6772            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
6773            //   envelope_size bytes, there is always sufficient room.
6774            fidl::encoding::encode_in_envelope_optional::<
6775                fidl::encoding::Vector<u8, 256>,
6776                fidl::encoding::DefaultFuchsiaResourceDialect,
6777            >(
6778                self.requires_level_by_preference.as_ref().map(
6779                    <fidl::encoding::Vector<u8, 256> as fidl::encoding::ValueTypeMarker>::borrow,
6780                ),
6781                encoder,
6782                offset + cur_offset,
6783                depth,
6784            )?;
6785
6786            _prev_end_offset = cur_offset + envelope_size;
6787
6788            Ok(())
6789        }
6790    }
6791
6792    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
6793        for LeaseDependency
6794    {
6795        #[inline(always)]
6796        fn new_empty() -> Self {
6797            Self::default()
6798        }
6799
6800        unsafe fn decode(
6801            &mut self,
6802            decoder: &mut fidl::encoding::Decoder<
6803                '_,
6804                fidl::encoding::DefaultFuchsiaResourceDialect,
6805            >,
6806            offset: usize,
6807            mut depth: fidl::encoding::Depth,
6808        ) -> fidl::Result<()> {
6809            decoder.debug_check_bounds::<Self>(offset);
6810            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
6811                None => return Err(fidl::Error::NotNullable),
6812                Some(len) => len,
6813            };
6814            // Calling decoder.out_of_line_offset(0) is not allowed.
6815            if len == 0 {
6816                return Ok(());
6817            };
6818            depth.increment()?;
6819            let envelope_size = 8;
6820            let bytes_len = len * envelope_size;
6821            let offset = decoder.out_of_line_offset(bytes_len)?;
6822            // Decode the envelope for each type.
6823            let mut _next_ordinal_to_read = 0;
6824            let mut next_offset = offset;
6825            let end_offset = offset + bytes_len;
6826            _next_ordinal_to_read += 1;
6827            if next_offset >= end_offset {
6828                return Ok(());
6829            }
6830
6831            // Decode unknown envelopes for gaps in ordinals.
6832            while _next_ordinal_to_read < 1 {
6833                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6834                _next_ordinal_to_read += 1;
6835                next_offset += envelope_size;
6836            }
6837
6838            let next_out_of_line = decoder.next_out_of_line();
6839            let handles_before = decoder.remaining_handles();
6840            if let Some((inlined, num_bytes, num_handles)) =
6841                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6842            {
6843                let member_inline_size = <fidl::encoding::HandleType<
6844                    fidl::Event,
6845                    { fidl::ObjectType::EVENT.into_raw() },
6846                    2147483648,
6847                > as fidl::encoding::TypeMarker>::inline_size(
6848                    decoder.context
6849                );
6850                if inlined != (member_inline_size <= 4) {
6851                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6852                }
6853                let inner_offset;
6854                let mut inner_depth = depth.clone();
6855                if inlined {
6856                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6857                    inner_offset = next_offset;
6858                } else {
6859                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6860                    inner_depth.increment()?;
6861                }
6862                let val_ref =
6863                self.requires_token.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
6864                fidl::decode!(fidl::encoding::HandleType<fidl::Event, { fidl::ObjectType::EVENT.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
6865                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6866                {
6867                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6868                }
6869                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6870                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6871                }
6872            }
6873
6874            next_offset += envelope_size;
6875            _next_ordinal_to_read += 1;
6876            if next_offset >= end_offset {
6877                return Ok(());
6878            }
6879
6880            // Decode unknown envelopes for gaps in ordinals.
6881            while _next_ordinal_to_read < 2 {
6882                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6883                _next_ordinal_to_read += 1;
6884                next_offset += envelope_size;
6885            }
6886
6887            let next_out_of_line = decoder.next_out_of_line();
6888            let handles_before = decoder.remaining_handles();
6889            if let Some((inlined, num_bytes, num_handles)) =
6890                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6891            {
6892                let member_inline_size =
6893                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
6894                if inlined != (member_inline_size <= 4) {
6895                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6896                }
6897                let inner_offset;
6898                let mut inner_depth = depth.clone();
6899                if inlined {
6900                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6901                    inner_offset = next_offset;
6902                } else {
6903                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6904                    inner_depth.increment()?;
6905                }
6906                let val_ref = self.requires_level.get_or_insert_with(|| {
6907                    fidl::new_empty!(u8, fidl::encoding::DefaultFuchsiaResourceDialect)
6908                });
6909                fidl::decode!(
6910                    u8,
6911                    fidl::encoding::DefaultFuchsiaResourceDialect,
6912                    val_ref,
6913                    decoder,
6914                    inner_offset,
6915                    inner_depth
6916                )?;
6917                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6918                {
6919                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6920                }
6921                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6922                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6923                }
6924            }
6925
6926            next_offset += envelope_size;
6927            _next_ordinal_to_read += 1;
6928            if next_offset >= end_offset {
6929                return Ok(());
6930            }
6931
6932            // Decode unknown envelopes for gaps in ordinals.
6933            while _next_ordinal_to_read < 3 {
6934                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6935                _next_ordinal_to_read += 1;
6936                next_offset += envelope_size;
6937            }
6938
6939            let next_out_of_line = decoder.next_out_of_line();
6940            let handles_before = decoder.remaining_handles();
6941            if let Some((inlined, num_bytes, num_handles)) =
6942                fidl::encoding::decode_envelope_header(decoder, next_offset)?
6943            {
6944                let member_inline_size =
6945                    <fidl::encoding::Vector<u8, 256> as fidl::encoding::TypeMarker>::inline_size(
6946                        decoder.context,
6947                    );
6948                if inlined != (member_inline_size <= 4) {
6949                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
6950                }
6951                let inner_offset;
6952                let mut inner_depth = depth.clone();
6953                if inlined {
6954                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
6955                    inner_offset = next_offset;
6956                } else {
6957                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
6958                    inner_depth.increment()?;
6959                }
6960                let val_ref =
6961                self.requires_level_by_preference.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u8, 256>, fidl::encoding::DefaultFuchsiaResourceDialect));
6962                fidl::decode!(fidl::encoding::Vector<u8, 256>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
6963                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
6964                {
6965                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
6966                }
6967                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
6968                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
6969                }
6970            }
6971
6972            next_offset += envelope_size;
6973
6974            // Decode the remaining unknown envelopes.
6975            while next_offset < end_offset {
6976                _next_ordinal_to_read += 1;
6977                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
6978                next_offset += envelope_size;
6979            }
6980
6981            Ok(())
6982        }
6983    }
6984
6985    impl LeaseSchema {
6986        #[inline(always)]
6987        fn max_ordinal_present(&self) -> u64 {
6988            if let Some(_) = self.should_return_pending_lease {
6989                return 4;
6990            }
6991            if let Some(_) = self.dependencies {
6992                return 3;
6993            }
6994            if let Some(_) = self.lease_name {
6995                return 2;
6996            }
6997            if let Some(_) = self.lease_token {
6998                return 1;
6999            }
7000            0
7001        }
7002    }
7003
7004    impl fidl::encoding::ResourceTypeMarker for LeaseSchema {
7005        type Borrowed<'a> = &'a mut Self;
7006        fn take_or_borrow<'a>(
7007            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
7008        ) -> Self::Borrowed<'a> {
7009            value
7010        }
7011    }
7012
7013    unsafe impl fidl::encoding::TypeMarker for LeaseSchema {
7014        type Owned = Self;
7015
7016        #[inline(always)]
7017        fn inline_align(_context: fidl::encoding::Context) -> usize {
7018            8
7019        }
7020
7021        #[inline(always)]
7022        fn inline_size(_context: fidl::encoding::Context) -> usize {
7023            16
7024        }
7025    }
7026
7027    unsafe impl fidl::encoding::Encode<LeaseSchema, fidl::encoding::DefaultFuchsiaResourceDialect>
7028        for &mut LeaseSchema
7029    {
7030        unsafe fn encode(
7031            self,
7032            encoder: &mut fidl::encoding::Encoder<
7033                '_,
7034                fidl::encoding::DefaultFuchsiaResourceDialect,
7035            >,
7036            offset: usize,
7037            mut depth: fidl::encoding::Depth,
7038        ) -> fidl::Result<()> {
7039            encoder.debug_check_bounds::<LeaseSchema>(offset);
7040            // Vector header
7041            let max_ordinal: u64 = self.max_ordinal_present();
7042            encoder.write_num(max_ordinal, offset);
7043            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
7044            // Calling encoder.out_of_line_offset(0) is not allowed.
7045            if max_ordinal == 0 {
7046                return Ok(());
7047            }
7048            depth.increment()?;
7049            let envelope_size = 8;
7050            let bytes_len = max_ordinal as usize * envelope_size;
7051            #[allow(unused_variables)]
7052            let offset = encoder.out_of_line_offset(bytes_len);
7053            let mut _prev_end_offset: usize = 0;
7054            if 1 > max_ordinal {
7055                return Ok(());
7056            }
7057
7058            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
7059            // are envelope_size bytes.
7060            let cur_offset: usize = (1 - 1) * envelope_size;
7061
7062            // Zero reserved fields.
7063            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
7064
7065            // Safety:
7066            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
7067            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
7068            //   envelope_size bytes, there is always sufficient room.
7069            fidl::encoding::encode_in_envelope_optional::<
7070                fidl::encoding::HandleType<
7071                    fidl::EventPair,
7072                    { fidl::ObjectType::EVENTPAIR.into_raw() },
7073                    2147483648,
7074                >,
7075                fidl::encoding::DefaultFuchsiaResourceDialect,
7076            >(
7077                self.lease_token.as_mut().map(
7078                    <fidl::encoding::HandleType<
7079                        fidl::EventPair,
7080                        { fidl::ObjectType::EVENTPAIR.into_raw() },
7081                        2147483648,
7082                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
7083                ),
7084                encoder,
7085                offset + cur_offset,
7086                depth,
7087            )?;
7088
7089            _prev_end_offset = cur_offset + envelope_size;
7090            if 2 > max_ordinal {
7091                return Ok(());
7092            }
7093
7094            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
7095            // are envelope_size bytes.
7096            let cur_offset: usize = (2 - 1) * envelope_size;
7097
7098            // Zero reserved fields.
7099            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
7100
7101            // Safety:
7102            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
7103            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
7104            //   envelope_size bytes, there is always sufficient room.
7105            fidl::encoding::encode_in_envelope_optional::<
7106                fidl::encoding::BoundedString<64>,
7107                fidl::encoding::DefaultFuchsiaResourceDialect,
7108            >(
7109                self.lease_name.as_ref().map(
7110                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
7111                ),
7112                encoder,
7113                offset + cur_offset,
7114                depth,
7115            )?;
7116
7117            _prev_end_offset = cur_offset + envelope_size;
7118            if 3 > max_ordinal {
7119                return Ok(());
7120            }
7121
7122            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
7123            // are envelope_size bytes.
7124            let cur_offset: usize = (3 - 1) * envelope_size;
7125
7126            // Zero reserved fields.
7127            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
7128
7129            // Safety:
7130            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
7131            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
7132            //   envelope_size bytes, there is always sufficient room.
7133            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<LeaseDependency, 128>, fidl::encoding::DefaultFuchsiaResourceDialect>(
7134            self.dependencies.as_mut().map(<fidl::encoding::Vector<LeaseDependency, 128> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
7135            encoder, offset + cur_offset, depth
7136        )?;
7137
7138            _prev_end_offset = cur_offset + envelope_size;
7139            if 4 > max_ordinal {
7140                return Ok(());
7141            }
7142
7143            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
7144            // are envelope_size bytes.
7145            let cur_offset: usize = (4 - 1) * envelope_size;
7146
7147            // Zero reserved fields.
7148            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
7149
7150            // Safety:
7151            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
7152            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
7153            //   envelope_size bytes, there is always sufficient room.
7154            fidl::encoding::encode_in_envelope_optional::<
7155                bool,
7156                fidl::encoding::DefaultFuchsiaResourceDialect,
7157            >(
7158                self.should_return_pending_lease
7159                    .as_ref()
7160                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
7161                encoder,
7162                offset + cur_offset,
7163                depth,
7164            )?;
7165
7166            _prev_end_offset = cur_offset + envelope_size;
7167
7168            Ok(())
7169        }
7170    }
7171
7172    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for LeaseSchema {
7173        #[inline(always)]
7174        fn new_empty() -> Self {
7175            Self::default()
7176        }
7177
7178        unsafe fn decode(
7179            &mut self,
7180            decoder: &mut fidl::encoding::Decoder<
7181                '_,
7182                fidl::encoding::DefaultFuchsiaResourceDialect,
7183            >,
7184            offset: usize,
7185            mut depth: fidl::encoding::Depth,
7186        ) -> fidl::Result<()> {
7187            decoder.debug_check_bounds::<Self>(offset);
7188            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
7189                None => return Err(fidl::Error::NotNullable),
7190                Some(len) => len,
7191            };
7192            // Calling decoder.out_of_line_offset(0) is not allowed.
7193            if len == 0 {
7194                return Ok(());
7195            };
7196            depth.increment()?;
7197            let envelope_size = 8;
7198            let bytes_len = len * envelope_size;
7199            let offset = decoder.out_of_line_offset(bytes_len)?;
7200            // Decode the envelope for each type.
7201            let mut _next_ordinal_to_read = 0;
7202            let mut next_offset = offset;
7203            let end_offset = offset + bytes_len;
7204            _next_ordinal_to_read += 1;
7205            if next_offset >= end_offset {
7206                return Ok(());
7207            }
7208
7209            // Decode unknown envelopes for gaps in ordinals.
7210            while _next_ordinal_to_read < 1 {
7211                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
7212                _next_ordinal_to_read += 1;
7213                next_offset += envelope_size;
7214            }
7215
7216            let next_out_of_line = decoder.next_out_of_line();
7217            let handles_before = decoder.remaining_handles();
7218            if let Some((inlined, num_bytes, num_handles)) =
7219                fidl::encoding::decode_envelope_header(decoder, next_offset)?
7220            {
7221                let member_inline_size = <fidl::encoding::HandleType<
7222                    fidl::EventPair,
7223                    { fidl::ObjectType::EVENTPAIR.into_raw() },
7224                    2147483648,
7225                > as fidl::encoding::TypeMarker>::inline_size(
7226                    decoder.context
7227                );
7228                if inlined != (member_inline_size <= 4) {
7229                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
7230                }
7231                let inner_offset;
7232                let mut inner_depth = depth.clone();
7233                if inlined {
7234                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
7235                    inner_offset = next_offset;
7236                } else {
7237                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
7238                    inner_depth.increment()?;
7239                }
7240                let val_ref =
7241                self.lease_token.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
7242                fidl::decode!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
7243                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
7244                {
7245                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
7246                }
7247                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
7248                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
7249                }
7250            }
7251
7252            next_offset += envelope_size;
7253            _next_ordinal_to_read += 1;
7254            if next_offset >= end_offset {
7255                return Ok(());
7256            }
7257
7258            // Decode unknown envelopes for gaps in ordinals.
7259            while _next_ordinal_to_read < 2 {
7260                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
7261                _next_ordinal_to_read += 1;
7262                next_offset += envelope_size;
7263            }
7264
7265            let next_out_of_line = decoder.next_out_of_line();
7266            let handles_before = decoder.remaining_handles();
7267            if let Some((inlined, num_bytes, num_handles)) =
7268                fidl::encoding::decode_envelope_header(decoder, next_offset)?
7269            {
7270                let member_inline_size =
7271                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
7272                        decoder.context,
7273                    );
7274                if inlined != (member_inline_size <= 4) {
7275                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
7276                }
7277                let inner_offset;
7278                let mut inner_depth = depth.clone();
7279                if inlined {
7280                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
7281                    inner_offset = next_offset;
7282                } else {
7283                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
7284                    inner_depth.increment()?;
7285                }
7286                let val_ref = self.lease_name.get_or_insert_with(|| {
7287                    fidl::new_empty!(
7288                        fidl::encoding::BoundedString<64>,
7289                        fidl::encoding::DefaultFuchsiaResourceDialect
7290                    )
7291                });
7292                fidl::decode!(
7293                    fidl::encoding::BoundedString<64>,
7294                    fidl::encoding::DefaultFuchsiaResourceDialect,
7295                    val_ref,
7296                    decoder,
7297                    inner_offset,
7298                    inner_depth
7299                )?;
7300                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
7301                {
7302                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
7303                }
7304                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
7305                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
7306                }
7307            }
7308
7309            next_offset += envelope_size;
7310            _next_ordinal_to_read += 1;
7311            if next_offset >= end_offset {
7312                return Ok(());
7313            }
7314
7315            // Decode unknown envelopes for gaps in ordinals.
7316            while _next_ordinal_to_read < 3 {
7317                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
7318                _next_ordinal_to_read += 1;
7319                next_offset += envelope_size;
7320            }
7321
7322            let next_out_of_line = decoder.next_out_of_line();
7323            let handles_before = decoder.remaining_handles();
7324            if let Some((inlined, num_bytes, num_handles)) =
7325                fidl::encoding::decode_envelope_header(decoder, next_offset)?
7326            {
7327                let member_inline_size = <fidl::encoding::Vector<LeaseDependency, 128> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
7328                if inlined != (member_inline_size <= 4) {
7329                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
7330                }
7331                let inner_offset;
7332                let mut inner_depth = depth.clone();
7333                if inlined {
7334                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
7335                    inner_offset = next_offset;
7336                } else {
7337                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
7338                    inner_depth.increment()?;
7339                }
7340                let val_ref =
7341                self.dependencies.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<LeaseDependency, 128>, fidl::encoding::DefaultFuchsiaResourceDialect));
7342                fidl::decode!(fidl::encoding::Vector<LeaseDependency, 128>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
7343                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
7344                {
7345                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
7346                }
7347                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
7348                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
7349                }
7350            }
7351
7352            next_offset += envelope_size;
7353            _next_ordinal_to_read += 1;
7354            if next_offset >= end_offset {
7355                return Ok(());
7356            }
7357
7358            // Decode unknown envelopes for gaps in ordinals.
7359            while _next_ordinal_to_read < 4 {
7360                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
7361                _next_ordinal_to_read += 1;
7362                next_offset += envelope_size;
7363            }
7364
7365            let next_out_of_line = decoder.next_out_of_line();
7366            let handles_before = decoder.remaining_handles();
7367            if let Some((inlined, num_bytes, num_handles)) =
7368                fidl::encoding::decode_envelope_header(decoder, next_offset)?
7369            {
7370                let member_inline_size =
7371                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
7372                if inlined != (member_inline_size <= 4) {
7373                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
7374                }
7375                let inner_offset;
7376                let mut inner_depth = depth.clone();
7377                if inlined {
7378                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
7379                    inner_offset = next_offset;
7380                } else {
7381                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
7382                    inner_depth.increment()?;
7383                }
7384                let val_ref = self.should_return_pending_lease.get_or_insert_with(|| {
7385                    fidl::new_empty!(bool, fidl::encoding::DefaultFuchsiaResourceDialect)
7386                });
7387                fidl::decode!(
7388                    bool,
7389                    fidl::encoding::DefaultFuchsiaResourceDialect,
7390                    val_ref,
7391                    decoder,
7392                    inner_offset,
7393                    inner_depth
7394                )?;
7395                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
7396                {
7397                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
7398                }
7399                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
7400                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
7401                }
7402            }
7403
7404            next_offset += envelope_size;
7405
7406            // Decode the remaining unknown envelopes.
7407            while next_offset < end_offset {
7408                _next_ordinal_to_read += 1;
7409                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
7410                next_offset += envelope_size;
7411            }
7412
7413            Ok(())
7414        }
7415    }
7416}