Skip to main content

fidl_fuchsia_component_resolution/
fidl_fuchsia_component_resolution.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_component_resolution__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct ResolverResolveWithContextResponse {
16    pub component: Component,
17}
18
19impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
20    for ResolverResolveWithContextResponse
21{
22}
23
24#[derive(Debug, PartialEq)]
25pub struct ResolverResolveResponse {
26    pub component: Component,
27}
28
29impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ResolverResolveResponse {}
30
31/// A component is a unit of executable software.
32///
33/// This object provides the component's declaration, access to its package's
34/// content, and relevant metadata as resolved `fuchsia.component.resolution.Resolver`.
35#[derive(Debug, Default, PartialEq)]
36pub struct Component {
37    /// The resolved URL of the component.
38    /// This is the canonical URL obtained by the component resolver after
39    /// following redirects and resolving relative paths.
40    pub url: Option<String>,
41    /// Binary representation of the component's declaration (`fuchsia.component.decl.Component`).
42    /// This information is typically obtained from the component's manifest
43    /// or generated by the component resolver.
44    pub decl: Option<fidl_fuchsia_mem::Data>,
45    /// The package that contains the component.
46    /// By convention, the component's package is mapped to "/pkg" in its
47    /// namespace at runtime.
48    ///
49    /// This is null if the component is not represented as a package.
50    /// In that case, it is the runner's responsibility to load the component's
51    /// resource from the `url`.  This mechanism is used for web
52    /// applications.
53    ///
54    /// Most runners, including but not limited to the builtin ELF runner,
55    /// require the package's directory connection to have OPEN_RIGHT_EXECUTABLE
56    /// rights in order to run the resolved component.
57    pub package: Option<Package>,
58    /// Binary representation of the component's configuration values
59    /// (`fuchsia.component.config.ValuesData`).
60    pub config_values: Option<fidl_fuchsia_mem::Data>,
61    /// The context used to resolve `component_url`s relative to this
62    /// component. Pass this value to `Resolver::ResolveWithContext()` when
63    /// resolving a component URL that _may_ be relative to this `Component`.
64    ///
65    /// The `resolution_context` is an opaque value (from the perspective of
66    /// component resolution) that is provided by a component `Resolver` to save
67    /// with a parent `Component`.
68    ///
69    /// `Resolver`s that can resolve relative path component URLs, via
70    /// `ResolveWithContext`, should return a `resolution_context` from both
71    /// `Resolve` and `ResolveWithContext`. Relative path component URLs can
72    /// only be resolved via `ResolveWithContext`, which requires a valid
73    /// resolution `Context`.
74    pub resolution_context: Option<Context>,
75    /// The target ABI revision of the resolved component.
76    pub abi_revision: Option<u64>,
77    #[doc(hidden)]
78    pub __source_breaking: fidl::marker::SourceBreaking,
79}
80
81impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Component {}
82
83/// A package is a signed collection of immutable files.
84///
85/// This object provides access to a package's content and relevant metadata.
86#[derive(Debug, Default, PartialEq)]
87pub struct Package {
88    /// The URL of the package itself.
89    pub url: Option<String>,
90    /// The package's content directory.
91    pub directory: Option<fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>>,
92    #[doc(hidden)]
93    pub __source_breaking: fidl::marker::SourceBreaking,
94}
95
96impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Package {}
97
98#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
99pub struct ResolverMarker;
100
101impl fidl::endpoints::ProtocolMarker for ResolverMarker {
102    type Proxy = ResolverProxy;
103    type RequestStream = ResolverRequestStream;
104    #[cfg(target_os = "fuchsia")]
105    type SynchronousProxy = ResolverSynchronousProxy;
106
107    const DEBUG_NAME: &'static str = "fuchsia.component.resolution.Resolver";
108}
109impl fidl::endpoints::DiscoverableProtocolMarker for ResolverMarker {}
110pub type ResolverResolveResult = Result<Component, ResolverError>;
111pub type ResolverResolveWithContextResult = Result<Component, ResolverError>;
112
113pub trait ResolverProxyInterface: Send + Sync {
114    type ResolveResponseFut: std::future::Future<Output = Result<ResolverResolveResult, fidl::Error>>
115        + Send;
116    fn r#resolve(&self, component_url: &str) -> Self::ResolveResponseFut;
117    type ResolveWithContextResponseFut: std::future::Future<Output = Result<ResolverResolveWithContextResult, fidl::Error>>
118        + Send;
119    fn r#resolve_with_context(
120        &self,
121        component_url: &str,
122        context: &Context,
123    ) -> Self::ResolveWithContextResponseFut;
124}
125#[derive(Debug)]
126#[cfg(target_os = "fuchsia")]
127pub struct ResolverSynchronousProxy {
128    client: fidl::client::sync::Client,
129}
130
131#[cfg(target_os = "fuchsia")]
132impl fidl::endpoints::SynchronousProxy for ResolverSynchronousProxy {
133    type Proxy = ResolverProxy;
134    type Protocol = ResolverMarker;
135
136    fn from_channel(inner: fidl::Channel) -> Self {
137        Self::new(inner)
138    }
139
140    fn into_channel(self) -> fidl::Channel {
141        self.client.into_channel()
142    }
143
144    fn as_channel(&self) -> &fidl::Channel {
145        self.client.as_channel()
146    }
147}
148
149#[cfg(target_os = "fuchsia")]
150impl ResolverSynchronousProxy {
151    pub fn new(channel: fidl::Channel) -> Self {
152        Self { client: fidl::client::sync::Client::new(channel) }
153    }
154
155    pub fn into_channel(self) -> fidl::Channel {
156        self.client.into_channel()
157    }
158
159    /// Waits until an event arrives and returns it. It is safe for other
160    /// threads to make concurrent requests while waiting for an event.
161    pub fn wait_for_event(
162        &self,
163        deadline: zx::MonotonicInstant,
164    ) -> Result<ResolverEvent, fidl::Error> {
165        ResolverEvent::decode(self.client.wait_for_event::<ResolverMarker>(deadline)?)
166    }
167
168    /// Resolves a component with the given absolute URL.
169    ///
170    /// `component_url` is the unescaped URL of the component to resolve.
171    ///
172    /// If successful, returns information about the component
173    /// that was resolved.
174    ///
175    /// On failure, returns a `ResolverError` error.
176    pub fn r#resolve(
177        &self,
178        mut component_url: &str,
179        ___deadline: zx::MonotonicInstant,
180    ) -> Result<ResolverResolveResult, fidl::Error> {
181        let _response = self.client.send_query::<
182            ResolverResolveRequest,
183            fidl::encoding::ResultType<ResolverResolveResponse, ResolverError>,
184            ResolverMarker,
185        >(
186            (component_url,),
187            0x57f9cfe88bf1f2e5,
188            fidl::encoding::DynamicFlags::empty(),
189            ___deadline,
190        )?;
191        Ok(_response.map(|x| x.component))
192    }
193
194    /// Resolves a component with the absolute or relative URL. If relative, the
195    /// component will be resolved relative to the supplied `context`.
196    ///
197    /// `component_url` is the unescaped URL of the component to resolve, the
198    /// format of which can be either:
199    ///
200    ///   * a fully-qualified absolute component URL; or
201    ///   * a subpackaged-component reference, prefixed by a URI relative
202    ///     path to its containing subpackage (for example,
203    ///     `child_package#meta/some_component.cm`)
204    ///
205    /// `context` is the `resolution_context` of a previously-resolved
206    /// `Component`, providing the context for resoving a relative URL.
207    pub fn r#resolve_with_context(
208        &self,
209        mut component_url: &str,
210        mut context: &Context,
211        ___deadline: zx::MonotonicInstant,
212    ) -> Result<ResolverResolveWithContextResult, fidl::Error> {
213        let _response = self.client.send_query::<
214            ResolverResolveWithContextRequest,
215            fidl::encoding::ResultType<ResolverResolveWithContextResponse, ResolverError>,
216            ResolverMarker,
217        >(
218            (component_url, context,),
219            0x4d64b0de827070bd,
220            fidl::encoding::DynamicFlags::empty(),
221            ___deadline,
222        )?;
223        Ok(_response.map(|x| x.component))
224    }
225}
226
227#[cfg(target_os = "fuchsia")]
228impl From<ResolverSynchronousProxy> for zx::NullableHandle {
229    fn from(value: ResolverSynchronousProxy) -> Self {
230        value.into_channel().into()
231    }
232}
233
234#[cfg(target_os = "fuchsia")]
235impl From<fidl::Channel> for ResolverSynchronousProxy {
236    fn from(value: fidl::Channel) -> Self {
237        Self::new(value)
238    }
239}
240
241#[cfg(target_os = "fuchsia")]
242impl fidl::endpoints::FromClient for ResolverSynchronousProxy {
243    type Protocol = ResolverMarker;
244
245    fn from_client(value: fidl::endpoints::ClientEnd<ResolverMarker>) -> Self {
246        Self::new(value.into_channel())
247    }
248}
249
250#[derive(Debug, Clone)]
251pub struct ResolverProxy {
252    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
253}
254
255impl fidl::endpoints::Proxy for ResolverProxy {
256    type Protocol = ResolverMarker;
257
258    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
259        Self::new(inner)
260    }
261
262    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
263        self.client.into_channel().map_err(|client| Self { client })
264    }
265
266    fn as_channel(&self) -> &::fidl::AsyncChannel {
267        self.client.as_channel()
268    }
269}
270
271impl ResolverProxy {
272    /// Create a new Proxy for fuchsia.component.resolution/Resolver.
273    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
274        let protocol_name = <ResolverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
275        Self { client: fidl::client::Client::new(channel, protocol_name) }
276    }
277
278    /// Get a Stream of events from the remote end of the protocol.
279    ///
280    /// # Panics
281    ///
282    /// Panics if the event stream was already taken.
283    pub fn take_event_stream(&self) -> ResolverEventStream {
284        ResolverEventStream { event_receiver: self.client.take_event_receiver() }
285    }
286
287    /// Resolves a component with the given absolute URL.
288    ///
289    /// `component_url` is the unescaped URL of the component to resolve.
290    ///
291    /// If successful, returns information about the component
292    /// that was resolved.
293    ///
294    /// On failure, returns a `ResolverError` error.
295    pub fn r#resolve(
296        &self,
297        mut component_url: &str,
298    ) -> fidl::client::QueryResponseFut<
299        ResolverResolveResult,
300        fidl::encoding::DefaultFuchsiaResourceDialect,
301    > {
302        ResolverProxyInterface::r#resolve(self, component_url)
303    }
304
305    /// Resolves a component with the absolute or relative URL. If relative, the
306    /// component will be resolved relative to the supplied `context`.
307    ///
308    /// `component_url` is the unescaped URL of the component to resolve, the
309    /// format of which can be either:
310    ///
311    ///   * a fully-qualified absolute component URL; or
312    ///   * a subpackaged-component reference, prefixed by a URI relative
313    ///     path to its containing subpackage (for example,
314    ///     `child_package#meta/some_component.cm`)
315    ///
316    /// `context` is the `resolution_context` of a previously-resolved
317    /// `Component`, providing the context for resoving a relative URL.
318    pub fn r#resolve_with_context(
319        &self,
320        mut component_url: &str,
321        mut context: &Context,
322    ) -> fidl::client::QueryResponseFut<
323        ResolverResolveWithContextResult,
324        fidl::encoding::DefaultFuchsiaResourceDialect,
325    > {
326        ResolverProxyInterface::r#resolve_with_context(self, component_url, context)
327    }
328}
329
330impl ResolverProxyInterface for ResolverProxy {
331    type ResolveResponseFut = fidl::client::QueryResponseFut<
332        ResolverResolveResult,
333        fidl::encoding::DefaultFuchsiaResourceDialect,
334    >;
335    fn r#resolve(&self, mut component_url: &str) -> Self::ResolveResponseFut {
336        fn _decode(
337            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
338        ) -> Result<ResolverResolveResult, fidl::Error> {
339            let _response = fidl::client::decode_transaction_body::<
340                fidl::encoding::ResultType<ResolverResolveResponse, ResolverError>,
341                fidl::encoding::DefaultFuchsiaResourceDialect,
342                0x57f9cfe88bf1f2e5,
343            >(_buf?)?;
344            Ok(_response.map(|x| x.component))
345        }
346        self.client.send_query_and_decode::<ResolverResolveRequest, ResolverResolveResult>(
347            (component_url,),
348            0x57f9cfe88bf1f2e5,
349            fidl::encoding::DynamicFlags::empty(),
350            _decode,
351        )
352    }
353
354    type ResolveWithContextResponseFut = fidl::client::QueryResponseFut<
355        ResolverResolveWithContextResult,
356        fidl::encoding::DefaultFuchsiaResourceDialect,
357    >;
358    fn r#resolve_with_context(
359        &self,
360        mut component_url: &str,
361        mut context: &Context,
362    ) -> Self::ResolveWithContextResponseFut {
363        fn _decode(
364            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
365        ) -> Result<ResolverResolveWithContextResult, fidl::Error> {
366            let _response = fidl::client::decode_transaction_body::<
367                fidl::encoding::ResultType<ResolverResolveWithContextResponse, ResolverError>,
368                fidl::encoding::DefaultFuchsiaResourceDialect,
369                0x4d64b0de827070bd,
370            >(_buf?)?;
371            Ok(_response.map(|x| x.component))
372        }
373        self.client.send_query_and_decode::<
374            ResolverResolveWithContextRequest,
375            ResolverResolveWithContextResult,
376        >(
377            (component_url, context,),
378            0x4d64b0de827070bd,
379            fidl::encoding::DynamicFlags::empty(),
380            _decode,
381        )
382    }
383}
384
385pub struct ResolverEventStream {
386    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
387}
388
389impl std::marker::Unpin for ResolverEventStream {}
390
391impl futures::stream::FusedStream for ResolverEventStream {
392    fn is_terminated(&self) -> bool {
393        self.event_receiver.is_terminated()
394    }
395}
396
397impl futures::Stream for ResolverEventStream {
398    type Item = Result<ResolverEvent, fidl::Error>;
399
400    fn poll_next(
401        mut self: std::pin::Pin<&mut Self>,
402        cx: &mut std::task::Context<'_>,
403    ) -> std::task::Poll<Option<Self::Item>> {
404        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
405            &mut self.event_receiver,
406            cx
407        )?) {
408            Some(buf) => std::task::Poll::Ready(Some(ResolverEvent::decode(buf))),
409            None => std::task::Poll::Ready(None),
410        }
411    }
412}
413
414#[derive(Debug)]
415pub enum ResolverEvent {
416    #[non_exhaustive]
417    _UnknownEvent {
418        /// Ordinal of the event that was sent.
419        ordinal: u64,
420    },
421}
422
423impl ResolverEvent {
424    /// Decodes a message buffer as a [`ResolverEvent`].
425    fn decode(
426        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
427    ) -> Result<ResolverEvent, fidl::Error> {
428        let (bytes, _handles) = buf.split_mut();
429        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
430        debug_assert_eq!(tx_header.tx_id, 0);
431        match tx_header.ordinal {
432            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
433                Ok(ResolverEvent::_UnknownEvent { ordinal: tx_header.ordinal })
434            }
435            _ => Err(fidl::Error::UnknownOrdinal {
436                ordinal: tx_header.ordinal,
437                protocol_name: <ResolverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
438            }),
439        }
440    }
441}
442
443/// A Stream of incoming requests for fuchsia.component.resolution/Resolver.
444pub struct ResolverRequestStream {
445    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
446    is_terminated: bool,
447}
448
449impl std::marker::Unpin for ResolverRequestStream {}
450
451impl futures::stream::FusedStream for ResolverRequestStream {
452    fn is_terminated(&self) -> bool {
453        self.is_terminated
454    }
455}
456
457impl fidl::endpoints::RequestStream for ResolverRequestStream {
458    type Protocol = ResolverMarker;
459    type ControlHandle = ResolverControlHandle;
460
461    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
462        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
463    }
464
465    fn control_handle(&self) -> Self::ControlHandle {
466        ResolverControlHandle { inner: self.inner.clone() }
467    }
468
469    fn into_inner(
470        self,
471    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
472    {
473        (self.inner, self.is_terminated)
474    }
475
476    fn from_inner(
477        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
478        is_terminated: bool,
479    ) -> Self {
480        Self { inner, is_terminated }
481    }
482}
483
484impl futures::Stream for ResolverRequestStream {
485    type Item = Result<ResolverRequest, fidl::Error>;
486
487    fn poll_next(
488        mut self: std::pin::Pin<&mut Self>,
489        cx: &mut std::task::Context<'_>,
490    ) -> std::task::Poll<Option<Self::Item>> {
491        let this = &mut *self;
492        if this.inner.check_shutdown(cx) {
493            this.is_terminated = true;
494            return std::task::Poll::Ready(None);
495        }
496        if this.is_terminated {
497            panic!("polled ResolverRequestStream after completion");
498        }
499        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
500            |bytes, handles| {
501                match this.inner.channel().read_etc(cx, bytes, handles) {
502                    std::task::Poll::Ready(Ok(())) => {}
503                    std::task::Poll::Pending => return std::task::Poll::Pending,
504                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
505                        this.is_terminated = true;
506                        return std::task::Poll::Ready(None);
507                    }
508                    std::task::Poll::Ready(Err(e)) => {
509                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
510                            e.into(),
511                        ))));
512                    }
513                }
514
515                // A message has been received from the channel
516                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
517
518                std::task::Poll::Ready(Some(match header.ordinal {
519                    0x57f9cfe88bf1f2e5 => {
520                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
521                        let mut req = fidl::new_empty!(
522                            ResolverResolveRequest,
523                            fidl::encoding::DefaultFuchsiaResourceDialect
524                        );
525                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ResolverResolveRequest>(&header, _body_bytes, handles, &mut req)?;
526                        let control_handle = ResolverControlHandle { inner: this.inner.clone() };
527                        Ok(ResolverRequest::Resolve {
528                            component_url: req.component_url,
529
530                            responder: ResolverResolveResponder {
531                                control_handle: std::mem::ManuallyDrop::new(control_handle),
532                                tx_id: header.tx_id,
533                            },
534                        })
535                    }
536                    0x4d64b0de827070bd => {
537                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
538                        let mut req = fidl::new_empty!(
539                            ResolverResolveWithContextRequest,
540                            fidl::encoding::DefaultFuchsiaResourceDialect
541                        );
542                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ResolverResolveWithContextRequest>(&header, _body_bytes, handles, &mut req)?;
543                        let control_handle = ResolverControlHandle { inner: this.inner.clone() };
544                        Ok(ResolverRequest::ResolveWithContext {
545                            component_url: req.component_url,
546                            context: req.context,
547
548                            responder: ResolverResolveWithContextResponder {
549                                control_handle: std::mem::ManuallyDrop::new(control_handle),
550                                tx_id: header.tx_id,
551                            },
552                        })
553                    }
554                    _ if header.tx_id == 0
555                        && header
556                            .dynamic_flags()
557                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
558                    {
559                        Ok(ResolverRequest::_UnknownMethod {
560                            ordinal: header.ordinal,
561                            control_handle: ResolverControlHandle { inner: this.inner.clone() },
562                            method_type: fidl::MethodType::OneWay,
563                        })
564                    }
565                    _ if header
566                        .dynamic_flags()
567                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
568                    {
569                        this.inner.send_framework_err(
570                            fidl::encoding::FrameworkErr::UnknownMethod,
571                            header.tx_id,
572                            header.ordinal,
573                            header.dynamic_flags(),
574                            (bytes, handles),
575                        )?;
576                        Ok(ResolverRequest::_UnknownMethod {
577                            ordinal: header.ordinal,
578                            control_handle: ResolverControlHandle { inner: this.inner.clone() },
579                            method_type: fidl::MethodType::TwoWay,
580                        })
581                    }
582                    _ => Err(fidl::Error::UnknownOrdinal {
583                        ordinal: header.ordinal,
584                        protocol_name:
585                            <ResolverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
586                    }),
587                }))
588            },
589        )
590    }
591}
592
593/// An interface for resolving a URL to a component.
594///
595/// This interface is implemented by components that provide support
596/// for loading components with a particular URL scheme.   For example,
597/// the Fuchsia package component resolver exposes a service with this
598/// interface to resolve component URLs using the "fuchsia-pkg://" scheme.
599///
600/// To use a resolver to resolve URLs within your realm, register it
601/// in your realm's manifest.
602///
603/// Note: The component manager is the only intended direct client of this
604/// interface.
605#[derive(Debug)]
606pub enum ResolverRequest {
607    /// Resolves a component with the given absolute URL.
608    ///
609    /// `component_url` is the unescaped URL of the component to resolve.
610    ///
611    /// If successful, returns information about the component
612    /// that was resolved.
613    ///
614    /// On failure, returns a `ResolverError` error.
615    Resolve { component_url: String, responder: ResolverResolveResponder },
616    /// Resolves a component with the absolute or relative URL. If relative, the
617    /// component will be resolved relative to the supplied `context`.
618    ///
619    /// `component_url` is the unescaped URL of the component to resolve, the
620    /// format of which can be either:
621    ///
622    ///   * a fully-qualified absolute component URL; or
623    ///   * a subpackaged-component reference, prefixed by a URI relative
624    ///     path to its containing subpackage (for example,
625    ///     `child_package#meta/some_component.cm`)
626    ///
627    /// `context` is the `resolution_context` of a previously-resolved
628    /// `Component`, providing the context for resoving a relative URL.
629    ResolveWithContext {
630        component_url: String,
631        context: Context,
632        responder: ResolverResolveWithContextResponder,
633    },
634    /// An interaction was received which does not match any known method.
635    #[non_exhaustive]
636    _UnknownMethod {
637        /// Ordinal of the method that was called.
638        ordinal: u64,
639        control_handle: ResolverControlHandle,
640        method_type: fidl::MethodType,
641    },
642}
643
644impl ResolverRequest {
645    #[allow(irrefutable_let_patterns)]
646    pub fn into_resolve(self) -> Option<(String, ResolverResolveResponder)> {
647        if let ResolverRequest::Resolve { component_url, responder } = self {
648            Some((component_url, responder))
649        } else {
650            None
651        }
652    }
653
654    #[allow(irrefutable_let_patterns)]
655    pub fn into_resolve_with_context(
656        self,
657    ) -> Option<(String, Context, ResolverResolveWithContextResponder)> {
658        if let ResolverRequest::ResolveWithContext { component_url, context, responder } = self {
659            Some((component_url, context, responder))
660        } else {
661            None
662        }
663    }
664
665    /// Name of the method defined in FIDL
666    pub fn method_name(&self) -> &'static str {
667        match *self {
668            ResolverRequest::Resolve { .. } => "resolve",
669            ResolverRequest::ResolveWithContext { .. } => "resolve_with_context",
670            ResolverRequest::_UnknownMethod { method_type: fidl::MethodType::OneWay, .. } => {
671                "unknown one-way method"
672            }
673            ResolverRequest::_UnknownMethod { method_type: fidl::MethodType::TwoWay, .. } => {
674                "unknown two-way method"
675            }
676        }
677    }
678}
679
680#[derive(Debug, Clone)]
681pub struct ResolverControlHandle {
682    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
683}
684
685impl fidl::endpoints::ControlHandle for ResolverControlHandle {
686    fn shutdown(&self) {
687        self.inner.shutdown()
688    }
689
690    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
691        self.inner.shutdown_with_epitaph(status)
692    }
693
694    fn is_closed(&self) -> bool {
695        self.inner.channel().is_closed()
696    }
697    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
698        self.inner.channel().on_closed()
699    }
700
701    #[cfg(target_os = "fuchsia")]
702    fn signal_peer(
703        &self,
704        clear_mask: zx::Signals,
705        set_mask: zx::Signals,
706    ) -> Result<(), zx_status::Status> {
707        use fidl::Peered;
708        self.inner.channel().signal_peer(clear_mask, set_mask)
709    }
710}
711
712impl ResolverControlHandle {}
713
714#[must_use = "FIDL methods require a response to be sent"]
715#[derive(Debug)]
716pub struct ResolverResolveResponder {
717    control_handle: std::mem::ManuallyDrop<ResolverControlHandle>,
718    tx_id: u32,
719}
720
721/// Set the the channel to be shutdown (see [`ResolverControlHandle::shutdown`])
722/// if the responder is dropped without sending a response, so that the client
723/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
724impl std::ops::Drop for ResolverResolveResponder {
725    fn drop(&mut self) {
726        self.control_handle.shutdown();
727        // Safety: drops once, never accessed again
728        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
729    }
730}
731
732impl fidl::endpoints::Responder for ResolverResolveResponder {
733    type ControlHandle = ResolverControlHandle;
734
735    fn control_handle(&self) -> &ResolverControlHandle {
736        &self.control_handle
737    }
738
739    fn drop_without_shutdown(mut self) {
740        // Safety: drops once, never accessed again due to mem::forget
741        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
742        // Prevent Drop from running (which would shut down the channel)
743        std::mem::forget(self);
744    }
745}
746
747impl ResolverResolveResponder {
748    /// Sends a response to the FIDL transaction.
749    ///
750    /// Sets the channel to shutdown if an error occurs.
751    pub fn send(self, mut result: Result<Component, ResolverError>) -> Result<(), fidl::Error> {
752        let _result = self.send_raw(result);
753        if _result.is_err() {
754            self.control_handle.shutdown();
755        }
756        self.drop_without_shutdown();
757        _result
758    }
759
760    /// Similar to "send" but does not shutdown the channel if an error occurs.
761    pub fn send_no_shutdown_on_err(
762        self,
763        mut result: Result<Component, ResolverError>,
764    ) -> Result<(), fidl::Error> {
765        let _result = self.send_raw(result);
766        self.drop_without_shutdown();
767        _result
768    }
769
770    fn send_raw(&self, mut result: Result<Component, ResolverError>) -> Result<(), fidl::Error> {
771        self.control_handle
772            .inner
773            .send::<fidl::encoding::ResultType<ResolverResolveResponse, ResolverError>>(
774                result.as_mut().map_err(|e| *e).map(|component| (component,)),
775                self.tx_id,
776                0x57f9cfe88bf1f2e5,
777                fidl::encoding::DynamicFlags::empty(),
778            )
779    }
780}
781
782#[must_use = "FIDL methods require a response to be sent"]
783#[derive(Debug)]
784pub struct ResolverResolveWithContextResponder {
785    control_handle: std::mem::ManuallyDrop<ResolverControlHandle>,
786    tx_id: u32,
787}
788
789/// Set the the channel to be shutdown (see [`ResolverControlHandle::shutdown`])
790/// if the responder is dropped without sending a response, so that the client
791/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
792impl std::ops::Drop for ResolverResolveWithContextResponder {
793    fn drop(&mut self) {
794        self.control_handle.shutdown();
795        // Safety: drops once, never accessed again
796        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
797    }
798}
799
800impl fidl::endpoints::Responder for ResolverResolveWithContextResponder {
801    type ControlHandle = ResolverControlHandle;
802
803    fn control_handle(&self) -> &ResolverControlHandle {
804        &self.control_handle
805    }
806
807    fn drop_without_shutdown(mut self) {
808        // Safety: drops once, never accessed again due to mem::forget
809        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
810        // Prevent Drop from running (which would shut down the channel)
811        std::mem::forget(self);
812    }
813}
814
815impl ResolverResolveWithContextResponder {
816    /// Sends a response to the FIDL transaction.
817    ///
818    /// Sets the channel to shutdown if an error occurs.
819    pub fn send(self, mut result: Result<Component, ResolverError>) -> Result<(), fidl::Error> {
820        let _result = self.send_raw(result);
821        if _result.is_err() {
822            self.control_handle.shutdown();
823        }
824        self.drop_without_shutdown();
825        _result
826    }
827
828    /// Similar to "send" but does not shutdown the channel if an error occurs.
829    pub fn send_no_shutdown_on_err(
830        self,
831        mut result: Result<Component, ResolverError>,
832    ) -> Result<(), fidl::Error> {
833        let _result = self.send_raw(result);
834        self.drop_without_shutdown();
835        _result
836    }
837
838    fn send_raw(&self, mut result: Result<Component, ResolverError>) -> Result<(), fidl::Error> {
839        self.control_handle.inner.send::<fidl::encoding::ResultType<
840            ResolverResolveWithContextResponse,
841            ResolverError,
842        >>(
843            result.as_mut().map_err(|e| *e).map(|component| (component,)),
844            self.tx_id,
845            0x4d64b0de827070bd,
846            fidl::encoding::DynamicFlags::empty(),
847        )
848    }
849}
850
851mod internal {
852    use super::*;
853
854    impl fidl::encoding::ResourceTypeMarker for ResolverResolveWithContextResponse {
855        type Borrowed<'a> = &'a mut Self;
856        fn take_or_borrow<'a>(
857            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
858        ) -> Self::Borrowed<'a> {
859            value
860        }
861    }
862
863    unsafe impl fidl::encoding::TypeMarker for ResolverResolveWithContextResponse {
864        type Owned = Self;
865
866        #[inline(always)]
867        fn inline_align(_context: fidl::encoding::Context) -> usize {
868            8
869        }
870
871        #[inline(always)]
872        fn inline_size(_context: fidl::encoding::Context) -> usize {
873            16
874        }
875    }
876
877    unsafe impl
878        fidl::encoding::Encode<
879            ResolverResolveWithContextResponse,
880            fidl::encoding::DefaultFuchsiaResourceDialect,
881        > for &mut ResolverResolveWithContextResponse
882    {
883        #[inline]
884        unsafe fn encode(
885            self,
886            encoder: &mut fidl::encoding::Encoder<
887                '_,
888                fidl::encoding::DefaultFuchsiaResourceDialect,
889            >,
890            offset: usize,
891            _depth: fidl::encoding::Depth,
892        ) -> fidl::Result<()> {
893            encoder.debug_check_bounds::<ResolverResolveWithContextResponse>(offset);
894            // Delegate to tuple encoding.
895            fidl::encoding::Encode::<
896                ResolverResolveWithContextResponse,
897                fidl::encoding::DefaultFuchsiaResourceDialect,
898            >::encode(
899                (<Component as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
900                    &mut self.component,
901                ),),
902                encoder,
903                offset,
904                _depth,
905            )
906        }
907    }
908    unsafe impl<
909        T0: fidl::encoding::Encode<Component, fidl::encoding::DefaultFuchsiaResourceDialect>,
910    >
911        fidl::encoding::Encode<
912            ResolverResolveWithContextResponse,
913            fidl::encoding::DefaultFuchsiaResourceDialect,
914        > for (T0,)
915    {
916        #[inline]
917        unsafe fn encode(
918            self,
919            encoder: &mut fidl::encoding::Encoder<
920                '_,
921                fidl::encoding::DefaultFuchsiaResourceDialect,
922            >,
923            offset: usize,
924            depth: fidl::encoding::Depth,
925        ) -> fidl::Result<()> {
926            encoder.debug_check_bounds::<ResolverResolveWithContextResponse>(offset);
927            // Zero out padding regions. There's no need to apply masks
928            // because the unmasked parts will be overwritten by fields.
929            // Write the fields.
930            self.0.encode(encoder, offset + 0, depth)?;
931            Ok(())
932        }
933    }
934
935    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
936        for ResolverResolveWithContextResponse
937    {
938        #[inline(always)]
939        fn new_empty() -> Self {
940            Self {
941                component: fidl::new_empty!(
942                    Component,
943                    fidl::encoding::DefaultFuchsiaResourceDialect
944                ),
945            }
946        }
947
948        #[inline]
949        unsafe fn decode(
950            &mut self,
951            decoder: &mut fidl::encoding::Decoder<
952                '_,
953                fidl::encoding::DefaultFuchsiaResourceDialect,
954            >,
955            offset: usize,
956            _depth: fidl::encoding::Depth,
957        ) -> fidl::Result<()> {
958            decoder.debug_check_bounds::<Self>(offset);
959            // Verify that padding bytes are zero.
960            fidl::decode!(
961                Component,
962                fidl::encoding::DefaultFuchsiaResourceDialect,
963                &mut self.component,
964                decoder,
965                offset + 0,
966                _depth
967            )?;
968            Ok(())
969        }
970    }
971
972    impl fidl::encoding::ResourceTypeMarker for ResolverResolveResponse {
973        type Borrowed<'a> = &'a mut Self;
974        fn take_or_borrow<'a>(
975            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
976        ) -> Self::Borrowed<'a> {
977            value
978        }
979    }
980
981    unsafe impl fidl::encoding::TypeMarker for ResolverResolveResponse {
982        type Owned = Self;
983
984        #[inline(always)]
985        fn inline_align(_context: fidl::encoding::Context) -> usize {
986            8
987        }
988
989        #[inline(always)]
990        fn inline_size(_context: fidl::encoding::Context) -> usize {
991            16
992        }
993    }
994
995    unsafe impl
996        fidl::encoding::Encode<
997            ResolverResolveResponse,
998            fidl::encoding::DefaultFuchsiaResourceDialect,
999        > for &mut ResolverResolveResponse
1000    {
1001        #[inline]
1002        unsafe fn encode(
1003            self,
1004            encoder: &mut fidl::encoding::Encoder<
1005                '_,
1006                fidl::encoding::DefaultFuchsiaResourceDialect,
1007            >,
1008            offset: usize,
1009            _depth: fidl::encoding::Depth,
1010        ) -> fidl::Result<()> {
1011            encoder.debug_check_bounds::<ResolverResolveResponse>(offset);
1012            // Delegate to tuple encoding.
1013            fidl::encoding::Encode::<
1014                ResolverResolveResponse,
1015                fidl::encoding::DefaultFuchsiaResourceDialect,
1016            >::encode(
1017                (<Component as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
1018                    &mut self.component,
1019                ),),
1020                encoder,
1021                offset,
1022                _depth,
1023            )
1024        }
1025    }
1026    unsafe impl<
1027        T0: fidl::encoding::Encode<Component, fidl::encoding::DefaultFuchsiaResourceDialect>,
1028    >
1029        fidl::encoding::Encode<
1030            ResolverResolveResponse,
1031            fidl::encoding::DefaultFuchsiaResourceDialect,
1032        > for (T0,)
1033    {
1034        #[inline]
1035        unsafe fn encode(
1036            self,
1037            encoder: &mut fidl::encoding::Encoder<
1038                '_,
1039                fidl::encoding::DefaultFuchsiaResourceDialect,
1040            >,
1041            offset: usize,
1042            depth: fidl::encoding::Depth,
1043        ) -> fidl::Result<()> {
1044            encoder.debug_check_bounds::<ResolverResolveResponse>(offset);
1045            // Zero out padding regions. There's no need to apply masks
1046            // because the unmasked parts will be overwritten by fields.
1047            // Write the fields.
1048            self.0.encode(encoder, offset + 0, depth)?;
1049            Ok(())
1050        }
1051    }
1052
1053    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1054        for ResolverResolveResponse
1055    {
1056        #[inline(always)]
1057        fn new_empty() -> Self {
1058            Self {
1059                component: fidl::new_empty!(
1060                    Component,
1061                    fidl::encoding::DefaultFuchsiaResourceDialect
1062                ),
1063            }
1064        }
1065
1066        #[inline]
1067        unsafe fn decode(
1068            &mut self,
1069            decoder: &mut fidl::encoding::Decoder<
1070                '_,
1071                fidl::encoding::DefaultFuchsiaResourceDialect,
1072            >,
1073            offset: usize,
1074            _depth: fidl::encoding::Depth,
1075        ) -> fidl::Result<()> {
1076            decoder.debug_check_bounds::<Self>(offset);
1077            // Verify that padding bytes are zero.
1078            fidl::decode!(
1079                Component,
1080                fidl::encoding::DefaultFuchsiaResourceDialect,
1081                &mut self.component,
1082                decoder,
1083                offset + 0,
1084                _depth
1085            )?;
1086            Ok(())
1087        }
1088    }
1089
1090    impl Component {
1091        #[inline(always)]
1092        fn max_ordinal_present(&self) -> u64 {
1093            if let Some(_) = self.abi_revision {
1094                return 6;
1095            }
1096            if let Some(_) = self.resolution_context {
1097                return 5;
1098            }
1099            if let Some(_) = self.config_values {
1100                return 4;
1101            }
1102            if let Some(_) = self.package {
1103                return 3;
1104            }
1105            if let Some(_) = self.decl {
1106                return 2;
1107            }
1108            if let Some(_) = self.url {
1109                return 1;
1110            }
1111            0
1112        }
1113    }
1114
1115    impl fidl::encoding::ResourceTypeMarker for Component {
1116        type Borrowed<'a> = &'a mut Self;
1117        fn take_or_borrow<'a>(
1118            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1119        ) -> Self::Borrowed<'a> {
1120            value
1121        }
1122    }
1123
1124    unsafe impl fidl::encoding::TypeMarker for Component {
1125        type Owned = Self;
1126
1127        #[inline(always)]
1128        fn inline_align(_context: fidl::encoding::Context) -> usize {
1129            8
1130        }
1131
1132        #[inline(always)]
1133        fn inline_size(_context: fidl::encoding::Context) -> usize {
1134            16
1135        }
1136    }
1137
1138    unsafe impl fidl::encoding::Encode<Component, fidl::encoding::DefaultFuchsiaResourceDialect>
1139        for &mut Component
1140    {
1141        unsafe fn encode(
1142            self,
1143            encoder: &mut fidl::encoding::Encoder<
1144                '_,
1145                fidl::encoding::DefaultFuchsiaResourceDialect,
1146            >,
1147            offset: usize,
1148            mut depth: fidl::encoding::Depth,
1149        ) -> fidl::Result<()> {
1150            encoder.debug_check_bounds::<Component>(offset);
1151            // Vector header
1152            let max_ordinal: u64 = self.max_ordinal_present();
1153            encoder.write_num(max_ordinal, offset);
1154            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1155            // Calling encoder.out_of_line_offset(0) is not allowed.
1156            if max_ordinal == 0 {
1157                return Ok(());
1158            }
1159            depth.increment()?;
1160            let envelope_size = 8;
1161            let bytes_len = max_ordinal as usize * envelope_size;
1162            #[allow(unused_variables)]
1163            let offset = encoder.out_of_line_offset(bytes_len);
1164            let mut _prev_end_offset: usize = 0;
1165            if 1 > max_ordinal {
1166                return Ok(());
1167            }
1168
1169            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1170            // are envelope_size bytes.
1171            let cur_offset: usize = (1 - 1) * envelope_size;
1172
1173            // Zero reserved fields.
1174            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1175
1176            // Safety:
1177            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1178            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1179            //   envelope_size bytes, there is always sufficient room.
1180            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<2083>, fidl::encoding::DefaultFuchsiaResourceDialect>(
1181            self.url.as_ref().map(<fidl::encoding::BoundedString<2083> as fidl::encoding::ValueTypeMarker>::borrow),
1182            encoder, offset + cur_offset, depth
1183        )?;
1184
1185            _prev_end_offset = cur_offset + envelope_size;
1186            if 2 > max_ordinal {
1187                return Ok(());
1188            }
1189
1190            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1191            // are envelope_size bytes.
1192            let cur_offset: usize = (2 - 1) * envelope_size;
1193
1194            // Zero reserved fields.
1195            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1196
1197            // Safety:
1198            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1199            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1200            //   envelope_size bytes, there is always sufficient room.
1201            fidl::encoding::encode_in_envelope_optional::<
1202                fidl_fuchsia_mem::Data,
1203                fidl::encoding::DefaultFuchsiaResourceDialect,
1204            >(
1205                self.decl.as_mut().map(
1206                    <fidl_fuchsia_mem::Data as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1207                ),
1208                encoder,
1209                offset + cur_offset,
1210                depth,
1211            )?;
1212
1213            _prev_end_offset = cur_offset + envelope_size;
1214            if 3 > max_ordinal {
1215                return Ok(());
1216            }
1217
1218            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1219            // are envelope_size bytes.
1220            let cur_offset: usize = (3 - 1) * envelope_size;
1221
1222            // Zero reserved fields.
1223            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1224
1225            // Safety:
1226            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1227            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1228            //   envelope_size bytes, there is always sufficient room.
1229            fidl::encoding::encode_in_envelope_optional::<
1230                Package,
1231                fidl::encoding::DefaultFuchsiaResourceDialect,
1232            >(
1233                self.package
1234                    .as_mut()
1235                    .map(<Package as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
1236                encoder,
1237                offset + cur_offset,
1238                depth,
1239            )?;
1240
1241            _prev_end_offset = cur_offset + envelope_size;
1242            if 4 > max_ordinal {
1243                return Ok(());
1244            }
1245
1246            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1247            // are envelope_size bytes.
1248            let cur_offset: usize = (4 - 1) * envelope_size;
1249
1250            // Zero reserved fields.
1251            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1252
1253            // Safety:
1254            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1255            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1256            //   envelope_size bytes, there is always sufficient room.
1257            fidl::encoding::encode_in_envelope_optional::<
1258                fidl_fuchsia_mem::Data,
1259                fidl::encoding::DefaultFuchsiaResourceDialect,
1260            >(
1261                self.config_values.as_mut().map(
1262                    <fidl_fuchsia_mem::Data as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1263                ),
1264                encoder,
1265                offset + cur_offset,
1266                depth,
1267            )?;
1268
1269            _prev_end_offset = cur_offset + envelope_size;
1270            if 5 > max_ordinal {
1271                return Ok(());
1272            }
1273
1274            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1275            // are envelope_size bytes.
1276            let cur_offset: usize = (5 - 1) * envelope_size;
1277
1278            // Zero reserved fields.
1279            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1280
1281            // Safety:
1282            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1283            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1284            //   envelope_size bytes, there is always sufficient room.
1285            fidl::encoding::encode_in_envelope_optional::<
1286                Context,
1287                fidl::encoding::DefaultFuchsiaResourceDialect,
1288            >(
1289                self.resolution_context
1290                    .as_ref()
1291                    .map(<Context as fidl::encoding::ValueTypeMarker>::borrow),
1292                encoder,
1293                offset + cur_offset,
1294                depth,
1295            )?;
1296
1297            _prev_end_offset = cur_offset + envelope_size;
1298            if 6 > max_ordinal {
1299                return Ok(());
1300            }
1301
1302            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1303            // are envelope_size bytes.
1304            let cur_offset: usize = (6 - 1) * envelope_size;
1305
1306            // Zero reserved fields.
1307            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1308
1309            // Safety:
1310            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1311            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1312            //   envelope_size bytes, there is always sufficient room.
1313            fidl::encoding::encode_in_envelope_optional::<
1314                u64,
1315                fidl::encoding::DefaultFuchsiaResourceDialect,
1316            >(
1317                self.abi_revision.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1318                encoder,
1319                offset + cur_offset,
1320                depth,
1321            )?;
1322
1323            _prev_end_offset = cur_offset + envelope_size;
1324
1325            Ok(())
1326        }
1327    }
1328
1329    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Component {
1330        #[inline(always)]
1331        fn new_empty() -> Self {
1332            Self::default()
1333        }
1334
1335        unsafe fn decode(
1336            &mut self,
1337            decoder: &mut fidl::encoding::Decoder<
1338                '_,
1339                fidl::encoding::DefaultFuchsiaResourceDialect,
1340            >,
1341            offset: usize,
1342            mut depth: fidl::encoding::Depth,
1343        ) -> fidl::Result<()> {
1344            decoder.debug_check_bounds::<Self>(offset);
1345            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1346                None => return Err(fidl::Error::NotNullable),
1347                Some(len) => len,
1348            };
1349            // Calling decoder.out_of_line_offset(0) is not allowed.
1350            if len == 0 {
1351                return Ok(());
1352            };
1353            depth.increment()?;
1354            let envelope_size = 8;
1355            let bytes_len = len * envelope_size;
1356            let offset = decoder.out_of_line_offset(bytes_len)?;
1357            // Decode the envelope for each type.
1358            let mut _next_ordinal_to_read = 0;
1359            let mut next_offset = offset;
1360            let end_offset = offset + bytes_len;
1361            _next_ordinal_to_read += 1;
1362            if next_offset >= end_offset {
1363                return Ok(());
1364            }
1365
1366            // Decode unknown envelopes for gaps in ordinals.
1367            while _next_ordinal_to_read < 1 {
1368                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1369                _next_ordinal_to_read += 1;
1370                next_offset += envelope_size;
1371            }
1372
1373            let next_out_of_line = decoder.next_out_of_line();
1374            let handles_before = decoder.remaining_handles();
1375            if let Some((inlined, num_bytes, num_handles)) =
1376                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1377            {
1378                let member_inline_size = <fidl::encoding::BoundedString<2083> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1379                if inlined != (member_inline_size <= 4) {
1380                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1381                }
1382                let inner_offset;
1383                let mut inner_depth = depth.clone();
1384                if inlined {
1385                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1386                    inner_offset = next_offset;
1387                } else {
1388                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1389                    inner_depth.increment()?;
1390                }
1391                let val_ref = self.url.get_or_insert_with(|| {
1392                    fidl::new_empty!(
1393                        fidl::encoding::BoundedString<2083>,
1394                        fidl::encoding::DefaultFuchsiaResourceDialect
1395                    )
1396                });
1397                fidl::decode!(
1398                    fidl::encoding::BoundedString<2083>,
1399                    fidl::encoding::DefaultFuchsiaResourceDialect,
1400                    val_ref,
1401                    decoder,
1402                    inner_offset,
1403                    inner_depth
1404                )?;
1405                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1406                {
1407                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1408                }
1409                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1410                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1411                }
1412            }
1413
1414            next_offset += envelope_size;
1415            _next_ordinal_to_read += 1;
1416            if next_offset >= end_offset {
1417                return Ok(());
1418            }
1419
1420            // Decode unknown envelopes for gaps in ordinals.
1421            while _next_ordinal_to_read < 2 {
1422                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1423                _next_ordinal_to_read += 1;
1424                next_offset += envelope_size;
1425            }
1426
1427            let next_out_of_line = decoder.next_out_of_line();
1428            let handles_before = decoder.remaining_handles();
1429            if let Some((inlined, num_bytes, num_handles)) =
1430                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1431            {
1432                let member_inline_size =
1433                    <fidl_fuchsia_mem::Data as fidl::encoding::TypeMarker>::inline_size(
1434                        decoder.context,
1435                    );
1436                if inlined != (member_inline_size <= 4) {
1437                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1438                }
1439                let inner_offset;
1440                let mut inner_depth = depth.clone();
1441                if inlined {
1442                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1443                    inner_offset = next_offset;
1444                } else {
1445                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1446                    inner_depth.increment()?;
1447                }
1448                let val_ref = self.decl.get_or_insert_with(|| {
1449                    fidl::new_empty!(
1450                        fidl_fuchsia_mem::Data,
1451                        fidl::encoding::DefaultFuchsiaResourceDialect
1452                    )
1453                });
1454                fidl::decode!(
1455                    fidl_fuchsia_mem::Data,
1456                    fidl::encoding::DefaultFuchsiaResourceDialect,
1457                    val_ref,
1458                    decoder,
1459                    inner_offset,
1460                    inner_depth
1461                )?;
1462                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1463                {
1464                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1465                }
1466                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1467                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1468                }
1469            }
1470
1471            next_offset += envelope_size;
1472            _next_ordinal_to_read += 1;
1473            if next_offset >= end_offset {
1474                return Ok(());
1475            }
1476
1477            // Decode unknown envelopes for gaps in ordinals.
1478            while _next_ordinal_to_read < 3 {
1479                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1480                _next_ordinal_to_read += 1;
1481                next_offset += envelope_size;
1482            }
1483
1484            let next_out_of_line = decoder.next_out_of_line();
1485            let handles_before = decoder.remaining_handles();
1486            if let Some((inlined, num_bytes, num_handles)) =
1487                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1488            {
1489                let member_inline_size =
1490                    <Package as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1491                if inlined != (member_inline_size <= 4) {
1492                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1493                }
1494                let inner_offset;
1495                let mut inner_depth = depth.clone();
1496                if inlined {
1497                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1498                    inner_offset = next_offset;
1499                } else {
1500                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1501                    inner_depth.increment()?;
1502                }
1503                let val_ref = self.package.get_or_insert_with(|| {
1504                    fidl::new_empty!(Package, fidl::encoding::DefaultFuchsiaResourceDialect)
1505                });
1506                fidl::decode!(
1507                    Package,
1508                    fidl::encoding::DefaultFuchsiaResourceDialect,
1509                    val_ref,
1510                    decoder,
1511                    inner_offset,
1512                    inner_depth
1513                )?;
1514                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1515                {
1516                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1517                }
1518                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1519                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1520                }
1521            }
1522
1523            next_offset += envelope_size;
1524            _next_ordinal_to_read += 1;
1525            if next_offset >= end_offset {
1526                return Ok(());
1527            }
1528
1529            // Decode unknown envelopes for gaps in ordinals.
1530            while _next_ordinal_to_read < 4 {
1531                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1532                _next_ordinal_to_read += 1;
1533                next_offset += envelope_size;
1534            }
1535
1536            let next_out_of_line = decoder.next_out_of_line();
1537            let handles_before = decoder.remaining_handles();
1538            if let Some((inlined, num_bytes, num_handles)) =
1539                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1540            {
1541                let member_inline_size =
1542                    <fidl_fuchsia_mem::Data as fidl::encoding::TypeMarker>::inline_size(
1543                        decoder.context,
1544                    );
1545                if inlined != (member_inline_size <= 4) {
1546                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1547                }
1548                let inner_offset;
1549                let mut inner_depth = depth.clone();
1550                if inlined {
1551                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1552                    inner_offset = next_offset;
1553                } else {
1554                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1555                    inner_depth.increment()?;
1556                }
1557                let val_ref = self.config_values.get_or_insert_with(|| {
1558                    fidl::new_empty!(
1559                        fidl_fuchsia_mem::Data,
1560                        fidl::encoding::DefaultFuchsiaResourceDialect
1561                    )
1562                });
1563                fidl::decode!(
1564                    fidl_fuchsia_mem::Data,
1565                    fidl::encoding::DefaultFuchsiaResourceDialect,
1566                    val_ref,
1567                    decoder,
1568                    inner_offset,
1569                    inner_depth
1570                )?;
1571                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1572                {
1573                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1574                }
1575                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1576                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1577                }
1578            }
1579
1580            next_offset += envelope_size;
1581            _next_ordinal_to_read += 1;
1582            if next_offset >= end_offset {
1583                return Ok(());
1584            }
1585
1586            // Decode unknown envelopes for gaps in ordinals.
1587            while _next_ordinal_to_read < 5 {
1588                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1589                _next_ordinal_to_read += 1;
1590                next_offset += envelope_size;
1591            }
1592
1593            let next_out_of_line = decoder.next_out_of_line();
1594            let handles_before = decoder.remaining_handles();
1595            if let Some((inlined, num_bytes, num_handles)) =
1596                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1597            {
1598                let member_inline_size =
1599                    <Context as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1600                if inlined != (member_inline_size <= 4) {
1601                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1602                }
1603                let inner_offset;
1604                let mut inner_depth = depth.clone();
1605                if inlined {
1606                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1607                    inner_offset = next_offset;
1608                } else {
1609                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1610                    inner_depth.increment()?;
1611                }
1612                let val_ref = self.resolution_context.get_or_insert_with(|| {
1613                    fidl::new_empty!(Context, fidl::encoding::DefaultFuchsiaResourceDialect)
1614                });
1615                fidl::decode!(
1616                    Context,
1617                    fidl::encoding::DefaultFuchsiaResourceDialect,
1618                    val_ref,
1619                    decoder,
1620                    inner_offset,
1621                    inner_depth
1622                )?;
1623                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1624                {
1625                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1626                }
1627                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1628                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1629                }
1630            }
1631
1632            next_offset += envelope_size;
1633            _next_ordinal_to_read += 1;
1634            if next_offset >= end_offset {
1635                return Ok(());
1636            }
1637
1638            // Decode unknown envelopes for gaps in ordinals.
1639            while _next_ordinal_to_read < 6 {
1640                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1641                _next_ordinal_to_read += 1;
1642                next_offset += envelope_size;
1643            }
1644
1645            let next_out_of_line = decoder.next_out_of_line();
1646            let handles_before = decoder.remaining_handles();
1647            if let Some((inlined, num_bytes, num_handles)) =
1648                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1649            {
1650                let member_inline_size =
1651                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1652                if inlined != (member_inline_size <= 4) {
1653                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1654                }
1655                let inner_offset;
1656                let mut inner_depth = depth.clone();
1657                if inlined {
1658                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1659                    inner_offset = next_offset;
1660                } else {
1661                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1662                    inner_depth.increment()?;
1663                }
1664                let val_ref = self.abi_revision.get_or_insert_with(|| {
1665                    fidl::new_empty!(u64, fidl::encoding::DefaultFuchsiaResourceDialect)
1666                });
1667                fidl::decode!(
1668                    u64,
1669                    fidl::encoding::DefaultFuchsiaResourceDialect,
1670                    val_ref,
1671                    decoder,
1672                    inner_offset,
1673                    inner_depth
1674                )?;
1675                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1676                {
1677                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1678                }
1679                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1680                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1681                }
1682            }
1683
1684            next_offset += envelope_size;
1685
1686            // Decode the remaining unknown envelopes.
1687            while next_offset < end_offset {
1688                _next_ordinal_to_read += 1;
1689                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1690                next_offset += envelope_size;
1691            }
1692
1693            Ok(())
1694        }
1695    }
1696
1697    impl Package {
1698        #[inline(always)]
1699        fn max_ordinal_present(&self) -> u64 {
1700            if let Some(_) = self.directory {
1701                return 2;
1702            }
1703            if let Some(_) = self.url {
1704                return 1;
1705            }
1706            0
1707        }
1708    }
1709
1710    impl fidl::encoding::ResourceTypeMarker for Package {
1711        type Borrowed<'a> = &'a mut Self;
1712        fn take_or_borrow<'a>(
1713            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1714        ) -> Self::Borrowed<'a> {
1715            value
1716        }
1717    }
1718
1719    unsafe impl fidl::encoding::TypeMarker for Package {
1720        type Owned = Self;
1721
1722        #[inline(always)]
1723        fn inline_align(_context: fidl::encoding::Context) -> usize {
1724            8
1725        }
1726
1727        #[inline(always)]
1728        fn inline_size(_context: fidl::encoding::Context) -> usize {
1729            16
1730        }
1731    }
1732
1733    unsafe impl fidl::encoding::Encode<Package, fidl::encoding::DefaultFuchsiaResourceDialect>
1734        for &mut Package
1735    {
1736        unsafe fn encode(
1737            self,
1738            encoder: &mut fidl::encoding::Encoder<
1739                '_,
1740                fidl::encoding::DefaultFuchsiaResourceDialect,
1741            >,
1742            offset: usize,
1743            mut depth: fidl::encoding::Depth,
1744        ) -> fidl::Result<()> {
1745            encoder.debug_check_bounds::<Package>(offset);
1746            // Vector header
1747            let max_ordinal: u64 = self.max_ordinal_present();
1748            encoder.write_num(max_ordinal, offset);
1749            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1750            // Calling encoder.out_of_line_offset(0) is not allowed.
1751            if max_ordinal == 0 {
1752                return Ok(());
1753            }
1754            depth.increment()?;
1755            let envelope_size = 8;
1756            let bytes_len = max_ordinal as usize * envelope_size;
1757            #[allow(unused_variables)]
1758            let offset = encoder.out_of_line_offset(bytes_len);
1759            let mut _prev_end_offset: usize = 0;
1760            if 1 > max_ordinal {
1761                return Ok(());
1762            }
1763
1764            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1765            // are envelope_size bytes.
1766            let cur_offset: usize = (1 - 1) * envelope_size;
1767
1768            // Zero reserved fields.
1769            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1770
1771            // Safety:
1772            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1773            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1774            //   envelope_size bytes, there is always sufficient room.
1775            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<2083>, fidl::encoding::DefaultFuchsiaResourceDialect>(
1776            self.url.as_ref().map(<fidl::encoding::BoundedString<2083> as fidl::encoding::ValueTypeMarker>::borrow),
1777            encoder, offset + cur_offset, depth
1778        )?;
1779
1780            _prev_end_offset = cur_offset + envelope_size;
1781            if 2 > max_ordinal {
1782                return Ok(());
1783            }
1784
1785            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1786            // are envelope_size bytes.
1787            let cur_offset: usize = (2 - 1) * envelope_size;
1788
1789            // Zero reserved fields.
1790            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1791
1792            // Safety:
1793            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1794            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1795            //   envelope_size bytes, there is always sufficient room.
1796            fidl::encoding::encode_in_envelope_optional::<
1797                fidl::encoding::Endpoint<
1798                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1799                >,
1800                fidl::encoding::DefaultFuchsiaResourceDialect,
1801            >(
1802                self.directory.as_mut().map(
1803                    <fidl::encoding::Endpoint<
1804                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1805                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1806                ),
1807                encoder,
1808                offset + cur_offset,
1809                depth,
1810            )?;
1811
1812            _prev_end_offset = cur_offset + envelope_size;
1813
1814            Ok(())
1815        }
1816    }
1817
1818    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Package {
1819        #[inline(always)]
1820        fn new_empty() -> Self {
1821            Self::default()
1822        }
1823
1824        unsafe fn decode(
1825            &mut self,
1826            decoder: &mut fidl::encoding::Decoder<
1827                '_,
1828                fidl::encoding::DefaultFuchsiaResourceDialect,
1829            >,
1830            offset: usize,
1831            mut depth: fidl::encoding::Depth,
1832        ) -> fidl::Result<()> {
1833            decoder.debug_check_bounds::<Self>(offset);
1834            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1835                None => return Err(fidl::Error::NotNullable),
1836                Some(len) => len,
1837            };
1838            // Calling decoder.out_of_line_offset(0) is not allowed.
1839            if len == 0 {
1840                return Ok(());
1841            };
1842            depth.increment()?;
1843            let envelope_size = 8;
1844            let bytes_len = len * envelope_size;
1845            let offset = decoder.out_of_line_offset(bytes_len)?;
1846            // Decode the envelope for each type.
1847            let mut _next_ordinal_to_read = 0;
1848            let mut next_offset = offset;
1849            let end_offset = offset + bytes_len;
1850            _next_ordinal_to_read += 1;
1851            if next_offset >= end_offset {
1852                return Ok(());
1853            }
1854
1855            // Decode unknown envelopes for gaps in ordinals.
1856            while _next_ordinal_to_read < 1 {
1857                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1858                _next_ordinal_to_read += 1;
1859                next_offset += envelope_size;
1860            }
1861
1862            let next_out_of_line = decoder.next_out_of_line();
1863            let handles_before = decoder.remaining_handles();
1864            if let Some((inlined, num_bytes, num_handles)) =
1865                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1866            {
1867                let member_inline_size = <fidl::encoding::BoundedString<2083> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1868                if inlined != (member_inline_size <= 4) {
1869                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1870                }
1871                let inner_offset;
1872                let mut inner_depth = depth.clone();
1873                if inlined {
1874                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1875                    inner_offset = next_offset;
1876                } else {
1877                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1878                    inner_depth.increment()?;
1879                }
1880                let val_ref = self.url.get_or_insert_with(|| {
1881                    fidl::new_empty!(
1882                        fidl::encoding::BoundedString<2083>,
1883                        fidl::encoding::DefaultFuchsiaResourceDialect
1884                    )
1885                });
1886                fidl::decode!(
1887                    fidl::encoding::BoundedString<2083>,
1888                    fidl::encoding::DefaultFuchsiaResourceDialect,
1889                    val_ref,
1890                    decoder,
1891                    inner_offset,
1892                    inner_depth
1893                )?;
1894                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1895                {
1896                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1897                }
1898                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1899                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1900                }
1901            }
1902
1903            next_offset += envelope_size;
1904            _next_ordinal_to_read += 1;
1905            if next_offset >= end_offset {
1906                return Ok(());
1907            }
1908
1909            // Decode unknown envelopes for gaps in ordinals.
1910            while _next_ordinal_to_read < 2 {
1911                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1912                _next_ordinal_to_read += 1;
1913                next_offset += envelope_size;
1914            }
1915
1916            let next_out_of_line = decoder.next_out_of_line();
1917            let handles_before = decoder.remaining_handles();
1918            if let Some((inlined, num_bytes, num_handles)) =
1919                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1920            {
1921                let member_inline_size = <fidl::encoding::Endpoint<
1922                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1923                > as fidl::encoding::TypeMarker>::inline_size(
1924                    decoder.context
1925                );
1926                if inlined != (member_inline_size <= 4) {
1927                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1928                }
1929                let inner_offset;
1930                let mut inner_depth = depth.clone();
1931                if inlined {
1932                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1933                    inner_offset = next_offset;
1934                } else {
1935                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1936                    inner_depth.increment()?;
1937                }
1938                let val_ref = self.directory.get_or_insert_with(|| {
1939                    fidl::new_empty!(
1940                        fidl::encoding::Endpoint<
1941                            fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1942                        >,
1943                        fidl::encoding::DefaultFuchsiaResourceDialect
1944                    )
1945                });
1946                fidl::decode!(
1947                    fidl::encoding::Endpoint<
1948                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1949                    >,
1950                    fidl::encoding::DefaultFuchsiaResourceDialect,
1951                    val_ref,
1952                    decoder,
1953                    inner_offset,
1954                    inner_depth
1955                )?;
1956                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1957                {
1958                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1959                }
1960                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1961                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1962                }
1963            }
1964
1965            next_offset += envelope_size;
1966
1967            // Decode the remaining unknown envelopes.
1968            while next_offset < end_offset {
1969                _next_ordinal_to_read += 1;
1970                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1971                next_offset += envelope_size;
1972            }
1973
1974            Ok(())
1975        }
1976    }
1977}