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