Skip to main content

fidl_fuchsia_driver_framework/
fidl_fuchsia_driver_framework.rs

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