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