Skip to main content

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