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