Skip to main content

fidl_fuchsia_component_resolution/
fidl_fuchsia_component_resolution.rs

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