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        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::NullableHandle {
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
689    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
690        self.inner.shutdown_with_epitaph(status)
691    }
692
693    fn is_closed(&self) -> bool {
694        self.inner.channel().is_closed()
695    }
696    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
697        self.inner.channel().on_closed()
698    }
699
700    #[cfg(target_os = "fuchsia")]
701    fn signal_peer(
702        &self,
703        clear_mask: zx::Signals,
704        set_mask: zx::Signals,
705    ) -> Result<(), zx_status::Status> {
706        use fidl::Peered;
707        self.inner.channel().signal_peer(clear_mask, set_mask)
708    }
709}
710
711impl ResolverControlHandle {}
712
713#[must_use = "FIDL methods require a response to be sent"]
714#[derive(Debug)]
715pub struct ResolverResolveResponder {
716    control_handle: std::mem::ManuallyDrop<ResolverControlHandle>,
717    tx_id: u32,
718}
719
720/// Set the the channel to be shutdown (see [`ResolverControlHandle::shutdown`])
721/// if the responder is dropped without sending a response, so that the client
722/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
723impl std::ops::Drop for ResolverResolveResponder {
724    fn drop(&mut self) {
725        self.control_handle.shutdown();
726        // Safety: drops once, never accessed again
727        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
728    }
729}
730
731impl fidl::endpoints::Responder for ResolverResolveResponder {
732    type ControlHandle = ResolverControlHandle;
733
734    fn control_handle(&self) -> &ResolverControlHandle {
735        &self.control_handle
736    }
737
738    fn drop_without_shutdown(mut self) {
739        // Safety: drops once, never accessed again due to mem::forget
740        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
741        // Prevent Drop from running (which would shut down the channel)
742        std::mem::forget(self);
743    }
744}
745
746impl ResolverResolveResponder {
747    /// Sends a response to the FIDL transaction.
748    ///
749    /// Sets the channel to shutdown if an error occurs.
750    pub fn send(self, mut result: Result<Component, ResolverError>) -> Result<(), fidl::Error> {
751        let _result = self.send_raw(result);
752        if _result.is_err() {
753            self.control_handle.shutdown();
754        }
755        self.drop_without_shutdown();
756        _result
757    }
758
759    /// Similar to "send" but does not shutdown the channel if an error occurs.
760    pub fn send_no_shutdown_on_err(
761        self,
762        mut result: Result<Component, ResolverError>,
763    ) -> Result<(), fidl::Error> {
764        let _result = self.send_raw(result);
765        self.drop_without_shutdown();
766        _result
767    }
768
769    fn send_raw(&self, mut result: Result<Component, ResolverError>) -> Result<(), fidl::Error> {
770        self.control_handle
771            .inner
772            .send::<fidl::encoding::ResultType<ResolverResolveResponse, ResolverError>>(
773                result.as_mut().map_err(|e| *e).map(|component| (component,)),
774                self.tx_id,
775                0x57f9cfe88bf1f2e5,
776                fidl::encoding::DynamicFlags::empty(),
777            )
778    }
779}
780
781#[must_use = "FIDL methods require a response to be sent"]
782#[derive(Debug)]
783pub struct ResolverResolveWithContextResponder {
784    control_handle: std::mem::ManuallyDrop<ResolverControlHandle>,
785    tx_id: u32,
786}
787
788/// Set the the channel to be shutdown (see [`ResolverControlHandle::shutdown`])
789/// if the responder is dropped without sending a response, so that the client
790/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
791impl std::ops::Drop for ResolverResolveWithContextResponder {
792    fn drop(&mut self) {
793        self.control_handle.shutdown();
794        // Safety: drops once, never accessed again
795        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
796    }
797}
798
799impl fidl::endpoints::Responder for ResolverResolveWithContextResponder {
800    type ControlHandle = ResolverControlHandle;
801
802    fn control_handle(&self) -> &ResolverControlHandle {
803        &self.control_handle
804    }
805
806    fn drop_without_shutdown(mut self) {
807        // Safety: drops once, never accessed again due to mem::forget
808        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
809        // Prevent Drop from running (which would shut down the channel)
810        std::mem::forget(self);
811    }
812}
813
814impl ResolverResolveWithContextResponder {
815    /// Sends a response to the FIDL transaction.
816    ///
817    /// Sets the channel to shutdown if an error occurs.
818    pub fn send(self, mut result: Result<Component, ResolverError>) -> Result<(), fidl::Error> {
819        let _result = self.send_raw(result);
820        if _result.is_err() {
821            self.control_handle.shutdown();
822        }
823        self.drop_without_shutdown();
824        _result
825    }
826
827    /// Similar to "send" but does not shutdown the channel if an error occurs.
828    pub fn send_no_shutdown_on_err(
829        self,
830        mut result: Result<Component, ResolverError>,
831    ) -> Result<(), fidl::Error> {
832        let _result = self.send_raw(result);
833        self.drop_without_shutdown();
834        _result
835    }
836
837    fn send_raw(&self, mut result: Result<Component, ResolverError>) -> Result<(), fidl::Error> {
838        self.control_handle.inner.send::<fidl::encoding::ResultType<
839            ResolverResolveWithContextResponse,
840            ResolverError,
841        >>(
842            result.as_mut().map_err(|e| *e).map(|component| (component,)),
843            self.tx_id,
844            0x4d64b0de827070bd,
845            fidl::encoding::DynamicFlags::empty(),
846        )
847    }
848}
849
850mod internal {
851    use super::*;
852
853    impl fidl::encoding::ResourceTypeMarker for ResolverResolveWithContextResponse {
854        type Borrowed<'a> = &'a mut Self;
855        fn take_or_borrow<'a>(
856            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
857        ) -> Self::Borrowed<'a> {
858            value
859        }
860    }
861
862    unsafe impl fidl::encoding::TypeMarker for ResolverResolveWithContextResponse {
863        type Owned = Self;
864
865        #[inline(always)]
866        fn inline_align(_context: fidl::encoding::Context) -> usize {
867            8
868        }
869
870        #[inline(always)]
871        fn inline_size(_context: fidl::encoding::Context) -> usize {
872            16
873        }
874    }
875
876    unsafe impl
877        fidl::encoding::Encode<
878            ResolverResolveWithContextResponse,
879            fidl::encoding::DefaultFuchsiaResourceDialect,
880        > for &mut ResolverResolveWithContextResponse
881    {
882        #[inline]
883        unsafe fn encode(
884            self,
885            encoder: &mut fidl::encoding::Encoder<
886                '_,
887                fidl::encoding::DefaultFuchsiaResourceDialect,
888            >,
889            offset: usize,
890            _depth: fidl::encoding::Depth,
891        ) -> fidl::Result<()> {
892            encoder.debug_check_bounds::<ResolverResolveWithContextResponse>(offset);
893            // Delegate to tuple encoding.
894            fidl::encoding::Encode::<
895                ResolverResolveWithContextResponse,
896                fidl::encoding::DefaultFuchsiaResourceDialect,
897            >::encode(
898                (<Component as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
899                    &mut self.component,
900                ),),
901                encoder,
902                offset,
903                _depth,
904            )
905        }
906    }
907    unsafe impl<
908        T0: fidl::encoding::Encode<Component, fidl::encoding::DefaultFuchsiaResourceDialect>,
909    >
910        fidl::encoding::Encode<
911            ResolverResolveWithContextResponse,
912            fidl::encoding::DefaultFuchsiaResourceDialect,
913        > for (T0,)
914    {
915        #[inline]
916        unsafe fn encode(
917            self,
918            encoder: &mut fidl::encoding::Encoder<
919                '_,
920                fidl::encoding::DefaultFuchsiaResourceDialect,
921            >,
922            offset: usize,
923            depth: fidl::encoding::Depth,
924        ) -> fidl::Result<()> {
925            encoder.debug_check_bounds::<ResolverResolveWithContextResponse>(offset);
926            // Zero out padding regions. There's no need to apply masks
927            // because the unmasked parts will be overwritten by fields.
928            // Write the fields.
929            self.0.encode(encoder, offset + 0, depth)?;
930            Ok(())
931        }
932    }
933
934    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
935        for ResolverResolveWithContextResponse
936    {
937        #[inline(always)]
938        fn new_empty() -> Self {
939            Self {
940                component: fidl::new_empty!(
941                    Component,
942                    fidl::encoding::DefaultFuchsiaResourceDialect
943                ),
944            }
945        }
946
947        #[inline]
948        unsafe fn decode(
949            &mut self,
950            decoder: &mut fidl::encoding::Decoder<
951                '_,
952                fidl::encoding::DefaultFuchsiaResourceDialect,
953            >,
954            offset: usize,
955            _depth: fidl::encoding::Depth,
956        ) -> fidl::Result<()> {
957            decoder.debug_check_bounds::<Self>(offset);
958            // Verify that padding bytes are zero.
959            fidl::decode!(
960                Component,
961                fidl::encoding::DefaultFuchsiaResourceDialect,
962                &mut self.component,
963                decoder,
964                offset + 0,
965                _depth
966            )?;
967            Ok(())
968        }
969    }
970
971    impl fidl::encoding::ResourceTypeMarker for ResolverResolveResponse {
972        type Borrowed<'a> = &'a mut Self;
973        fn take_or_borrow<'a>(
974            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
975        ) -> Self::Borrowed<'a> {
976            value
977        }
978    }
979
980    unsafe impl fidl::encoding::TypeMarker for ResolverResolveResponse {
981        type Owned = Self;
982
983        #[inline(always)]
984        fn inline_align(_context: fidl::encoding::Context) -> usize {
985            8
986        }
987
988        #[inline(always)]
989        fn inline_size(_context: fidl::encoding::Context) -> usize {
990            16
991        }
992    }
993
994    unsafe impl
995        fidl::encoding::Encode<
996            ResolverResolveResponse,
997            fidl::encoding::DefaultFuchsiaResourceDialect,
998        > for &mut ResolverResolveResponse
999    {
1000        #[inline]
1001        unsafe fn encode(
1002            self,
1003            encoder: &mut fidl::encoding::Encoder<
1004                '_,
1005                fidl::encoding::DefaultFuchsiaResourceDialect,
1006            >,
1007            offset: usize,
1008            _depth: fidl::encoding::Depth,
1009        ) -> fidl::Result<()> {
1010            encoder.debug_check_bounds::<ResolverResolveResponse>(offset);
1011            // Delegate to tuple encoding.
1012            fidl::encoding::Encode::<
1013                ResolverResolveResponse,
1014                fidl::encoding::DefaultFuchsiaResourceDialect,
1015            >::encode(
1016                (<Component as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
1017                    &mut self.component,
1018                ),),
1019                encoder,
1020                offset,
1021                _depth,
1022            )
1023        }
1024    }
1025    unsafe impl<
1026        T0: fidl::encoding::Encode<Component, fidl::encoding::DefaultFuchsiaResourceDialect>,
1027    >
1028        fidl::encoding::Encode<
1029            ResolverResolveResponse,
1030            fidl::encoding::DefaultFuchsiaResourceDialect,
1031        > for (T0,)
1032    {
1033        #[inline]
1034        unsafe fn encode(
1035            self,
1036            encoder: &mut fidl::encoding::Encoder<
1037                '_,
1038                fidl::encoding::DefaultFuchsiaResourceDialect,
1039            >,
1040            offset: usize,
1041            depth: fidl::encoding::Depth,
1042        ) -> fidl::Result<()> {
1043            encoder.debug_check_bounds::<ResolverResolveResponse>(offset);
1044            // Zero out padding regions. There's no need to apply masks
1045            // because the unmasked parts will be overwritten by fields.
1046            // Write the fields.
1047            self.0.encode(encoder, offset + 0, depth)?;
1048            Ok(())
1049        }
1050    }
1051
1052    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1053        for ResolverResolveResponse
1054    {
1055        #[inline(always)]
1056        fn new_empty() -> Self {
1057            Self {
1058                component: fidl::new_empty!(
1059                    Component,
1060                    fidl::encoding::DefaultFuchsiaResourceDialect
1061                ),
1062            }
1063        }
1064
1065        #[inline]
1066        unsafe fn decode(
1067            &mut self,
1068            decoder: &mut fidl::encoding::Decoder<
1069                '_,
1070                fidl::encoding::DefaultFuchsiaResourceDialect,
1071            >,
1072            offset: usize,
1073            _depth: fidl::encoding::Depth,
1074        ) -> fidl::Result<()> {
1075            decoder.debug_check_bounds::<Self>(offset);
1076            // Verify that padding bytes are zero.
1077            fidl::decode!(
1078                Component,
1079                fidl::encoding::DefaultFuchsiaResourceDialect,
1080                &mut self.component,
1081                decoder,
1082                offset + 0,
1083                _depth
1084            )?;
1085            Ok(())
1086        }
1087    }
1088
1089    impl Component {
1090        #[inline(always)]
1091        fn max_ordinal_present(&self) -> u64 {
1092            if let Some(_) = self.abi_revision {
1093                return 6;
1094            }
1095            if let Some(_) = self.resolution_context {
1096                return 5;
1097            }
1098            if let Some(_) = self.config_values {
1099                return 4;
1100            }
1101            if let Some(_) = self.package {
1102                return 3;
1103            }
1104            if let Some(_) = self.decl {
1105                return 2;
1106            }
1107            if let Some(_) = self.url {
1108                return 1;
1109            }
1110            0
1111        }
1112    }
1113
1114    impl fidl::encoding::ResourceTypeMarker for Component {
1115        type Borrowed<'a> = &'a mut Self;
1116        fn take_or_borrow<'a>(
1117            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1118        ) -> Self::Borrowed<'a> {
1119            value
1120        }
1121    }
1122
1123    unsafe impl fidl::encoding::TypeMarker for Component {
1124        type Owned = Self;
1125
1126        #[inline(always)]
1127        fn inline_align(_context: fidl::encoding::Context) -> usize {
1128            8
1129        }
1130
1131        #[inline(always)]
1132        fn inline_size(_context: fidl::encoding::Context) -> usize {
1133            16
1134        }
1135    }
1136
1137    unsafe impl fidl::encoding::Encode<Component, fidl::encoding::DefaultFuchsiaResourceDialect>
1138        for &mut Component
1139    {
1140        unsafe fn encode(
1141            self,
1142            encoder: &mut fidl::encoding::Encoder<
1143                '_,
1144                fidl::encoding::DefaultFuchsiaResourceDialect,
1145            >,
1146            offset: usize,
1147            mut depth: fidl::encoding::Depth,
1148        ) -> fidl::Result<()> {
1149            encoder.debug_check_bounds::<Component>(offset);
1150            // Vector header
1151            let max_ordinal: u64 = self.max_ordinal_present();
1152            encoder.write_num(max_ordinal, offset);
1153            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1154            // Calling encoder.out_of_line_offset(0) is not allowed.
1155            if max_ordinal == 0 {
1156                return Ok(());
1157            }
1158            depth.increment()?;
1159            let envelope_size = 8;
1160            let bytes_len = max_ordinal as usize * envelope_size;
1161            #[allow(unused_variables)]
1162            let offset = encoder.out_of_line_offset(bytes_len);
1163            let mut _prev_end_offset: usize = 0;
1164            if 1 > max_ordinal {
1165                return Ok(());
1166            }
1167
1168            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1169            // are envelope_size bytes.
1170            let cur_offset: usize = (1 - 1) * envelope_size;
1171
1172            // Zero reserved fields.
1173            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1174
1175            // Safety:
1176            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1177            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1178            //   envelope_size bytes, there is always sufficient room.
1179            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<2083>, fidl::encoding::DefaultFuchsiaResourceDialect>(
1180            self.url.as_ref().map(<fidl::encoding::BoundedString<2083> as fidl::encoding::ValueTypeMarker>::borrow),
1181            encoder, offset + cur_offset, depth
1182        )?;
1183
1184            _prev_end_offset = cur_offset + envelope_size;
1185            if 2 > max_ordinal {
1186                return Ok(());
1187            }
1188
1189            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1190            // are envelope_size bytes.
1191            let cur_offset: usize = (2 - 1) * envelope_size;
1192
1193            // Zero reserved fields.
1194            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1195
1196            // Safety:
1197            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1198            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1199            //   envelope_size bytes, there is always sufficient room.
1200            fidl::encoding::encode_in_envelope_optional::<
1201                fidl_fuchsia_mem::Data,
1202                fidl::encoding::DefaultFuchsiaResourceDialect,
1203            >(
1204                self.decl.as_mut().map(
1205                    <fidl_fuchsia_mem::Data as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1206                ),
1207                encoder,
1208                offset + cur_offset,
1209                depth,
1210            )?;
1211
1212            _prev_end_offset = cur_offset + envelope_size;
1213            if 3 > max_ordinal {
1214                return Ok(());
1215            }
1216
1217            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1218            // are envelope_size bytes.
1219            let cur_offset: usize = (3 - 1) * envelope_size;
1220
1221            // Zero reserved fields.
1222            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1223
1224            // Safety:
1225            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1226            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1227            //   envelope_size bytes, there is always sufficient room.
1228            fidl::encoding::encode_in_envelope_optional::<
1229                Package,
1230                fidl::encoding::DefaultFuchsiaResourceDialect,
1231            >(
1232                self.package
1233                    .as_mut()
1234                    .map(<Package as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
1235                encoder,
1236                offset + cur_offset,
1237                depth,
1238            )?;
1239
1240            _prev_end_offset = cur_offset + envelope_size;
1241            if 4 > max_ordinal {
1242                return Ok(());
1243            }
1244
1245            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1246            // are envelope_size bytes.
1247            let cur_offset: usize = (4 - 1) * envelope_size;
1248
1249            // Zero reserved fields.
1250            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1251
1252            // Safety:
1253            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1254            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1255            //   envelope_size bytes, there is always sufficient room.
1256            fidl::encoding::encode_in_envelope_optional::<
1257                fidl_fuchsia_mem::Data,
1258                fidl::encoding::DefaultFuchsiaResourceDialect,
1259            >(
1260                self.config_values.as_mut().map(
1261                    <fidl_fuchsia_mem::Data as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1262                ),
1263                encoder,
1264                offset + cur_offset,
1265                depth,
1266            )?;
1267
1268            _prev_end_offset = cur_offset + envelope_size;
1269            if 5 > max_ordinal {
1270                return Ok(());
1271            }
1272
1273            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1274            // are envelope_size bytes.
1275            let cur_offset: usize = (5 - 1) * envelope_size;
1276
1277            // Zero reserved fields.
1278            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1279
1280            // Safety:
1281            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1282            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1283            //   envelope_size bytes, there is always sufficient room.
1284            fidl::encoding::encode_in_envelope_optional::<
1285                Context,
1286                fidl::encoding::DefaultFuchsiaResourceDialect,
1287            >(
1288                self.resolution_context
1289                    .as_ref()
1290                    .map(<Context as fidl::encoding::ValueTypeMarker>::borrow),
1291                encoder,
1292                offset + cur_offset,
1293                depth,
1294            )?;
1295
1296            _prev_end_offset = cur_offset + envelope_size;
1297            if 6 > max_ordinal {
1298                return Ok(());
1299            }
1300
1301            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1302            // are envelope_size bytes.
1303            let cur_offset: usize = (6 - 1) * envelope_size;
1304
1305            // Zero reserved fields.
1306            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1307
1308            // Safety:
1309            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1310            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1311            //   envelope_size bytes, there is always sufficient room.
1312            fidl::encoding::encode_in_envelope_optional::<
1313                u64,
1314                fidl::encoding::DefaultFuchsiaResourceDialect,
1315            >(
1316                self.abi_revision.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1317                encoder,
1318                offset + cur_offset,
1319                depth,
1320            )?;
1321
1322            _prev_end_offset = cur_offset + envelope_size;
1323
1324            Ok(())
1325        }
1326    }
1327
1328    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Component {
1329        #[inline(always)]
1330        fn new_empty() -> Self {
1331            Self::default()
1332        }
1333
1334        unsafe fn decode(
1335            &mut self,
1336            decoder: &mut fidl::encoding::Decoder<
1337                '_,
1338                fidl::encoding::DefaultFuchsiaResourceDialect,
1339            >,
1340            offset: usize,
1341            mut depth: fidl::encoding::Depth,
1342        ) -> fidl::Result<()> {
1343            decoder.debug_check_bounds::<Self>(offset);
1344            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1345                None => return Err(fidl::Error::NotNullable),
1346                Some(len) => len,
1347            };
1348            // Calling decoder.out_of_line_offset(0) is not allowed.
1349            if len == 0 {
1350                return Ok(());
1351            };
1352            depth.increment()?;
1353            let envelope_size = 8;
1354            let bytes_len = len * envelope_size;
1355            let offset = decoder.out_of_line_offset(bytes_len)?;
1356            // Decode the envelope for each type.
1357            let mut _next_ordinal_to_read = 0;
1358            let mut next_offset = offset;
1359            let end_offset = offset + bytes_len;
1360            _next_ordinal_to_read += 1;
1361            if next_offset >= end_offset {
1362                return Ok(());
1363            }
1364
1365            // Decode unknown envelopes for gaps in ordinals.
1366            while _next_ordinal_to_read < 1 {
1367                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1368                _next_ordinal_to_read += 1;
1369                next_offset += envelope_size;
1370            }
1371
1372            let next_out_of_line = decoder.next_out_of_line();
1373            let handles_before = decoder.remaining_handles();
1374            if let Some((inlined, num_bytes, num_handles)) =
1375                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1376            {
1377                let member_inline_size = <fidl::encoding::BoundedString<2083> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1378                if inlined != (member_inline_size <= 4) {
1379                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1380                }
1381                let inner_offset;
1382                let mut inner_depth = depth.clone();
1383                if inlined {
1384                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1385                    inner_offset = next_offset;
1386                } else {
1387                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1388                    inner_depth.increment()?;
1389                }
1390                let val_ref = self.url.get_or_insert_with(|| {
1391                    fidl::new_empty!(
1392                        fidl::encoding::BoundedString<2083>,
1393                        fidl::encoding::DefaultFuchsiaResourceDialect
1394                    )
1395                });
1396                fidl::decode!(
1397                    fidl::encoding::BoundedString<2083>,
1398                    fidl::encoding::DefaultFuchsiaResourceDialect,
1399                    val_ref,
1400                    decoder,
1401                    inner_offset,
1402                    inner_depth
1403                )?;
1404                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1405                {
1406                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1407                }
1408                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1409                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1410                }
1411            }
1412
1413            next_offset += envelope_size;
1414            _next_ordinal_to_read += 1;
1415            if next_offset >= end_offset {
1416                return Ok(());
1417            }
1418
1419            // Decode unknown envelopes for gaps in ordinals.
1420            while _next_ordinal_to_read < 2 {
1421                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1422                _next_ordinal_to_read += 1;
1423                next_offset += envelope_size;
1424            }
1425
1426            let next_out_of_line = decoder.next_out_of_line();
1427            let handles_before = decoder.remaining_handles();
1428            if let Some((inlined, num_bytes, num_handles)) =
1429                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1430            {
1431                let member_inline_size =
1432                    <fidl_fuchsia_mem::Data as fidl::encoding::TypeMarker>::inline_size(
1433                        decoder.context,
1434                    );
1435                if inlined != (member_inline_size <= 4) {
1436                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1437                }
1438                let inner_offset;
1439                let mut inner_depth = depth.clone();
1440                if inlined {
1441                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1442                    inner_offset = next_offset;
1443                } else {
1444                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1445                    inner_depth.increment()?;
1446                }
1447                let val_ref = self.decl.get_or_insert_with(|| {
1448                    fidl::new_empty!(
1449                        fidl_fuchsia_mem::Data,
1450                        fidl::encoding::DefaultFuchsiaResourceDialect
1451                    )
1452                });
1453                fidl::decode!(
1454                    fidl_fuchsia_mem::Data,
1455                    fidl::encoding::DefaultFuchsiaResourceDialect,
1456                    val_ref,
1457                    decoder,
1458                    inner_offset,
1459                    inner_depth
1460                )?;
1461                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1462                {
1463                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1464                }
1465                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1466                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1467                }
1468            }
1469
1470            next_offset += envelope_size;
1471            _next_ordinal_to_read += 1;
1472            if next_offset >= end_offset {
1473                return Ok(());
1474            }
1475
1476            // Decode unknown envelopes for gaps in ordinals.
1477            while _next_ordinal_to_read < 3 {
1478                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1479                _next_ordinal_to_read += 1;
1480                next_offset += envelope_size;
1481            }
1482
1483            let next_out_of_line = decoder.next_out_of_line();
1484            let handles_before = decoder.remaining_handles();
1485            if let Some((inlined, num_bytes, num_handles)) =
1486                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1487            {
1488                let member_inline_size =
1489                    <Package as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1490                if inlined != (member_inline_size <= 4) {
1491                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1492                }
1493                let inner_offset;
1494                let mut inner_depth = depth.clone();
1495                if inlined {
1496                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1497                    inner_offset = next_offset;
1498                } else {
1499                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1500                    inner_depth.increment()?;
1501                }
1502                let val_ref = self.package.get_or_insert_with(|| {
1503                    fidl::new_empty!(Package, fidl::encoding::DefaultFuchsiaResourceDialect)
1504                });
1505                fidl::decode!(
1506                    Package,
1507                    fidl::encoding::DefaultFuchsiaResourceDialect,
1508                    val_ref,
1509                    decoder,
1510                    inner_offset,
1511                    inner_depth
1512                )?;
1513                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1514                {
1515                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1516                }
1517                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1518                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1519                }
1520            }
1521
1522            next_offset += envelope_size;
1523            _next_ordinal_to_read += 1;
1524            if next_offset >= end_offset {
1525                return Ok(());
1526            }
1527
1528            // Decode unknown envelopes for gaps in ordinals.
1529            while _next_ordinal_to_read < 4 {
1530                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1531                _next_ordinal_to_read += 1;
1532                next_offset += envelope_size;
1533            }
1534
1535            let next_out_of_line = decoder.next_out_of_line();
1536            let handles_before = decoder.remaining_handles();
1537            if let Some((inlined, num_bytes, num_handles)) =
1538                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1539            {
1540                let member_inline_size =
1541                    <fidl_fuchsia_mem::Data as fidl::encoding::TypeMarker>::inline_size(
1542                        decoder.context,
1543                    );
1544                if inlined != (member_inline_size <= 4) {
1545                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1546                }
1547                let inner_offset;
1548                let mut inner_depth = depth.clone();
1549                if inlined {
1550                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1551                    inner_offset = next_offset;
1552                } else {
1553                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1554                    inner_depth.increment()?;
1555                }
1556                let val_ref = self.config_values.get_or_insert_with(|| {
1557                    fidl::new_empty!(
1558                        fidl_fuchsia_mem::Data,
1559                        fidl::encoding::DefaultFuchsiaResourceDialect
1560                    )
1561                });
1562                fidl::decode!(
1563                    fidl_fuchsia_mem::Data,
1564                    fidl::encoding::DefaultFuchsiaResourceDialect,
1565                    val_ref,
1566                    decoder,
1567                    inner_offset,
1568                    inner_depth
1569                )?;
1570                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1571                {
1572                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1573                }
1574                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1575                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1576                }
1577            }
1578
1579            next_offset += envelope_size;
1580            _next_ordinal_to_read += 1;
1581            if next_offset >= end_offset {
1582                return Ok(());
1583            }
1584
1585            // Decode unknown envelopes for gaps in ordinals.
1586            while _next_ordinal_to_read < 5 {
1587                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1588                _next_ordinal_to_read += 1;
1589                next_offset += envelope_size;
1590            }
1591
1592            let next_out_of_line = decoder.next_out_of_line();
1593            let handles_before = decoder.remaining_handles();
1594            if let Some((inlined, num_bytes, num_handles)) =
1595                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1596            {
1597                let member_inline_size =
1598                    <Context as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1599                if inlined != (member_inline_size <= 4) {
1600                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1601                }
1602                let inner_offset;
1603                let mut inner_depth = depth.clone();
1604                if inlined {
1605                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1606                    inner_offset = next_offset;
1607                } else {
1608                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1609                    inner_depth.increment()?;
1610                }
1611                let val_ref = self.resolution_context.get_or_insert_with(|| {
1612                    fidl::new_empty!(Context, fidl::encoding::DefaultFuchsiaResourceDialect)
1613                });
1614                fidl::decode!(
1615                    Context,
1616                    fidl::encoding::DefaultFuchsiaResourceDialect,
1617                    val_ref,
1618                    decoder,
1619                    inner_offset,
1620                    inner_depth
1621                )?;
1622                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1623                {
1624                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1625                }
1626                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1627                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1628                }
1629            }
1630
1631            next_offset += envelope_size;
1632            _next_ordinal_to_read += 1;
1633            if next_offset >= end_offset {
1634                return Ok(());
1635            }
1636
1637            // Decode unknown envelopes for gaps in ordinals.
1638            while _next_ordinal_to_read < 6 {
1639                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1640                _next_ordinal_to_read += 1;
1641                next_offset += envelope_size;
1642            }
1643
1644            let next_out_of_line = decoder.next_out_of_line();
1645            let handles_before = decoder.remaining_handles();
1646            if let Some((inlined, num_bytes, num_handles)) =
1647                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1648            {
1649                let member_inline_size =
1650                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1651                if inlined != (member_inline_size <= 4) {
1652                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1653                }
1654                let inner_offset;
1655                let mut inner_depth = depth.clone();
1656                if inlined {
1657                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1658                    inner_offset = next_offset;
1659                } else {
1660                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1661                    inner_depth.increment()?;
1662                }
1663                let val_ref = self.abi_revision.get_or_insert_with(|| {
1664                    fidl::new_empty!(u64, fidl::encoding::DefaultFuchsiaResourceDialect)
1665                });
1666                fidl::decode!(
1667                    u64,
1668                    fidl::encoding::DefaultFuchsiaResourceDialect,
1669                    val_ref,
1670                    decoder,
1671                    inner_offset,
1672                    inner_depth
1673                )?;
1674                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1675                {
1676                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1677                }
1678                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1679                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1680                }
1681            }
1682
1683            next_offset += envelope_size;
1684
1685            // Decode the remaining unknown envelopes.
1686            while next_offset < end_offset {
1687                _next_ordinal_to_read += 1;
1688                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1689                next_offset += envelope_size;
1690            }
1691
1692            Ok(())
1693        }
1694    }
1695
1696    impl Package {
1697        #[inline(always)]
1698        fn max_ordinal_present(&self) -> u64 {
1699            if let Some(_) = self.directory {
1700                return 2;
1701            }
1702            if let Some(_) = self.url {
1703                return 1;
1704            }
1705            0
1706        }
1707    }
1708
1709    impl fidl::encoding::ResourceTypeMarker for Package {
1710        type Borrowed<'a> = &'a mut Self;
1711        fn take_or_borrow<'a>(
1712            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1713        ) -> Self::Borrowed<'a> {
1714            value
1715        }
1716    }
1717
1718    unsafe impl fidl::encoding::TypeMarker for Package {
1719        type Owned = Self;
1720
1721        #[inline(always)]
1722        fn inline_align(_context: fidl::encoding::Context) -> usize {
1723            8
1724        }
1725
1726        #[inline(always)]
1727        fn inline_size(_context: fidl::encoding::Context) -> usize {
1728            16
1729        }
1730    }
1731
1732    unsafe impl fidl::encoding::Encode<Package, fidl::encoding::DefaultFuchsiaResourceDialect>
1733        for &mut Package
1734    {
1735        unsafe fn encode(
1736            self,
1737            encoder: &mut fidl::encoding::Encoder<
1738                '_,
1739                fidl::encoding::DefaultFuchsiaResourceDialect,
1740            >,
1741            offset: usize,
1742            mut depth: fidl::encoding::Depth,
1743        ) -> fidl::Result<()> {
1744            encoder.debug_check_bounds::<Package>(offset);
1745            // Vector header
1746            let max_ordinal: u64 = self.max_ordinal_present();
1747            encoder.write_num(max_ordinal, offset);
1748            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1749            // Calling encoder.out_of_line_offset(0) is not allowed.
1750            if max_ordinal == 0 {
1751                return Ok(());
1752            }
1753            depth.increment()?;
1754            let envelope_size = 8;
1755            let bytes_len = max_ordinal as usize * envelope_size;
1756            #[allow(unused_variables)]
1757            let offset = encoder.out_of_line_offset(bytes_len);
1758            let mut _prev_end_offset: usize = 0;
1759            if 1 > max_ordinal {
1760                return Ok(());
1761            }
1762
1763            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1764            // are envelope_size bytes.
1765            let cur_offset: usize = (1 - 1) * envelope_size;
1766
1767            // Zero reserved fields.
1768            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1769
1770            // Safety:
1771            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1772            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1773            //   envelope_size bytes, there is always sufficient room.
1774            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<2083>, fidl::encoding::DefaultFuchsiaResourceDialect>(
1775            self.url.as_ref().map(<fidl::encoding::BoundedString<2083> as fidl::encoding::ValueTypeMarker>::borrow),
1776            encoder, offset + cur_offset, depth
1777        )?;
1778
1779            _prev_end_offset = cur_offset + envelope_size;
1780            if 2 > max_ordinal {
1781                return Ok(());
1782            }
1783
1784            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1785            // are envelope_size bytes.
1786            let cur_offset: usize = (2 - 1) * envelope_size;
1787
1788            // Zero reserved fields.
1789            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1790
1791            // Safety:
1792            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1793            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1794            //   envelope_size bytes, there is always sufficient room.
1795            fidl::encoding::encode_in_envelope_optional::<
1796                fidl::encoding::Endpoint<
1797                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1798                >,
1799                fidl::encoding::DefaultFuchsiaResourceDialect,
1800            >(
1801                self.directory.as_mut().map(
1802                    <fidl::encoding::Endpoint<
1803                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1804                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1805                ),
1806                encoder,
1807                offset + cur_offset,
1808                depth,
1809            )?;
1810
1811            _prev_end_offset = cur_offset + envelope_size;
1812
1813            Ok(())
1814        }
1815    }
1816
1817    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Package {
1818        #[inline(always)]
1819        fn new_empty() -> Self {
1820            Self::default()
1821        }
1822
1823        unsafe fn decode(
1824            &mut self,
1825            decoder: &mut fidl::encoding::Decoder<
1826                '_,
1827                fidl::encoding::DefaultFuchsiaResourceDialect,
1828            >,
1829            offset: usize,
1830            mut depth: fidl::encoding::Depth,
1831        ) -> fidl::Result<()> {
1832            decoder.debug_check_bounds::<Self>(offset);
1833            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1834                None => return Err(fidl::Error::NotNullable),
1835                Some(len) => len,
1836            };
1837            // Calling decoder.out_of_line_offset(0) is not allowed.
1838            if len == 0 {
1839                return Ok(());
1840            };
1841            depth.increment()?;
1842            let envelope_size = 8;
1843            let bytes_len = len * envelope_size;
1844            let offset = decoder.out_of_line_offset(bytes_len)?;
1845            // Decode the envelope for each type.
1846            let mut _next_ordinal_to_read = 0;
1847            let mut next_offset = offset;
1848            let end_offset = offset + bytes_len;
1849            _next_ordinal_to_read += 1;
1850            if next_offset >= end_offset {
1851                return Ok(());
1852            }
1853
1854            // Decode unknown envelopes for gaps in ordinals.
1855            while _next_ordinal_to_read < 1 {
1856                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1857                _next_ordinal_to_read += 1;
1858                next_offset += envelope_size;
1859            }
1860
1861            let next_out_of_line = decoder.next_out_of_line();
1862            let handles_before = decoder.remaining_handles();
1863            if let Some((inlined, num_bytes, num_handles)) =
1864                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1865            {
1866                let member_inline_size = <fidl::encoding::BoundedString<2083> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1867                if inlined != (member_inline_size <= 4) {
1868                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1869                }
1870                let inner_offset;
1871                let mut inner_depth = depth.clone();
1872                if inlined {
1873                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1874                    inner_offset = next_offset;
1875                } else {
1876                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1877                    inner_depth.increment()?;
1878                }
1879                let val_ref = self.url.get_or_insert_with(|| {
1880                    fidl::new_empty!(
1881                        fidl::encoding::BoundedString<2083>,
1882                        fidl::encoding::DefaultFuchsiaResourceDialect
1883                    )
1884                });
1885                fidl::decode!(
1886                    fidl::encoding::BoundedString<2083>,
1887                    fidl::encoding::DefaultFuchsiaResourceDialect,
1888                    val_ref,
1889                    decoder,
1890                    inner_offset,
1891                    inner_depth
1892                )?;
1893                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1894                {
1895                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1896                }
1897                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1898                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1899                }
1900            }
1901
1902            next_offset += envelope_size;
1903            _next_ordinal_to_read += 1;
1904            if next_offset >= end_offset {
1905                return Ok(());
1906            }
1907
1908            // Decode unknown envelopes for gaps in ordinals.
1909            while _next_ordinal_to_read < 2 {
1910                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1911                _next_ordinal_to_read += 1;
1912                next_offset += envelope_size;
1913            }
1914
1915            let next_out_of_line = decoder.next_out_of_line();
1916            let handles_before = decoder.remaining_handles();
1917            if let Some((inlined, num_bytes, num_handles)) =
1918                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1919            {
1920                let member_inline_size = <fidl::encoding::Endpoint<
1921                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1922                > as fidl::encoding::TypeMarker>::inline_size(
1923                    decoder.context
1924                );
1925                if inlined != (member_inline_size <= 4) {
1926                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1927                }
1928                let inner_offset;
1929                let mut inner_depth = depth.clone();
1930                if inlined {
1931                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1932                    inner_offset = next_offset;
1933                } else {
1934                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1935                    inner_depth.increment()?;
1936                }
1937                let val_ref = self.directory.get_or_insert_with(|| {
1938                    fidl::new_empty!(
1939                        fidl::encoding::Endpoint<
1940                            fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1941                        >,
1942                        fidl::encoding::DefaultFuchsiaResourceDialect
1943                    )
1944                });
1945                fidl::decode!(
1946                    fidl::encoding::Endpoint<
1947                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1948                    >,
1949                    fidl::encoding::DefaultFuchsiaResourceDialect,
1950                    val_ref,
1951                    decoder,
1952                    inner_offset,
1953                    inner_depth
1954                )?;
1955                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1956                {
1957                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1958                }
1959                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1960                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1961                }
1962            }
1963
1964            next_offset += envelope_size;
1965
1966            // Decode the remaining unknown envelopes.
1967            while next_offset < end_offset {
1968                _next_ordinal_to_read += 1;
1969                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1970                next_offset += envelope_size;
1971            }
1972
1973            Ok(())
1974        }
1975    }
1976}