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