Skip to main content

fidl_fuchsia_component_resolution/
fidl_fuchsia_component_resolution.rs

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