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