Skip to main content

fidl_fuchsia_driver_framework/
fidl_fuchsia_driver_framework.rs

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