fidl_fuchsia_component_resolution/
fidl_fuchsia_component_resolution.rs

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