fidl_fuchsia_pkg_resolution/
fidl_fuchsia_pkg_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_pkg_resolution__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, Default, PartialEq)]
15pub struct PackageResolverResolveRequest {
16    pub package_url: Option<String>,
17    #[doc(hidden)]
18    pub __source_breaking: fidl::marker::SourceBreaking,
19}
20
21impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
22    for PackageResolverResolveRequest
23{
24}
25
26/// A ResolveResult encapsulates the result of [`PackageResolver`] operations.
27#[derive(Debug, Default, PartialEq)]
28pub struct ResolveResult {
29    #[doc(hidden)]
30    pub __source_breaking: fidl::marker::SourceBreaking,
31}
32
33impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ResolveResult {}
34
35#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
36pub struct PackageResolverMarker;
37
38impl fidl::endpoints::ProtocolMarker for PackageResolverMarker {
39    type Proxy = PackageResolverProxy;
40    type RequestStream = PackageResolverRequestStream;
41    #[cfg(target_os = "fuchsia")]
42    type SynchronousProxy = PackageResolverSynchronousProxy;
43
44    const DEBUG_NAME: &'static str = "fuchsia.pkg.resolution.PackageResolver";
45}
46impl fidl::endpoints::DiscoverableProtocolMarker for PackageResolverMarker {}
47pub type PackageResolverResolveResult = Result<ResolveResult, ResolveError>;
48
49pub trait PackageResolverProxyInterface: Send + Sync {
50    type ResolveResponseFut: std::future::Future<Output = Result<PackageResolverResolveResult, fidl::Error>>
51        + Send;
52    fn r#resolve(&self, payload: PackageResolverResolveRequest) -> Self::ResolveResponseFut;
53}
54#[derive(Debug)]
55#[cfg(target_os = "fuchsia")]
56pub struct PackageResolverSynchronousProxy {
57    client: fidl::client::sync::Client,
58}
59
60#[cfg(target_os = "fuchsia")]
61impl fidl::endpoints::SynchronousProxy for PackageResolverSynchronousProxy {
62    type Proxy = PackageResolverProxy;
63    type Protocol = PackageResolverMarker;
64
65    fn from_channel(inner: fidl::Channel) -> Self {
66        Self::new(inner)
67    }
68
69    fn into_channel(self) -> fidl::Channel {
70        self.client.into_channel()
71    }
72
73    fn as_channel(&self) -> &fidl::Channel {
74        self.client.as_channel()
75    }
76}
77
78#[cfg(target_os = "fuchsia")]
79impl PackageResolverSynchronousProxy {
80    pub fn new(channel: fidl::Channel) -> Self {
81        let protocol_name = <PackageResolverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
82        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
83    }
84
85    pub fn into_channel(self) -> fidl::Channel {
86        self.client.into_channel()
87    }
88
89    /// Waits until an event arrives and returns it. It is safe for other
90    /// threads to make concurrent requests while waiting for an event.
91    pub fn wait_for_event(
92        &self,
93        deadline: zx::MonotonicInstant,
94    ) -> Result<PackageResolverEvent, fidl::Error> {
95        PackageResolverEvent::decode(self.client.wait_for_event(deadline)?)
96    }
97
98    /// If this method succeeds, and package garbage collection is not triggered in the interim,
99    /// then subsequent resolves of the same package will not need to download any files. This is
100    /// useful for pre-fetching large packages.
101    ///
102    /// + request `package_url` the absolute package URL for a package.  The
103    ///   following link describes the format:
104    ///   https://fuchsia.dev/fuchsia-src/concepts/packages/package_url.
105    ///   URLs with fragments (aka resource paths) are used to indicate files within packages
106    ///   (such as component manifests), not just packages, and so will be rejected.
107    /// * error indicates failure. See [`ResolveError`] for values and error
108    ///   scenarios.
109    pub fn r#resolve(
110        &self,
111        mut payload: PackageResolverResolveRequest,
112        ___deadline: zx::MonotonicInstant,
113    ) -> Result<PackageResolverResolveResult, fidl::Error> {
114        let _response = self.client.send_query::<
115            PackageResolverResolveRequest,
116            fidl::encoding::FlexibleResultType<ResolveResult, ResolveError>,
117        >(
118            &mut payload,
119            0x33e16c815a5aed26,
120            fidl::encoding::DynamicFlags::FLEXIBLE,
121            ___deadline,
122        )?
123        .into_result::<PackageResolverMarker>("resolve")?;
124        Ok(_response.map(|x| x))
125    }
126}
127
128#[cfg(target_os = "fuchsia")]
129impl From<PackageResolverSynchronousProxy> for zx::Handle {
130    fn from(value: PackageResolverSynchronousProxy) -> Self {
131        value.into_channel().into()
132    }
133}
134
135#[cfg(target_os = "fuchsia")]
136impl From<fidl::Channel> for PackageResolverSynchronousProxy {
137    fn from(value: fidl::Channel) -> Self {
138        Self::new(value)
139    }
140}
141
142#[derive(Debug, Clone)]
143pub struct PackageResolverProxy {
144    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
145}
146
147impl fidl::endpoints::Proxy for PackageResolverProxy {
148    type Protocol = PackageResolverMarker;
149
150    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
151        Self::new(inner)
152    }
153
154    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
155        self.client.into_channel().map_err(|client| Self { client })
156    }
157
158    fn as_channel(&self) -> &::fidl::AsyncChannel {
159        self.client.as_channel()
160    }
161}
162
163impl PackageResolverProxy {
164    /// Create a new Proxy for fuchsia.pkg.resolution/PackageResolver.
165    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
166        let protocol_name = <PackageResolverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
167        Self { client: fidl::client::Client::new(channel, protocol_name) }
168    }
169
170    /// Get a Stream of events from the remote end of the protocol.
171    ///
172    /// # Panics
173    ///
174    /// Panics if the event stream was already taken.
175    pub fn take_event_stream(&self) -> PackageResolverEventStream {
176        PackageResolverEventStream { event_receiver: self.client.take_event_receiver() }
177    }
178
179    /// If this method succeeds, and package garbage collection is not triggered in the interim,
180    /// then subsequent resolves of the same package will not need to download any files. This is
181    /// useful for pre-fetching large packages.
182    ///
183    /// + request `package_url` the absolute package URL for a package.  The
184    ///   following link describes the format:
185    ///   https://fuchsia.dev/fuchsia-src/concepts/packages/package_url.
186    ///   URLs with fragments (aka resource paths) are used to indicate files within packages
187    ///   (such as component manifests), not just packages, and so will be rejected.
188    /// * error indicates failure. See [`ResolveError`] for values and error
189    ///   scenarios.
190    pub fn r#resolve(
191        &self,
192        mut payload: PackageResolverResolveRequest,
193    ) -> fidl::client::QueryResponseFut<
194        PackageResolverResolveResult,
195        fidl::encoding::DefaultFuchsiaResourceDialect,
196    > {
197        PackageResolverProxyInterface::r#resolve(self, payload)
198    }
199}
200
201impl PackageResolverProxyInterface for PackageResolverProxy {
202    type ResolveResponseFut = fidl::client::QueryResponseFut<
203        PackageResolverResolveResult,
204        fidl::encoding::DefaultFuchsiaResourceDialect,
205    >;
206    fn r#resolve(&self, mut payload: PackageResolverResolveRequest) -> Self::ResolveResponseFut {
207        fn _decode(
208            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
209        ) -> Result<PackageResolverResolveResult, fidl::Error> {
210            let _response = fidl::client::decode_transaction_body::<
211                fidl::encoding::FlexibleResultType<ResolveResult, ResolveError>,
212                fidl::encoding::DefaultFuchsiaResourceDialect,
213                0x33e16c815a5aed26,
214            >(_buf?)?
215            .into_result::<PackageResolverMarker>("resolve")?;
216            Ok(_response.map(|x| x))
217        }
218        self.client
219            .send_query_and_decode::<PackageResolverResolveRequest, PackageResolverResolveResult>(
220                &mut payload,
221                0x33e16c815a5aed26,
222                fidl::encoding::DynamicFlags::FLEXIBLE,
223                _decode,
224            )
225    }
226}
227
228pub struct PackageResolverEventStream {
229    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
230}
231
232impl std::marker::Unpin for PackageResolverEventStream {}
233
234impl futures::stream::FusedStream for PackageResolverEventStream {
235    fn is_terminated(&self) -> bool {
236        self.event_receiver.is_terminated()
237    }
238}
239
240impl futures::Stream for PackageResolverEventStream {
241    type Item = Result<PackageResolverEvent, fidl::Error>;
242
243    fn poll_next(
244        mut self: std::pin::Pin<&mut Self>,
245        cx: &mut std::task::Context<'_>,
246    ) -> std::task::Poll<Option<Self::Item>> {
247        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
248            &mut self.event_receiver,
249            cx
250        )?) {
251            Some(buf) => std::task::Poll::Ready(Some(PackageResolverEvent::decode(buf))),
252            None => std::task::Poll::Ready(None),
253        }
254    }
255}
256
257#[derive(Debug)]
258pub enum PackageResolverEvent {
259    #[non_exhaustive]
260    _UnknownEvent {
261        /// Ordinal of the event that was sent.
262        ordinal: u64,
263    },
264}
265
266impl PackageResolverEvent {
267    /// Decodes a message buffer as a [`PackageResolverEvent`].
268    fn decode(
269        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
270    ) -> Result<PackageResolverEvent, fidl::Error> {
271        let (bytes, _handles) = buf.split_mut();
272        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
273        debug_assert_eq!(tx_header.tx_id, 0);
274        match tx_header.ordinal {
275            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
276                Ok(PackageResolverEvent::_UnknownEvent { ordinal: tx_header.ordinal })
277            }
278            _ => Err(fidl::Error::UnknownOrdinal {
279                ordinal: tx_header.ordinal,
280                protocol_name:
281                    <PackageResolverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
282            }),
283        }
284    }
285}
286
287/// A Stream of incoming requests for fuchsia.pkg.resolution/PackageResolver.
288pub struct PackageResolverRequestStream {
289    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
290    is_terminated: bool,
291}
292
293impl std::marker::Unpin for PackageResolverRequestStream {}
294
295impl futures::stream::FusedStream for PackageResolverRequestStream {
296    fn is_terminated(&self) -> bool {
297        self.is_terminated
298    }
299}
300
301impl fidl::endpoints::RequestStream for PackageResolverRequestStream {
302    type Protocol = PackageResolverMarker;
303    type ControlHandle = PackageResolverControlHandle;
304
305    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
306        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
307    }
308
309    fn control_handle(&self) -> Self::ControlHandle {
310        PackageResolverControlHandle { inner: self.inner.clone() }
311    }
312
313    fn into_inner(
314        self,
315    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
316    {
317        (self.inner, self.is_terminated)
318    }
319
320    fn from_inner(
321        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
322        is_terminated: bool,
323    ) -> Self {
324        Self { inner, is_terminated }
325    }
326}
327
328impl futures::Stream for PackageResolverRequestStream {
329    type Item = Result<PackageResolverRequest, fidl::Error>;
330
331    fn poll_next(
332        mut self: std::pin::Pin<&mut Self>,
333        cx: &mut std::task::Context<'_>,
334    ) -> std::task::Poll<Option<Self::Item>> {
335        let this = &mut *self;
336        if this.inner.check_shutdown(cx) {
337            this.is_terminated = true;
338            return std::task::Poll::Ready(None);
339        }
340        if this.is_terminated {
341            panic!("polled PackageResolverRequestStream after completion");
342        }
343        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
344            |bytes, handles| {
345                match this.inner.channel().read_etc(cx, bytes, handles) {
346                    std::task::Poll::Ready(Ok(())) => {}
347                    std::task::Poll::Pending => return std::task::Poll::Pending,
348                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
349                        this.is_terminated = true;
350                        return std::task::Poll::Ready(None);
351                    }
352                    std::task::Poll::Ready(Err(e)) => {
353                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
354                            e.into(),
355                        ))))
356                    }
357                }
358
359                // A message has been received from the channel
360                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
361
362                std::task::Poll::Ready(Some(match header.ordinal {
363                    0x33e16c815a5aed26 => {
364                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
365                        let mut req = fidl::new_empty!(
366                            PackageResolverResolveRequest,
367                            fidl::encoding::DefaultFuchsiaResourceDialect
368                        );
369                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<PackageResolverResolveRequest>(&header, _body_bytes, handles, &mut req)?;
370                        let control_handle =
371                            PackageResolverControlHandle { inner: this.inner.clone() };
372                        Ok(PackageResolverRequest::Resolve {
373                            payload: req,
374                            responder: PackageResolverResolveResponder {
375                                control_handle: std::mem::ManuallyDrop::new(control_handle),
376                                tx_id: header.tx_id,
377                            },
378                        })
379                    }
380                    _ if header.tx_id == 0
381                        && header
382                            .dynamic_flags()
383                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
384                    {
385                        Ok(PackageResolverRequest::_UnknownMethod {
386                            ordinal: header.ordinal,
387                            control_handle: PackageResolverControlHandle {
388                                inner: this.inner.clone(),
389                            },
390                            method_type: fidl::MethodType::OneWay,
391                        })
392                    }
393                    _ if header
394                        .dynamic_flags()
395                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
396                    {
397                        this.inner.send_framework_err(
398                            fidl::encoding::FrameworkErr::UnknownMethod,
399                            header.tx_id,
400                            header.ordinal,
401                            header.dynamic_flags(),
402                            (bytes, handles),
403                        )?;
404                        Ok(PackageResolverRequest::_UnknownMethod {
405                            ordinal: header.ordinal,
406                            control_handle: PackageResolverControlHandle {
407                                inner: this.inner.clone(),
408                            },
409                            method_type: fidl::MethodType::TwoWay,
410                        })
411                    }
412                    _ => Err(fidl::Error::UnknownOrdinal {
413                        ordinal: header.ordinal,
414                        protocol_name:
415                            <PackageResolverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
416                    }),
417                }))
418            },
419        )
420    }
421}
422
423/// An abstract representation of a package resolver.
424///
425/// This is exposed to off-target SDK tooling, including ffx. Changes are subject to the
426/// compatibility requirements set forth by those tools.
427#[derive(Debug)]
428pub enum PackageResolverRequest {
429    /// If this method succeeds, and package garbage collection is not triggered in the interim,
430    /// then subsequent resolves of the same package will not need to download any files. This is
431    /// useful for pre-fetching large packages.
432    ///
433    /// + request `package_url` the absolute package URL for a package.  The
434    ///   following link describes the format:
435    ///   https://fuchsia.dev/fuchsia-src/concepts/packages/package_url.
436    ///   URLs with fragments (aka resource paths) are used to indicate files within packages
437    ///   (such as component manifests), not just packages, and so will be rejected.
438    /// * error indicates failure. See [`ResolveError`] for values and error
439    ///   scenarios.
440    Resolve { payload: PackageResolverResolveRequest, responder: PackageResolverResolveResponder },
441    /// An interaction was received which does not match any known method.
442    #[non_exhaustive]
443    _UnknownMethod {
444        /// Ordinal of the method that was called.
445        ordinal: u64,
446        control_handle: PackageResolverControlHandle,
447        method_type: fidl::MethodType,
448    },
449}
450
451impl PackageResolverRequest {
452    #[allow(irrefutable_let_patterns)]
453    pub fn into_resolve(
454        self,
455    ) -> Option<(PackageResolverResolveRequest, PackageResolverResolveResponder)> {
456        if let PackageResolverRequest::Resolve { payload, responder } = self {
457            Some((payload, responder))
458        } else {
459            None
460        }
461    }
462
463    /// Name of the method defined in FIDL
464    pub fn method_name(&self) -> &'static str {
465        match *self {
466            PackageResolverRequest::Resolve { .. } => "resolve",
467            PackageResolverRequest::_UnknownMethod {
468                method_type: fidl::MethodType::OneWay,
469                ..
470            } => "unknown one-way method",
471            PackageResolverRequest::_UnknownMethod {
472                method_type: fidl::MethodType::TwoWay,
473                ..
474            } => "unknown two-way method",
475        }
476    }
477}
478
479#[derive(Debug, Clone)]
480pub struct PackageResolverControlHandle {
481    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
482}
483
484impl fidl::endpoints::ControlHandle for PackageResolverControlHandle {
485    fn shutdown(&self) {
486        self.inner.shutdown()
487    }
488    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
489        self.inner.shutdown_with_epitaph(status)
490    }
491
492    fn is_closed(&self) -> bool {
493        self.inner.channel().is_closed()
494    }
495    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
496        self.inner.channel().on_closed()
497    }
498
499    #[cfg(target_os = "fuchsia")]
500    fn signal_peer(
501        &self,
502        clear_mask: zx::Signals,
503        set_mask: zx::Signals,
504    ) -> Result<(), zx_status::Status> {
505        use fidl::Peered;
506        self.inner.channel().signal_peer(clear_mask, set_mask)
507    }
508}
509
510impl PackageResolverControlHandle {}
511
512#[must_use = "FIDL methods require a response to be sent"]
513#[derive(Debug)]
514pub struct PackageResolverResolveResponder {
515    control_handle: std::mem::ManuallyDrop<PackageResolverControlHandle>,
516    tx_id: u32,
517}
518
519/// Set the the channel to be shutdown (see [`PackageResolverControlHandle::shutdown`])
520/// if the responder is dropped without sending a response, so that the client
521/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
522impl std::ops::Drop for PackageResolverResolveResponder {
523    fn drop(&mut self) {
524        self.control_handle.shutdown();
525        // Safety: drops once, never accessed again
526        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
527    }
528}
529
530impl fidl::endpoints::Responder for PackageResolverResolveResponder {
531    type ControlHandle = PackageResolverControlHandle;
532
533    fn control_handle(&self) -> &PackageResolverControlHandle {
534        &self.control_handle
535    }
536
537    fn drop_without_shutdown(mut self) {
538        // Safety: drops once, never accessed again due to mem::forget
539        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
540        // Prevent Drop from running (which would shut down the channel)
541        std::mem::forget(self);
542    }
543}
544
545impl PackageResolverResolveResponder {
546    /// Sends a response to the FIDL transaction.
547    ///
548    /// Sets the channel to shutdown if an error occurs.
549    pub fn send(self, mut result: Result<ResolveResult, ResolveError>) -> Result<(), fidl::Error> {
550        let _result = self.send_raw(result);
551        if _result.is_err() {
552            self.control_handle.shutdown();
553        }
554        self.drop_without_shutdown();
555        _result
556    }
557
558    /// Similar to "send" but does not shutdown the channel if an error occurs.
559    pub fn send_no_shutdown_on_err(
560        self,
561        mut result: Result<ResolveResult, ResolveError>,
562    ) -> Result<(), fidl::Error> {
563        let _result = self.send_raw(result);
564        self.drop_without_shutdown();
565        _result
566    }
567
568    fn send_raw(&self, mut result: Result<ResolveResult, ResolveError>) -> Result<(), fidl::Error> {
569        self.control_handle
570            .inner
571            .send::<fidl::encoding::FlexibleResultType<ResolveResult, ResolveError>>(
572                fidl::encoding::FlexibleResult::new(result.as_mut().map_err(|e| *e)),
573                self.tx_id,
574                0x33e16c815a5aed26,
575                fidl::encoding::DynamicFlags::FLEXIBLE,
576            )
577    }
578}
579
580mod internal {
581    use super::*;
582
583    impl PackageResolverResolveRequest {
584        #[inline(always)]
585        fn max_ordinal_present(&self) -> u64 {
586            if let Some(_) = self.package_url {
587                return 1;
588            }
589            0
590        }
591    }
592
593    impl fidl::encoding::ResourceTypeMarker for PackageResolverResolveRequest {
594        type Borrowed<'a> = &'a mut Self;
595        fn take_or_borrow<'a>(
596            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
597        ) -> Self::Borrowed<'a> {
598            value
599        }
600    }
601
602    unsafe impl fidl::encoding::TypeMarker for PackageResolverResolveRequest {
603        type Owned = Self;
604
605        #[inline(always)]
606        fn inline_align(_context: fidl::encoding::Context) -> usize {
607            8
608        }
609
610        #[inline(always)]
611        fn inline_size(_context: fidl::encoding::Context) -> usize {
612            16
613        }
614    }
615
616    unsafe impl
617        fidl::encoding::Encode<
618            PackageResolverResolveRequest,
619            fidl::encoding::DefaultFuchsiaResourceDialect,
620        > for &mut PackageResolverResolveRequest
621    {
622        unsafe fn encode(
623            self,
624            encoder: &mut fidl::encoding::Encoder<
625                '_,
626                fidl::encoding::DefaultFuchsiaResourceDialect,
627            >,
628            offset: usize,
629            mut depth: fidl::encoding::Depth,
630        ) -> fidl::Result<()> {
631            encoder.debug_check_bounds::<PackageResolverResolveRequest>(offset);
632            // Vector header
633            let max_ordinal: u64 = self.max_ordinal_present();
634            encoder.write_num(max_ordinal, offset);
635            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
636            // Calling encoder.out_of_line_offset(0) is not allowed.
637            if max_ordinal == 0 {
638                return Ok(());
639            }
640            depth.increment()?;
641            let envelope_size = 8;
642            let bytes_len = max_ordinal as usize * envelope_size;
643            #[allow(unused_variables)]
644            let offset = encoder.out_of_line_offset(bytes_len);
645            let mut _prev_end_offset: usize = 0;
646            if 1 > max_ordinal {
647                return Ok(());
648            }
649
650            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
651            // are envelope_size bytes.
652            let cur_offset: usize = (1 - 1) * envelope_size;
653
654            // Zero reserved fields.
655            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
656
657            // Safety:
658            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
659            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
660            //   envelope_size bytes, there is always sufficient room.
661            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<4096>, fidl::encoding::DefaultFuchsiaResourceDialect>(
662            self.package_url.as_ref().map(<fidl::encoding::BoundedString<4096> as fidl::encoding::ValueTypeMarker>::borrow),
663            encoder, offset + cur_offset, depth
664        )?;
665
666            _prev_end_offset = cur_offset + envelope_size;
667
668            Ok(())
669        }
670    }
671
672    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
673        for PackageResolverResolveRequest
674    {
675        #[inline(always)]
676        fn new_empty() -> Self {
677            Self::default()
678        }
679
680        unsafe fn decode(
681            &mut self,
682            decoder: &mut fidl::encoding::Decoder<
683                '_,
684                fidl::encoding::DefaultFuchsiaResourceDialect,
685            >,
686            offset: usize,
687            mut depth: fidl::encoding::Depth,
688        ) -> fidl::Result<()> {
689            decoder.debug_check_bounds::<Self>(offset);
690            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
691                None => return Err(fidl::Error::NotNullable),
692                Some(len) => len,
693            };
694            // Calling decoder.out_of_line_offset(0) is not allowed.
695            if len == 0 {
696                return Ok(());
697            };
698            depth.increment()?;
699            let envelope_size = 8;
700            let bytes_len = len * envelope_size;
701            let offset = decoder.out_of_line_offset(bytes_len)?;
702            // Decode the envelope for each type.
703            let mut _next_ordinal_to_read = 0;
704            let mut next_offset = offset;
705            let end_offset = offset + bytes_len;
706            _next_ordinal_to_read += 1;
707            if next_offset >= end_offset {
708                return Ok(());
709            }
710
711            // Decode unknown envelopes for gaps in ordinals.
712            while _next_ordinal_to_read < 1 {
713                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
714                _next_ordinal_to_read += 1;
715                next_offset += envelope_size;
716            }
717
718            let next_out_of_line = decoder.next_out_of_line();
719            let handles_before = decoder.remaining_handles();
720            if let Some((inlined, num_bytes, num_handles)) =
721                fidl::encoding::decode_envelope_header(decoder, next_offset)?
722            {
723                let member_inline_size = <fidl::encoding::BoundedString<4096> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
724                if inlined != (member_inline_size <= 4) {
725                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
726                }
727                let inner_offset;
728                let mut inner_depth = depth.clone();
729                if inlined {
730                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
731                    inner_offset = next_offset;
732                } else {
733                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
734                    inner_depth.increment()?;
735                }
736                let val_ref = self.package_url.get_or_insert_with(|| {
737                    fidl::new_empty!(
738                        fidl::encoding::BoundedString<4096>,
739                        fidl::encoding::DefaultFuchsiaResourceDialect
740                    )
741                });
742                fidl::decode!(
743                    fidl::encoding::BoundedString<4096>,
744                    fidl::encoding::DefaultFuchsiaResourceDialect,
745                    val_ref,
746                    decoder,
747                    inner_offset,
748                    inner_depth
749                )?;
750                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
751                {
752                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
753                }
754                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
755                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
756                }
757            }
758
759            next_offset += envelope_size;
760
761            // Decode the remaining unknown envelopes.
762            while next_offset < end_offset {
763                _next_ordinal_to_read += 1;
764                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
765                next_offset += envelope_size;
766            }
767
768            Ok(())
769        }
770    }
771
772    impl ResolveResult {
773        #[inline(always)]
774        fn max_ordinal_present(&self) -> u64 {
775            0
776        }
777    }
778
779    impl fidl::encoding::ResourceTypeMarker for ResolveResult {
780        type Borrowed<'a> = &'a mut Self;
781        fn take_or_borrow<'a>(
782            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
783        ) -> Self::Borrowed<'a> {
784            value
785        }
786    }
787
788    unsafe impl fidl::encoding::TypeMarker for ResolveResult {
789        type Owned = Self;
790
791        #[inline(always)]
792        fn inline_align(_context: fidl::encoding::Context) -> usize {
793            8
794        }
795
796        #[inline(always)]
797        fn inline_size(_context: fidl::encoding::Context) -> usize {
798            16
799        }
800    }
801
802    unsafe impl fidl::encoding::Encode<ResolveResult, fidl::encoding::DefaultFuchsiaResourceDialect>
803        for &mut ResolveResult
804    {
805        unsafe fn encode(
806            self,
807            encoder: &mut fidl::encoding::Encoder<
808                '_,
809                fidl::encoding::DefaultFuchsiaResourceDialect,
810            >,
811            offset: usize,
812            mut depth: fidl::encoding::Depth,
813        ) -> fidl::Result<()> {
814            encoder.debug_check_bounds::<ResolveResult>(offset);
815            // Vector header
816            let max_ordinal: u64 = self.max_ordinal_present();
817            encoder.write_num(max_ordinal, offset);
818            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
819            // Calling encoder.out_of_line_offset(0) is not allowed.
820            if max_ordinal == 0 {
821                return Ok(());
822            }
823            depth.increment()?;
824            let envelope_size = 8;
825            let bytes_len = max_ordinal as usize * envelope_size;
826            #[allow(unused_variables)]
827            let offset = encoder.out_of_line_offset(bytes_len);
828            let mut _prev_end_offset: usize = 0;
829
830            Ok(())
831        }
832    }
833
834    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for ResolveResult {
835        #[inline(always)]
836        fn new_empty() -> Self {
837            Self::default()
838        }
839
840        unsafe fn decode(
841            &mut self,
842            decoder: &mut fidl::encoding::Decoder<
843                '_,
844                fidl::encoding::DefaultFuchsiaResourceDialect,
845            >,
846            offset: usize,
847            mut depth: fidl::encoding::Depth,
848        ) -> fidl::Result<()> {
849            decoder.debug_check_bounds::<Self>(offset);
850            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
851                None => return Err(fidl::Error::NotNullable),
852                Some(len) => len,
853            };
854            // Calling decoder.out_of_line_offset(0) is not allowed.
855            if len == 0 {
856                return Ok(());
857            };
858            depth.increment()?;
859            let envelope_size = 8;
860            let bytes_len = len * envelope_size;
861            let offset = decoder.out_of_line_offset(bytes_len)?;
862            // Decode the envelope for each type.
863            let mut _next_ordinal_to_read = 0;
864            let mut next_offset = offset;
865            let end_offset = offset + bytes_len;
866
867            // Decode the remaining unknown envelopes.
868            while next_offset < end_offset {
869                _next_ordinal_to_read += 1;
870                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
871                next_offset += envelope_size;
872            }
873
874            Ok(())
875        }
876    }
877}