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