Skip to main content

fidl_fuchsia_power_broker/
fidl_fuchsia_power_broker.rs

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