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