Skip to main content

fdomain_fuchsia_pkg/
fdomain_fuchsia_pkg.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 fdomain_client::fidl::{ControlHandle as _, FDomainFlexibleIntoResult as _, Responder as _};
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9pub use fidl_fuchsia_pkg__common::*;
10use futures::future::{self, MaybeDone, TryFutureExt};
11use zx_status;
12
13#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
14pub struct FontResolverResolveRequest {
15    pub package_url: String,
16    pub directory_request: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
17}
18
19impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect> for FontResolverResolveRequest {}
20
21#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
22pub struct NeededBlobsGetMissingBlobsRequest {
23    pub iterator: fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>,
24}
25
26impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
27    for NeededBlobsGetMissingBlobsRequest
28{
29}
30
31#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
32pub struct NeededBlobsOpenBlobResponse {
33    pub writer: Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
34}
35
36impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
37    for NeededBlobsOpenBlobResponse
38{
39}
40
41#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
42pub struct NeededBlobsOpenMetaBlobResponse {
43    pub writer: Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
44}
45
46impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
47    for NeededBlobsOpenMetaBlobResponse
48{
49}
50
51#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
52pub struct PackageCacheBasePackageIndexRequest {
53    pub iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
54}
55
56impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
57    for PackageCacheBasePackageIndexRequest
58{
59}
60
61#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
62pub struct PackageCacheCachePackageIndexRequest {
63    pub iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
64}
65
66impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
67    for PackageCacheCachePackageIndexRequest
68{
69}
70
71#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
72pub struct PackageCacheGetRequest {
73    pub meta_far_blob: BlobInfo,
74    pub gc_protection: GcProtection,
75    pub needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
76    pub dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
77}
78
79impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect> for PackageCacheGetRequest {}
80
81#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
82pub struct PackageCacheGetSubpackageRequest {
83    pub superpackage: BlobId,
84    pub subpackage: PackageUrl,
85    pub dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
86}
87
88impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
89    for PackageCacheGetSubpackageRequest
90{
91}
92
93#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
94pub struct PackageCacheWriteBlobsRequest {
95    pub needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
96}
97
98impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
99    for PackageCacheWriteBlobsRequest
100{
101}
102
103#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
104pub struct PackageResolverResolveRequest {
105    pub package_url: String,
106    pub dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
107}
108
109impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
110    for PackageResolverResolveRequest
111{
112}
113
114#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
115pub struct PackageResolverResolveWithContextRequest {
116    pub package_url: String,
117    pub context: ResolutionContext,
118    pub dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
119}
120
121impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
122    for PackageResolverResolveWithContextRequest
123{
124}
125
126#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
127pub struct RepositoryManagerListRequest {
128    pub iterator: fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>,
129}
130
131impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
132    for RepositoryManagerListRequest
133{
134}
135
136#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
137pub struct RetainedBlobsReplaceRequest {
138    pub iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
139}
140
141impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
142    for RetainedBlobsReplaceRequest
143{
144}
145
146#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
147pub struct RetainedPackagesReplaceRequest {
148    pub iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
149}
150
151impl fidl::Standalone<fdomain_client::fidl::FDomainResourceDialect>
152    for RetainedPackagesReplaceRequest
153{
154}
155
156#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
157pub struct BlobIdIteratorMarker;
158
159impl fdomain_client::fidl::ProtocolMarker for BlobIdIteratorMarker {
160    type Proxy = BlobIdIteratorProxy;
161    type RequestStream = BlobIdIteratorRequestStream;
162
163    const DEBUG_NAME: &'static str = "(anonymous) BlobIdIterator";
164}
165
166pub trait BlobIdIteratorProxyInterface: Send + Sync {
167    type NextResponseFut: std::future::Future<Output = Result<Vec<BlobId>, fidl::Error>> + Send;
168    fn r#next(&self) -> Self::NextResponseFut;
169}
170
171#[derive(Debug, Clone)]
172pub struct BlobIdIteratorProxy {
173    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
174}
175
176impl fdomain_client::fidl::Proxy for BlobIdIteratorProxy {
177    type Protocol = BlobIdIteratorMarker;
178
179    fn from_channel(inner: fdomain_client::Channel) -> Self {
180        Self::new(inner)
181    }
182
183    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
184        self.client.into_channel().map_err(|client| Self { client })
185    }
186
187    fn as_channel(&self) -> &fdomain_client::Channel {
188        self.client.as_channel()
189    }
190}
191
192impl BlobIdIteratorProxy {
193    /// Create a new Proxy for fuchsia.pkg/BlobIdIterator.
194    pub fn new(channel: fdomain_client::Channel) -> Self {
195        let protocol_name =
196            <BlobIdIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
197        Self { client: fidl::client::Client::new(channel, protocol_name) }
198    }
199
200    /// Get a Stream of events from the remote end of the protocol.
201    ///
202    /// # Panics
203    ///
204    /// Panics if the event stream was already taken.
205    pub fn take_event_stream(&self) -> BlobIdIteratorEventStream {
206        BlobIdIteratorEventStream { event_receiver: self.client.take_event_receiver() }
207    }
208
209    /// Responds with the next chunk of blob IDs. When the iterator is
210    /// exhausted, responds with an empty vector and closes the connection.
211    ///
212    /// - response `blobs` the next chunk of blob IDs.
213    pub fn r#next(
214        &self,
215    ) -> fidl::client::QueryResponseFut<Vec<BlobId>, fdomain_client::fidl::FDomainResourceDialect>
216    {
217        BlobIdIteratorProxyInterface::r#next(self)
218    }
219}
220
221impl BlobIdIteratorProxyInterface for BlobIdIteratorProxy {
222    type NextResponseFut =
223        fidl::client::QueryResponseFut<Vec<BlobId>, fdomain_client::fidl::FDomainResourceDialect>;
224    fn r#next(&self) -> Self::NextResponseFut {
225        fn _decode(
226            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
227        ) -> Result<Vec<BlobId>, fidl::Error> {
228            let _response = fidl::client::decode_transaction_body::<
229                BlobIdIteratorNextResponse,
230                fdomain_client::fidl::FDomainResourceDialect,
231                0x5eb0af0daeb8f537,
232            >(_buf?)?;
233            Ok(_response.blobs)
234        }
235        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, Vec<BlobId>>(
236            (),
237            0x5eb0af0daeb8f537,
238            fidl::encoding::DynamicFlags::empty(),
239            _decode,
240        )
241    }
242}
243
244pub struct BlobIdIteratorEventStream {
245    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
246}
247
248impl std::marker::Unpin for BlobIdIteratorEventStream {}
249
250impl futures::stream::FusedStream for BlobIdIteratorEventStream {
251    fn is_terminated(&self) -> bool {
252        self.event_receiver.is_terminated()
253    }
254}
255
256impl futures::Stream for BlobIdIteratorEventStream {
257    type Item = Result<BlobIdIteratorEvent, fidl::Error>;
258
259    fn poll_next(
260        mut self: std::pin::Pin<&mut Self>,
261        cx: &mut std::task::Context<'_>,
262    ) -> std::task::Poll<Option<Self::Item>> {
263        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
264            &mut self.event_receiver,
265            cx
266        )?) {
267            Some(buf) => std::task::Poll::Ready(Some(BlobIdIteratorEvent::decode(buf))),
268            None => std::task::Poll::Ready(None),
269        }
270    }
271}
272
273#[derive(Debug)]
274pub enum BlobIdIteratorEvent {}
275
276impl BlobIdIteratorEvent {
277    /// Decodes a message buffer as a [`BlobIdIteratorEvent`].
278    fn decode(
279        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
280    ) -> Result<BlobIdIteratorEvent, fidl::Error> {
281        let (bytes, _handles) = buf.split_mut();
282        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
283        debug_assert_eq!(tx_header.tx_id, 0);
284        match tx_header.ordinal {
285            _ => Err(fidl::Error::UnknownOrdinal {
286                ordinal: tx_header.ordinal,
287                protocol_name:
288                    <BlobIdIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
289            }),
290        }
291    }
292}
293
294/// A Stream of incoming requests for fuchsia.pkg/BlobIdIterator.
295pub struct BlobIdIteratorRequestStream {
296    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
297    is_terminated: bool,
298}
299
300impl std::marker::Unpin for BlobIdIteratorRequestStream {}
301
302impl futures::stream::FusedStream for BlobIdIteratorRequestStream {
303    fn is_terminated(&self) -> bool {
304        self.is_terminated
305    }
306}
307
308impl fdomain_client::fidl::RequestStream for BlobIdIteratorRequestStream {
309    type Protocol = BlobIdIteratorMarker;
310    type ControlHandle = BlobIdIteratorControlHandle;
311
312    fn from_channel(channel: fdomain_client::Channel) -> Self {
313        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
314    }
315
316    fn control_handle(&self) -> Self::ControlHandle {
317        BlobIdIteratorControlHandle { inner: self.inner.clone() }
318    }
319
320    fn into_inner(
321        self,
322    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
323    {
324        (self.inner, self.is_terminated)
325    }
326
327    fn from_inner(
328        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
329        is_terminated: bool,
330    ) -> Self {
331        Self { inner, is_terminated }
332    }
333}
334
335impl futures::Stream for BlobIdIteratorRequestStream {
336    type Item = Result<BlobIdIteratorRequest, fidl::Error>;
337
338    fn poll_next(
339        mut self: std::pin::Pin<&mut Self>,
340        cx: &mut std::task::Context<'_>,
341    ) -> std::task::Poll<Option<Self::Item>> {
342        let this = &mut *self;
343        if this.inner.check_shutdown(cx) {
344            this.is_terminated = true;
345            return std::task::Poll::Ready(None);
346        }
347        if this.is_terminated {
348            panic!("polled BlobIdIteratorRequestStream after completion");
349        }
350        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
351            |bytes, handles| {
352                match this.inner.channel().read_etc(cx, bytes, handles) {
353                    std::task::Poll::Ready(Ok(())) => {}
354                    std::task::Poll::Pending => return std::task::Poll::Pending,
355                    std::task::Poll::Ready(Err(None)) => {
356                        this.is_terminated = true;
357                        return std::task::Poll::Ready(None);
358                    }
359                    std::task::Poll::Ready(Err(Some(e))) => {
360                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
361                            e.into(),
362                        ))));
363                    }
364                }
365
366                // A message has been received from the channel
367                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
368
369                std::task::Poll::Ready(Some(match header.ordinal {
370                0x5eb0af0daeb8f537 => {
371                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
372                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fdomain_client::fidl::FDomainResourceDialect);
373                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
374                    let control_handle = BlobIdIteratorControlHandle {
375                        inner: this.inner.clone(),
376                    };
377                    Ok(BlobIdIteratorRequest::Next {
378                        responder: BlobIdIteratorNextResponder {
379                            control_handle: std::mem::ManuallyDrop::new(control_handle),
380                            tx_id: header.tx_id,
381                        },
382                    })
383                }
384                _ => Err(fidl::Error::UnknownOrdinal {
385                    ordinal: header.ordinal,
386                    protocol_name: <BlobIdIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
387                }),
388            }))
389            },
390        )
391    }
392}
393
394/// A chunked iterator of blob IDs, allowing transfer of more blob IDs that can
395/// fit in a single FIDL message.
396#[derive(Debug)]
397pub enum BlobIdIteratorRequest {
398    /// Responds with the next chunk of blob IDs. When the iterator is
399    /// exhausted, responds with an empty vector and closes the connection.
400    ///
401    /// - response `blobs` the next chunk of blob IDs.
402    Next { responder: BlobIdIteratorNextResponder },
403}
404
405impl BlobIdIteratorRequest {
406    #[allow(irrefutable_let_patterns)]
407    pub fn into_next(self) -> Option<(BlobIdIteratorNextResponder)> {
408        if let BlobIdIteratorRequest::Next { responder } = self { Some((responder)) } else { None }
409    }
410
411    /// Name of the method defined in FIDL
412    pub fn method_name(&self) -> &'static str {
413        match *self {
414            BlobIdIteratorRequest::Next { .. } => "next",
415        }
416    }
417}
418
419#[derive(Debug, Clone)]
420pub struct BlobIdIteratorControlHandle {
421    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
422}
423
424impl fdomain_client::fidl::ControlHandle for BlobIdIteratorControlHandle {
425    fn shutdown(&self) {
426        self.inner.shutdown()
427    }
428
429    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
430        self.inner.shutdown_with_epitaph(status)
431    }
432
433    fn is_closed(&self) -> bool {
434        self.inner.channel().is_closed()
435    }
436    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
437        self.inner.channel().on_closed()
438    }
439}
440
441impl BlobIdIteratorControlHandle {}
442
443#[must_use = "FIDL methods require a response to be sent"]
444#[derive(Debug)]
445pub struct BlobIdIteratorNextResponder {
446    control_handle: std::mem::ManuallyDrop<BlobIdIteratorControlHandle>,
447    tx_id: u32,
448}
449
450/// Set the the channel to be shutdown (see [`BlobIdIteratorControlHandle::shutdown`])
451/// if the responder is dropped without sending a response, so that the client
452/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
453impl std::ops::Drop for BlobIdIteratorNextResponder {
454    fn drop(&mut self) {
455        self.control_handle.shutdown();
456        // Safety: drops once, never accessed again
457        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
458    }
459}
460
461impl fdomain_client::fidl::Responder for BlobIdIteratorNextResponder {
462    type ControlHandle = BlobIdIteratorControlHandle;
463
464    fn control_handle(&self) -> &BlobIdIteratorControlHandle {
465        &self.control_handle
466    }
467
468    fn drop_without_shutdown(mut self) {
469        // Safety: drops once, never accessed again due to mem::forget
470        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
471        // Prevent Drop from running (which would shut down the channel)
472        std::mem::forget(self);
473    }
474}
475
476impl BlobIdIteratorNextResponder {
477    /// Sends a response to the FIDL transaction.
478    ///
479    /// Sets the channel to shutdown if an error occurs.
480    pub fn send(self, mut blobs: &[BlobId]) -> Result<(), fidl::Error> {
481        let _result = self.send_raw(blobs);
482        if _result.is_err() {
483            self.control_handle.shutdown();
484        }
485        self.drop_without_shutdown();
486        _result
487    }
488
489    /// Similar to "send" but does not shutdown the channel if an error occurs.
490    pub fn send_no_shutdown_on_err(self, mut blobs: &[BlobId]) -> Result<(), fidl::Error> {
491        let _result = self.send_raw(blobs);
492        self.drop_without_shutdown();
493        _result
494    }
495
496    fn send_raw(&self, mut blobs: &[BlobId]) -> Result<(), fidl::Error> {
497        self.control_handle.inner.send::<BlobIdIteratorNextResponse>(
498            (blobs,),
499            self.tx_id,
500            0x5eb0af0daeb8f537,
501            fidl::encoding::DynamicFlags::empty(),
502        )
503    }
504}
505
506#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
507pub struct BlobInfoIteratorMarker;
508
509impl fdomain_client::fidl::ProtocolMarker for BlobInfoIteratorMarker {
510    type Proxy = BlobInfoIteratorProxy;
511    type RequestStream = BlobInfoIteratorRequestStream;
512
513    const DEBUG_NAME: &'static str = "(anonymous) BlobInfoIterator";
514}
515
516pub trait BlobInfoIteratorProxyInterface: Send + Sync {
517    type NextResponseFut: std::future::Future<Output = Result<Vec<BlobInfo>, fidl::Error>> + Send;
518    fn r#next(&self) -> Self::NextResponseFut;
519}
520
521#[derive(Debug, Clone)]
522pub struct BlobInfoIteratorProxy {
523    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
524}
525
526impl fdomain_client::fidl::Proxy for BlobInfoIteratorProxy {
527    type Protocol = BlobInfoIteratorMarker;
528
529    fn from_channel(inner: fdomain_client::Channel) -> Self {
530        Self::new(inner)
531    }
532
533    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
534        self.client.into_channel().map_err(|client| Self { client })
535    }
536
537    fn as_channel(&self) -> &fdomain_client::Channel {
538        self.client.as_channel()
539    }
540}
541
542impl BlobInfoIteratorProxy {
543    /// Create a new Proxy for fuchsia.pkg/BlobInfoIterator.
544    pub fn new(channel: fdomain_client::Channel) -> Self {
545        let protocol_name =
546            <BlobInfoIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
547        Self { client: fidl::client::Client::new(channel, protocol_name) }
548    }
549
550    /// Get a Stream of events from the remote end of the protocol.
551    ///
552    /// # Panics
553    ///
554    /// Panics if the event stream was already taken.
555    pub fn take_event_stream(&self) -> BlobInfoIteratorEventStream {
556        BlobInfoIteratorEventStream { event_receiver: self.client.take_event_receiver() }
557    }
558
559    /// Responds with the next chunk of [`BlobInfo`]s. When the iterator is
560    /// exhausted, responds with an empty vector and closes the connection.
561    ///
562    /// - response `blobs` the next chunk of [`BlobInfo`]s.
563    pub fn r#next(
564        &self,
565    ) -> fidl::client::QueryResponseFut<Vec<BlobInfo>, fdomain_client::fidl::FDomainResourceDialect>
566    {
567        BlobInfoIteratorProxyInterface::r#next(self)
568    }
569}
570
571impl BlobInfoIteratorProxyInterface for BlobInfoIteratorProxy {
572    type NextResponseFut =
573        fidl::client::QueryResponseFut<Vec<BlobInfo>, fdomain_client::fidl::FDomainResourceDialect>;
574    fn r#next(&self) -> Self::NextResponseFut {
575        fn _decode(
576            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
577        ) -> Result<Vec<BlobInfo>, fidl::Error> {
578            let _response = fidl::client::decode_transaction_body::<
579                BlobInfoIteratorNextResponse,
580                fdomain_client::fidl::FDomainResourceDialect,
581                0x2b889489a59b6970,
582            >(_buf?)?;
583            Ok(_response.blobs)
584        }
585        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, Vec<BlobInfo>>(
586            (),
587            0x2b889489a59b6970,
588            fidl::encoding::DynamicFlags::empty(),
589            _decode,
590        )
591    }
592}
593
594pub struct BlobInfoIteratorEventStream {
595    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
596}
597
598impl std::marker::Unpin for BlobInfoIteratorEventStream {}
599
600impl futures::stream::FusedStream for BlobInfoIteratorEventStream {
601    fn is_terminated(&self) -> bool {
602        self.event_receiver.is_terminated()
603    }
604}
605
606impl futures::Stream for BlobInfoIteratorEventStream {
607    type Item = Result<BlobInfoIteratorEvent, fidl::Error>;
608
609    fn poll_next(
610        mut self: std::pin::Pin<&mut Self>,
611        cx: &mut std::task::Context<'_>,
612    ) -> std::task::Poll<Option<Self::Item>> {
613        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
614            &mut self.event_receiver,
615            cx
616        )?) {
617            Some(buf) => std::task::Poll::Ready(Some(BlobInfoIteratorEvent::decode(buf))),
618            None => std::task::Poll::Ready(None),
619        }
620    }
621}
622
623#[derive(Debug)]
624pub enum BlobInfoIteratorEvent {}
625
626impl BlobInfoIteratorEvent {
627    /// Decodes a message buffer as a [`BlobInfoIteratorEvent`].
628    fn decode(
629        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
630    ) -> Result<BlobInfoIteratorEvent, fidl::Error> {
631        let (bytes, _handles) = buf.split_mut();
632        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
633        debug_assert_eq!(tx_header.tx_id, 0);
634        match tx_header.ordinal {
635            _ => Err(fidl::Error::UnknownOrdinal {
636                ordinal: tx_header.ordinal,
637                protocol_name:
638                    <BlobInfoIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
639            }),
640        }
641    }
642}
643
644/// A Stream of incoming requests for fuchsia.pkg/BlobInfoIterator.
645pub struct BlobInfoIteratorRequestStream {
646    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
647    is_terminated: bool,
648}
649
650impl std::marker::Unpin for BlobInfoIteratorRequestStream {}
651
652impl futures::stream::FusedStream for BlobInfoIteratorRequestStream {
653    fn is_terminated(&self) -> bool {
654        self.is_terminated
655    }
656}
657
658impl fdomain_client::fidl::RequestStream for BlobInfoIteratorRequestStream {
659    type Protocol = BlobInfoIteratorMarker;
660    type ControlHandle = BlobInfoIteratorControlHandle;
661
662    fn from_channel(channel: fdomain_client::Channel) -> Self {
663        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
664    }
665
666    fn control_handle(&self) -> Self::ControlHandle {
667        BlobInfoIteratorControlHandle { inner: self.inner.clone() }
668    }
669
670    fn into_inner(
671        self,
672    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
673    {
674        (self.inner, self.is_terminated)
675    }
676
677    fn from_inner(
678        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
679        is_terminated: bool,
680    ) -> Self {
681        Self { inner, is_terminated }
682    }
683}
684
685impl futures::Stream for BlobInfoIteratorRequestStream {
686    type Item = Result<BlobInfoIteratorRequest, fidl::Error>;
687
688    fn poll_next(
689        mut self: std::pin::Pin<&mut Self>,
690        cx: &mut std::task::Context<'_>,
691    ) -> std::task::Poll<Option<Self::Item>> {
692        let this = &mut *self;
693        if this.inner.check_shutdown(cx) {
694            this.is_terminated = true;
695            return std::task::Poll::Ready(None);
696        }
697        if this.is_terminated {
698            panic!("polled BlobInfoIteratorRequestStream after completion");
699        }
700        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
701            |bytes, handles| {
702                match this.inner.channel().read_etc(cx, bytes, handles) {
703                    std::task::Poll::Ready(Ok(())) => {}
704                    std::task::Poll::Pending => return std::task::Poll::Pending,
705                    std::task::Poll::Ready(Err(None)) => {
706                        this.is_terminated = true;
707                        return std::task::Poll::Ready(None);
708                    }
709                    std::task::Poll::Ready(Err(Some(e))) => {
710                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
711                            e.into(),
712                        ))));
713                    }
714                }
715
716                // A message has been received from the channel
717                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
718
719                std::task::Poll::Ready(Some(match header.ordinal {
720                0x2b889489a59b6970 => {
721                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
722                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fdomain_client::fidl::FDomainResourceDialect);
723                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
724                    let control_handle = BlobInfoIteratorControlHandle {
725                        inner: this.inner.clone(),
726                    };
727                    Ok(BlobInfoIteratorRequest::Next {
728                        responder: BlobInfoIteratorNextResponder {
729                            control_handle: std::mem::ManuallyDrop::new(control_handle),
730                            tx_id: header.tx_id,
731                        },
732                    })
733                }
734                _ => Err(fidl::Error::UnknownOrdinal {
735                    ordinal: header.ordinal,
736                    protocol_name: <BlobInfoIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
737                }),
738            }))
739            },
740        )
741    }
742}
743
744/// A chunked iterator of [`BlobInfo`], allowing transfer of more [`BlobInfo`]s
745/// that can fit in a single FIDL message.
746#[derive(Debug)]
747pub enum BlobInfoIteratorRequest {
748    /// Responds with the next chunk of [`BlobInfo`]s. When the iterator is
749    /// exhausted, responds with an empty vector and closes the connection.
750    ///
751    /// - response `blobs` the next chunk of [`BlobInfo`]s.
752    Next { responder: BlobInfoIteratorNextResponder },
753}
754
755impl BlobInfoIteratorRequest {
756    #[allow(irrefutable_let_patterns)]
757    pub fn into_next(self) -> Option<(BlobInfoIteratorNextResponder)> {
758        if let BlobInfoIteratorRequest::Next { responder } = self {
759            Some((responder))
760        } else {
761            None
762        }
763    }
764
765    /// Name of the method defined in FIDL
766    pub fn method_name(&self) -> &'static str {
767        match *self {
768            BlobInfoIteratorRequest::Next { .. } => "next",
769        }
770    }
771}
772
773#[derive(Debug, Clone)]
774pub struct BlobInfoIteratorControlHandle {
775    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
776}
777
778impl fdomain_client::fidl::ControlHandle for BlobInfoIteratorControlHandle {
779    fn shutdown(&self) {
780        self.inner.shutdown()
781    }
782
783    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
784        self.inner.shutdown_with_epitaph(status)
785    }
786
787    fn is_closed(&self) -> bool {
788        self.inner.channel().is_closed()
789    }
790    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
791        self.inner.channel().on_closed()
792    }
793}
794
795impl BlobInfoIteratorControlHandle {}
796
797#[must_use = "FIDL methods require a response to be sent"]
798#[derive(Debug)]
799pub struct BlobInfoIteratorNextResponder {
800    control_handle: std::mem::ManuallyDrop<BlobInfoIteratorControlHandle>,
801    tx_id: u32,
802}
803
804/// Set the the channel to be shutdown (see [`BlobInfoIteratorControlHandle::shutdown`])
805/// if the responder is dropped without sending a response, so that the client
806/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
807impl std::ops::Drop for BlobInfoIteratorNextResponder {
808    fn drop(&mut self) {
809        self.control_handle.shutdown();
810        // Safety: drops once, never accessed again
811        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
812    }
813}
814
815impl fdomain_client::fidl::Responder for BlobInfoIteratorNextResponder {
816    type ControlHandle = BlobInfoIteratorControlHandle;
817
818    fn control_handle(&self) -> &BlobInfoIteratorControlHandle {
819        &self.control_handle
820    }
821
822    fn drop_without_shutdown(mut self) {
823        // Safety: drops once, never accessed again due to mem::forget
824        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
825        // Prevent Drop from running (which would shut down the channel)
826        std::mem::forget(self);
827    }
828}
829
830impl BlobInfoIteratorNextResponder {
831    /// Sends a response to the FIDL transaction.
832    ///
833    /// Sets the channel to shutdown if an error occurs.
834    pub fn send(self, mut blobs: &[BlobInfo]) -> Result<(), fidl::Error> {
835        let _result = self.send_raw(blobs);
836        if _result.is_err() {
837            self.control_handle.shutdown();
838        }
839        self.drop_without_shutdown();
840        _result
841    }
842
843    /// Similar to "send" but does not shutdown the channel if an error occurs.
844    pub fn send_no_shutdown_on_err(self, mut blobs: &[BlobInfo]) -> Result<(), fidl::Error> {
845        let _result = self.send_raw(blobs);
846        self.drop_without_shutdown();
847        _result
848    }
849
850    fn send_raw(&self, mut blobs: &[BlobInfo]) -> Result<(), fidl::Error> {
851        self.control_handle.inner.send::<BlobInfoIteratorNextResponse>(
852            (blobs,),
853            self.tx_id,
854            0x2b889489a59b6970,
855            fidl::encoding::DynamicFlags::empty(),
856        )
857    }
858}
859
860#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
861pub struct CupMarker;
862
863impl fdomain_client::fidl::ProtocolMarker for CupMarker {
864    type Proxy = CupProxy;
865    type RequestStream = CupRequestStream;
866
867    const DEBUG_NAME: &'static str = "fuchsia.pkg.Cup";
868}
869impl fdomain_client::fidl::DiscoverableProtocolMarker for CupMarker {}
870pub type CupWriteResult = Result<(), WriteError>;
871pub type CupGetInfoResult = Result<(String, String), GetInfoError>;
872
873pub trait CupProxyInterface: Send + Sync {
874    type WriteResponseFut: std::future::Future<Output = Result<CupWriteResult, fidl::Error>> + Send;
875    fn r#write(&self, url: &PackageUrl, cup: &CupData) -> Self::WriteResponseFut;
876    type GetInfoResponseFut: std::future::Future<Output = Result<CupGetInfoResult, fidl::Error>>
877        + Send;
878    fn r#get_info(&self, url: &PackageUrl) -> Self::GetInfoResponseFut;
879}
880
881#[derive(Debug, Clone)]
882pub struct CupProxy {
883    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
884}
885
886impl fdomain_client::fidl::Proxy for CupProxy {
887    type Protocol = CupMarker;
888
889    fn from_channel(inner: fdomain_client::Channel) -> Self {
890        Self::new(inner)
891    }
892
893    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
894        self.client.into_channel().map_err(|client| Self { client })
895    }
896
897    fn as_channel(&self) -> &fdomain_client::Channel {
898        self.client.as_channel()
899    }
900}
901
902impl CupProxy {
903    /// Create a new Proxy for fuchsia.pkg/Cup.
904    pub fn new(channel: fdomain_client::Channel) -> Self {
905        let protocol_name = <CupMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
906        Self { client: fidl::client::Client::new(channel, protocol_name) }
907    }
908
909    /// Get a Stream of events from the remote end of the protocol.
910    ///
911    /// # Panics
912    ///
913    /// Panics if the event stream was already taken.
914    pub fn take_event_stream(&self) -> CupEventStream {
915        CupEventStream { event_receiver: self.client.take_event_receiver() }
916    }
917
918    /// Resolve the eager package given by the pinned package URL, and write the
919    /// CUP data to storage.
920    pub fn r#write(
921        &self,
922        mut url: &PackageUrl,
923        mut cup: &CupData,
924    ) -> fidl::client::QueryResponseFut<CupWriteResult, fdomain_client::fidl::FDomainResourceDialect>
925    {
926        CupProxyInterface::r#write(self, url, cup)
927    }
928
929    /// Returns the eager package version and channel of the given package URL.
930    pub fn r#get_info(
931        &self,
932        mut url: &PackageUrl,
933    ) -> fidl::client::QueryResponseFut<
934        CupGetInfoResult,
935        fdomain_client::fidl::FDomainResourceDialect,
936    > {
937        CupProxyInterface::r#get_info(self, url)
938    }
939}
940
941impl CupProxyInterface for CupProxy {
942    type WriteResponseFut = fidl::client::QueryResponseFut<
943        CupWriteResult,
944        fdomain_client::fidl::FDomainResourceDialect,
945    >;
946    fn r#write(&self, mut url: &PackageUrl, mut cup: &CupData) -> Self::WriteResponseFut {
947        fn _decode(
948            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
949        ) -> Result<CupWriteResult, fidl::Error> {
950            let _response = fidl::client::decode_transaction_body::<
951                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, WriteError>,
952                fdomain_client::fidl::FDomainResourceDialect,
953                0x29f30e83bda39c37,
954            >(_buf?)?;
955            Ok(_response.map(|x| x))
956        }
957        self.client.send_query_and_decode::<CupWriteRequest, CupWriteResult>(
958            (url, cup),
959            0x29f30e83bda39c37,
960            fidl::encoding::DynamicFlags::empty(),
961            _decode,
962        )
963    }
964
965    type GetInfoResponseFut = fidl::client::QueryResponseFut<
966        CupGetInfoResult,
967        fdomain_client::fidl::FDomainResourceDialect,
968    >;
969    fn r#get_info(&self, mut url: &PackageUrl) -> Self::GetInfoResponseFut {
970        fn _decode(
971            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
972        ) -> Result<CupGetInfoResult, fidl::Error> {
973            let _response = fidl::client::decode_transaction_body::<
974                fidl::encoding::ResultType<CupGetInfoResponse, GetInfoError>,
975                fdomain_client::fidl::FDomainResourceDialect,
976                0x5b2cedd887209b9c,
977            >(_buf?)?;
978            Ok(_response.map(|x| (x.version, x.channel)))
979        }
980        self.client.send_query_and_decode::<CupGetInfoRequest, CupGetInfoResult>(
981            (url,),
982            0x5b2cedd887209b9c,
983            fidl::encoding::DynamicFlags::empty(),
984            _decode,
985        )
986    }
987}
988
989pub struct CupEventStream {
990    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
991}
992
993impl std::marker::Unpin for CupEventStream {}
994
995impl futures::stream::FusedStream for CupEventStream {
996    fn is_terminated(&self) -> bool {
997        self.event_receiver.is_terminated()
998    }
999}
1000
1001impl futures::Stream for CupEventStream {
1002    type Item = Result<CupEvent, fidl::Error>;
1003
1004    fn poll_next(
1005        mut self: std::pin::Pin<&mut Self>,
1006        cx: &mut std::task::Context<'_>,
1007    ) -> std::task::Poll<Option<Self::Item>> {
1008        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1009            &mut self.event_receiver,
1010            cx
1011        )?) {
1012            Some(buf) => std::task::Poll::Ready(Some(CupEvent::decode(buf))),
1013            None => std::task::Poll::Ready(None),
1014        }
1015    }
1016}
1017
1018#[derive(Debug)]
1019pub enum CupEvent {}
1020
1021impl CupEvent {
1022    /// Decodes a message buffer as a [`CupEvent`].
1023    fn decode(
1024        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1025    ) -> Result<CupEvent, fidl::Error> {
1026        let (bytes, _handles) = buf.split_mut();
1027        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1028        debug_assert_eq!(tx_header.tx_id, 0);
1029        match tx_header.ordinal {
1030            _ => Err(fidl::Error::UnknownOrdinal {
1031                ordinal: tx_header.ordinal,
1032                protocol_name: <CupMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
1033            }),
1034        }
1035    }
1036}
1037
1038/// A Stream of incoming requests for fuchsia.pkg/Cup.
1039pub struct CupRequestStream {
1040    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
1041    is_terminated: bool,
1042}
1043
1044impl std::marker::Unpin for CupRequestStream {}
1045
1046impl futures::stream::FusedStream for CupRequestStream {
1047    fn is_terminated(&self) -> bool {
1048        self.is_terminated
1049    }
1050}
1051
1052impl fdomain_client::fidl::RequestStream for CupRequestStream {
1053    type Protocol = CupMarker;
1054    type ControlHandle = CupControlHandle;
1055
1056    fn from_channel(channel: fdomain_client::Channel) -> Self {
1057        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
1058    }
1059
1060    fn control_handle(&self) -> Self::ControlHandle {
1061        CupControlHandle { inner: self.inner.clone() }
1062    }
1063
1064    fn into_inner(
1065        self,
1066    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
1067    {
1068        (self.inner, self.is_terminated)
1069    }
1070
1071    fn from_inner(
1072        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
1073        is_terminated: bool,
1074    ) -> Self {
1075        Self { inner, is_terminated }
1076    }
1077}
1078
1079impl futures::Stream for CupRequestStream {
1080    type Item = Result<CupRequest, fidl::Error>;
1081
1082    fn poll_next(
1083        mut self: std::pin::Pin<&mut Self>,
1084        cx: &mut std::task::Context<'_>,
1085    ) -> std::task::Poll<Option<Self::Item>> {
1086        let this = &mut *self;
1087        if this.inner.check_shutdown(cx) {
1088            this.is_terminated = true;
1089            return std::task::Poll::Ready(None);
1090        }
1091        if this.is_terminated {
1092            panic!("polled CupRequestStream after completion");
1093        }
1094        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
1095            |bytes, handles| {
1096                match this.inner.channel().read_etc(cx, bytes, handles) {
1097                    std::task::Poll::Ready(Ok(())) => {}
1098                    std::task::Poll::Pending => return std::task::Poll::Pending,
1099                    std::task::Poll::Ready(Err(None)) => {
1100                        this.is_terminated = true;
1101                        return std::task::Poll::Ready(None);
1102                    }
1103                    std::task::Poll::Ready(Err(Some(e))) => {
1104                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
1105                            e.into(),
1106                        ))));
1107                    }
1108                }
1109
1110                // A message has been received from the channel
1111                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1112
1113                std::task::Poll::Ready(Some(match header.ordinal {
1114                    0x29f30e83bda39c37 => {
1115                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1116                        let mut req = fidl::new_empty!(
1117                            CupWriteRequest,
1118                            fdomain_client::fidl::FDomainResourceDialect
1119                        );
1120                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<CupWriteRequest>(&header, _body_bytes, handles, &mut req)?;
1121                        let control_handle = CupControlHandle { inner: this.inner.clone() };
1122                        Ok(CupRequest::Write {
1123                            url: req.url,
1124                            cup: req.cup,
1125
1126                            responder: CupWriteResponder {
1127                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1128                                tx_id: header.tx_id,
1129                            },
1130                        })
1131                    }
1132                    0x5b2cedd887209b9c => {
1133                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1134                        let mut req = fidl::new_empty!(
1135                            CupGetInfoRequest,
1136                            fdomain_client::fidl::FDomainResourceDialect
1137                        );
1138                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<CupGetInfoRequest>(&header, _body_bytes, handles, &mut req)?;
1139                        let control_handle = CupControlHandle { inner: this.inner.clone() };
1140                        Ok(CupRequest::GetInfo {
1141                            url: req.url,
1142
1143                            responder: CupGetInfoResponder {
1144                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1145                                tx_id: header.tx_id,
1146                            },
1147                        })
1148                    }
1149                    _ => Err(fidl::Error::UnknownOrdinal {
1150                        ordinal: header.ordinal,
1151                        protocol_name:
1152                            <CupMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
1153                    }),
1154                }))
1155            },
1156        )
1157    }
1158}
1159
1160/// This protocol gives access to persisted CUP data for eager packages in
1161/// pkg-resolver.
1162#[derive(Debug)]
1163pub enum CupRequest {
1164    /// Resolve the eager package given by the pinned package URL, and write the
1165    /// CUP data to storage.
1166    Write { url: PackageUrl, cup: CupData, responder: CupWriteResponder },
1167    /// Returns the eager package version and channel of the given package URL.
1168    GetInfo { url: PackageUrl, responder: CupGetInfoResponder },
1169}
1170
1171impl CupRequest {
1172    #[allow(irrefutable_let_patterns)]
1173    pub fn into_write(self) -> Option<(PackageUrl, CupData, CupWriteResponder)> {
1174        if let CupRequest::Write { url, cup, responder } = self {
1175            Some((url, cup, responder))
1176        } else {
1177            None
1178        }
1179    }
1180
1181    #[allow(irrefutable_let_patterns)]
1182    pub fn into_get_info(self) -> Option<(PackageUrl, CupGetInfoResponder)> {
1183        if let CupRequest::GetInfo { url, responder } = self {
1184            Some((url, responder))
1185        } else {
1186            None
1187        }
1188    }
1189
1190    /// Name of the method defined in FIDL
1191    pub fn method_name(&self) -> &'static str {
1192        match *self {
1193            CupRequest::Write { .. } => "write",
1194            CupRequest::GetInfo { .. } => "get_info",
1195        }
1196    }
1197}
1198
1199#[derive(Debug, Clone)]
1200pub struct CupControlHandle {
1201    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
1202}
1203
1204impl fdomain_client::fidl::ControlHandle for CupControlHandle {
1205    fn shutdown(&self) {
1206        self.inner.shutdown()
1207    }
1208
1209    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
1210        self.inner.shutdown_with_epitaph(status)
1211    }
1212
1213    fn is_closed(&self) -> bool {
1214        self.inner.channel().is_closed()
1215    }
1216    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
1217        self.inner.channel().on_closed()
1218    }
1219}
1220
1221impl CupControlHandle {}
1222
1223#[must_use = "FIDL methods require a response to be sent"]
1224#[derive(Debug)]
1225pub struct CupWriteResponder {
1226    control_handle: std::mem::ManuallyDrop<CupControlHandle>,
1227    tx_id: u32,
1228}
1229
1230/// Set the the channel to be shutdown (see [`CupControlHandle::shutdown`])
1231/// if the responder is dropped without sending a response, so that the client
1232/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1233impl std::ops::Drop for CupWriteResponder {
1234    fn drop(&mut self) {
1235        self.control_handle.shutdown();
1236        // Safety: drops once, never accessed again
1237        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1238    }
1239}
1240
1241impl fdomain_client::fidl::Responder for CupWriteResponder {
1242    type ControlHandle = CupControlHandle;
1243
1244    fn control_handle(&self) -> &CupControlHandle {
1245        &self.control_handle
1246    }
1247
1248    fn drop_without_shutdown(mut self) {
1249        // Safety: drops once, never accessed again due to mem::forget
1250        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1251        // Prevent Drop from running (which would shut down the channel)
1252        std::mem::forget(self);
1253    }
1254}
1255
1256impl CupWriteResponder {
1257    /// Sends a response to the FIDL transaction.
1258    ///
1259    /// Sets the channel to shutdown if an error occurs.
1260    pub fn send(self, mut result: Result<(), WriteError>) -> Result<(), fidl::Error> {
1261        let _result = self.send_raw(result);
1262        if _result.is_err() {
1263            self.control_handle.shutdown();
1264        }
1265        self.drop_without_shutdown();
1266        _result
1267    }
1268
1269    /// Similar to "send" but does not shutdown the channel if an error occurs.
1270    pub fn send_no_shutdown_on_err(
1271        self,
1272        mut result: Result<(), WriteError>,
1273    ) -> Result<(), fidl::Error> {
1274        let _result = self.send_raw(result);
1275        self.drop_without_shutdown();
1276        _result
1277    }
1278
1279    fn send_raw(&self, mut result: Result<(), WriteError>) -> Result<(), fidl::Error> {
1280        self.control_handle
1281            .inner
1282            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, WriteError>>(
1283                result,
1284                self.tx_id,
1285                0x29f30e83bda39c37,
1286                fidl::encoding::DynamicFlags::empty(),
1287            )
1288    }
1289}
1290
1291#[must_use = "FIDL methods require a response to be sent"]
1292#[derive(Debug)]
1293pub struct CupGetInfoResponder {
1294    control_handle: std::mem::ManuallyDrop<CupControlHandle>,
1295    tx_id: u32,
1296}
1297
1298/// Set the the channel to be shutdown (see [`CupControlHandle::shutdown`])
1299/// if the responder is dropped without sending a response, so that the client
1300/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1301impl std::ops::Drop for CupGetInfoResponder {
1302    fn drop(&mut self) {
1303        self.control_handle.shutdown();
1304        // Safety: drops once, never accessed again
1305        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1306    }
1307}
1308
1309impl fdomain_client::fidl::Responder for CupGetInfoResponder {
1310    type ControlHandle = CupControlHandle;
1311
1312    fn control_handle(&self) -> &CupControlHandle {
1313        &self.control_handle
1314    }
1315
1316    fn drop_without_shutdown(mut self) {
1317        // Safety: drops once, never accessed again due to mem::forget
1318        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1319        // Prevent Drop from running (which would shut down the channel)
1320        std::mem::forget(self);
1321    }
1322}
1323
1324impl CupGetInfoResponder {
1325    /// Sends a response to the FIDL transaction.
1326    ///
1327    /// Sets the channel to shutdown if an error occurs.
1328    pub fn send(self, mut result: Result<(&str, &str), GetInfoError>) -> Result<(), fidl::Error> {
1329        let _result = self.send_raw(result);
1330        if _result.is_err() {
1331            self.control_handle.shutdown();
1332        }
1333        self.drop_without_shutdown();
1334        _result
1335    }
1336
1337    /// Similar to "send" but does not shutdown the channel if an error occurs.
1338    pub fn send_no_shutdown_on_err(
1339        self,
1340        mut result: Result<(&str, &str), GetInfoError>,
1341    ) -> Result<(), fidl::Error> {
1342        let _result = self.send_raw(result);
1343        self.drop_without_shutdown();
1344        _result
1345    }
1346
1347    fn send_raw(&self, mut result: Result<(&str, &str), GetInfoError>) -> Result<(), fidl::Error> {
1348        self.control_handle
1349            .inner
1350            .send::<fidl::encoding::ResultType<CupGetInfoResponse, GetInfoError>>(
1351                result,
1352                self.tx_id,
1353                0x5b2cedd887209b9c,
1354                fidl::encoding::DynamicFlags::empty(),
1355            )
1356    }
1357}
1358
1359#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
1360pub struct FontResolverMarker;
1361
1362impl fdomain_client::fidl::ProtocolMarker for FontResolverMarker {
1363    type Proxy = FontResolverProxy;
1364    type RequestStream = FontResolverRequestStream;
1365
1366    const DEBUG_NAME: &'static str = "fuchsia.pkg.FontResolver";
1367}
1368impl fdomain_client::fidl::DiscoverableProtocolMarker for FontResolverMarker {}
1369pub type FontResolverResolveResult = Result<(), i32>;
1370
1371pub trait FontResolverProxyInterface: Send + Sync {
1372    type ResolveResponseFut: std::future::Future<Output = Result<FontResolverResolveResult, fidl::Error>>
1373        + Send;
1374    fn r#resolve(
1375        &self,
1376        package_url: &str,
1377        directory_request: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
1378    ) -> Self::ResolveResponseFut;
1379}
1380
1381#[derive(Debug, Clone)]
1382pub struct FontResolverProxy {
1383    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
1384}
1385
1386impl fdomain_client::fidl::Proxy for FontResolverProxy {
1387    type Protocol = FontResolverMarker;
1388
1389    fn from_channel(inner: fdomain_client::Channel) -> Self {
1390        Self::new(inner)
1391    }
1392
1393    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
1394        self.client.into_channel().map_err(|client| Self { client })
1395    }
1396
1397    fn as_channel(&self) -> &fdomain_client::Channel {
1398        self.client.as_channel()
1399    }
1400}
1401
1402impl FontResolverProxy {
1403    /// Create a new Proxy for fuchsia.pkg/FontResolver.
1404    pub fn new(channel: fdomain_client::Channel) -> Self {
1405        let protocol_name =
1406            <FontResolverMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
1407        Self { client: fidl::client::Client::new(channel, protocol_name) }
1408    }
1409
1410    /// Get a Stream of events from the remote end of the protocol.
1411    ///
1412    /// # Panics
1413    ///
1414    /// Panics if the event stream was already taken.
1415    pub fn take_event_stream(&self) -> FontResolverEventStream {
1416        FontResolverEventStream { event_receiver: self.client.take_event_receiver() }
1417    }
1418
1419    /// Populates or updates the cache of a font package, fetching it if it is not present on the
1420    /// local system.
1421    ///
1422    /// + request `package_url` the package URL of a font package.
1423    /// + request `directory_request` a request for a directory that will be resolved when the
1424    ///   package has been successfully cached. The directory should contain a single file,
1425    ///   corresponding to the asset filename. The client should retain the directory handle
1426    ///   for as long as needed to prevent the package from being evicted from cache.
1427    /// * error a zx_status value indicating failure. One of the following:
1428    ///     * `ZX_ERR_ACCESS_DENIED` if the resolver does not have permission to fetch a
1429    ///       package blob.
1430    ///     * `ZX_ERR_IO` if there is some other unspecified error during I/O.
1431    ///     * `ZX_ERR_NOT_FOUND` if the font package or a package blob does not exist, or is
1432    ///       not known to be a font package.
1433    ///     * `ZX_ERR_NO_SPACE` if there is no space available to store the package.
1434    ///     * `ZX_ERR_UNAVAILABLE` if the resolver is currently unable to fetch a package blob.
1435    pub fn r#resolve(
1436        &self,
1437        mut package_url: &str,
1438        mut directory_request: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
1439    ) -> fidl::client::QueryResponseFut<
1440        FontResolverResolveResult,
1441        fdomain_client::fidl::FDomainResourceDialect,
1442    > {
1443        FontResolverProxyInterface::r#resolve(self, package_url, directory_request)
1444    }
1445}
1446
1447impl FontResolverProxyInterface for FontResolverProxy {
1448    type ResolveResponseFut = fidl::client::QueryResponseFut<
1449        FontResolverResolveResult,
1450        fdomain_client::fidl::FDomainResourceDialect,
1451    >;
1452    fn r#resolve(
1453        &self,
1454        mut package_url: &str,
1455        mut directory_request: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
1456    ) -> Self::ResolveResponseFut {
1457        fn _decode(
1458            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1459        ) -> Result<FontResolverResolveResult, fidl::Error> {
1460            let _response = fidl::client::decode_transaction_body::<
1461                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>,
1462                fdomain_client::fidl::FDomainResourceDialect,
1463                0x159f60cc5ba432da,
1464            >(_buf?)?;
1465            Ok(_response.map(|x| x))
1466        }
1467        self.client.send_query_and_decode::<FontResolverResolveRequest, FontResolverResolveResult>(
1468            (package_url, directory_request),
1469            0x159f60cc5ba432da,
1470            fidl::encoding::DynamicFlags::empty(),
1471            _decode,
1472        )
1473    }
1474}
1475
1476pub struct FontResolverEventStream {
1477    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
1478}
1479
1480impl std::marker::Unpin for FontResolverEventStream {}
1481
1482impl futures::stream::FusedStream for FontResolverEventStream {
1483    fn is_terminated(&self) -> bool {
1484        self.event_receiver.is_terminated()
1485    }
1486}
1487
1488impl futures::Stream for FontResolverEventStream {
1489    type Item = Result<FontResolverEvent, fidl::Error>;
1490
1491    fn poll_next(
1492        mut self: std::pin::Pin<&mut Self>,
1493        cx: &mut std::task::Context<'_>,
1494    ) -> std::task::Poll<Option<Self::Item>> {
1495        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1496            &mut self.event_receiver,
1497            cx
1498        )?) {
1499            Some(buf) => std::task::Poll::Ready(Some(FontResolverEvent::decode(buf))),
1500            None => std::task::Poll::Ready(None),
1501        }
1502    }
1503}
1504
1505#[derive(Debug)]
1506pub enum FontResolverEvent {}
1507
1508impl FontResolverEvent {
1509    /// Decodes a message buffer as a [`FontResolverEvent`].
1510    fn decode(
1511        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1512    ) -> Result<FontResolverEvent, fidl::Error> {
1513        let (bytes, _handles) = buf.split_mut();
1514        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1515        debug_assert_eq!(tx_header.tx_id, 0);
1516        match tx_header.ordinal {
1517            _ => Err(fidl::Error::UnknownOrdinal {
1518                ordinal: tx_header.ordinal,
1519                protocol_name:
1520                    <FontResolverMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
1521            }),
1522        }
1523    }
1524}
1525
1526/// A Stream of incoming requests for fuchsia.pkg/FontResolver.
1527pub struct FontResolverRequestStream {
1528    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
1529    is_terminated: bool,
1530}
1531
1532impl std::marker::Unpin for FontResolverRequestStream {}
1533
1534impl futures::stream::FusedStream for FontResolverRequestStream {
1535    fn is_terminated(&self) -> bool {
1536        self.is_terminated
1537    }
1538}
1539
1540impl fdomain_client::fidl::RequestStream for FontResolverRequestStream {
1541    type Protocol = FontResolverMarker;
1542    type ControlHandle = FontResolverControlHandle;
1543
1544    fn from_channel(channel: fdomain_client::Channel) -> Self {
1545        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
1546    }
1547
1548    fn control_handle(&self) -> Self::ControlHandle {
1549        FontResolverControlHandle { inner: self.inner.clone() }
1550    }
1551
1552    fn into_inner(
1553        self,
1554    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
1555    {
1556        (self.inner, self.is_terminated)
1557    }
1558
1559    fn from_inner(
1560        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
1561        is_terminated: bool,
1562    ) -> Self {
1563        Self { inner, is_terminated }
1564    }
1565}
1566
1567impl futures::Stream for FontResolverRequestStream {
1568    type Item = Result<FontResolverRequest, fidl::Error>;
1569
1570    fn poll_next(
1571        mut self: std::pin::Pin<&mut Self>,
1572        cx: &mut std::task::Context<'_>,
1573    ) -> std::task::Poll<Option<Self::Item>> {
1574        let this = &mut *self;
1575        if this.inner.check_shutdown(cx) {
1576            this.is_terminated = true;
1577            return std::task::Poll::Ready(None);
1578        }
1579        if this.is_terminated {
1580            panic!("polled FontResolverRequestStream after completion");
1581        }
1582        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
1583            |bytes, handles| {
1584                match this.inner.channel().read_etc(cx, bytes, handles) {
1585                    std::task::Poll::Ready(Ok(())) => {}
1586                    std::task::Poll::Pending => return std::task::Poll::Pending,
1587                    std::task::Poll::Ready(Err(None)) => {
1588                        this.is_terminated = true;
1589                        return std::task::Poll::Ready(None);
1590                    }
1591                    std::task::Poll::Ready(Err(Some(e))) => {
1592                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
1593                            e.into(),
1594                        ))));
1595                    }
1596                }
1597
1598                // A message has been received from the channel
1599                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1600
1601                std::task::Poll::Ready(Some(match header.ordinal {
1602                    0x159f60cc5ba432da => {
1603                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1604                        let mut req = fidl::new_empty!(
1605                            FontResolverResolveRequest,
1606                            fdomain_client::fidl::FDomainResourceDialect
1607                        );
1608                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<FontResolverResolveRequest>(&header, _body_bytes, handles, &mut req)?;
1609                        let control_handle =
1610                            FontResolverControlHandle { inner: this.inner.clone() };
1611                        Ok(FontResolverRequest::Resolve {
1612                            package_url: req.package_url,
1613                            directory_request: req.directory_request,
1614
1615                            responder: FontResolverResolveResponder {
1616                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1617                                tx_id: header.tx_id,
1618                            },
1619                        })
1620                    }
1621                    _ => Err(fidl::Error::UnknownOrdinal {
1622                        ordinal: header.ordinal,
1623                        protocol_name:
1624                            <FontResolverMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
1625                    }),
1626                }))
1627            },
1628        )
1629    }
1630}
1631
1632/// This resolves font packages from a registry.
1633///
1634/// This is intended to be implemented by package resolver components, and used
1635/// exclusively by fuchsia.fonts.Provider.
1636///
1637/// DEPRECATED. This is an interim solution, and will be revisited when Component Framework v2
1638/// becomes available and allows non-component packages and easier directory routing.
1639#[derive(Debug)]
1640pub enum FontResolverRequest {
1641    /// Populates or updates the cache of a font package, fetching it if it is not present on the
1642    /// local system.
1643    ///
1644    /// + request `package_url` the package URL of a font package.
1645    /// + request `directory_request` a request for a directory that will be resolved when the
1646    ///   package has been successfully cached. The directory should contain a single file,
1647    ///   corresponding to the asset filename. The client should retain the directory handle
1648    ///   for as long as needed to prevent the package from being evicted from cache.
1649    /// * error a zx_status value indicating failure. One of the following:
1650    ///     * `ZX_ERR_ACCESS_DENIED` if the resolver does not have permission to fetch a
1651    ///       package blob.
1652    ///     * `ZX_ERR_IO` if there is some other unspecified error during I/O.
1653    ///     * `ZX_ERR_NOT_FOUND` if the font package or a package blob does not exist, or is
1654    ///       not known to be a font package.
1655    ///     * `ZX_ERR_NO_SPACE` if there is no space available to store the package.
1656    ///     * `ZX_ERR_UNAVAILABLE` if the resolver is currently unable to fetch a package blob.
1657    Resolve {
1658        package_url: String,
1659        directory_request: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
1660        responder: FontResolverResolveResponder,
1661    },
1662}
1663
1664impl FontResolverRequest {
1665    #[allow(irrefutable_let_patterns)]
1666    pub fn into_resolve(
1667        self,
1668    ) -> Option<(
1669        String,
1670        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
1671        FontResolverResolveResponder,
1672    )> {
1673        if let FontResolverRequest::Resolve { package_url, directory_request, responder } = self {
1674            Some((package_url, directory_request, responder))
1675        } else {
1676            None
1677        }
1678    }
1679
1680    /// Name of the method defined in FIDL
1681    pub fn method_name(&self) -> &'static str {
1682        match *self {
1683            FontResolverRequest::Resolve { .. } => "resolve",
1684        }
1685    }
1686}
1687
1688#[derive(Debug, Clone)]
1689pub struct FontResolverControlHandle {
1690    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
1691}
1692
1693impl fdomain_client::fidl::ControlHandle for FontResolverControlHandle {
1694    fn shutdown(&self) {
1695        self.inner.shutdown()
1696    }
1697
1698    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
1699        self.inner.shutdown_with_epitaph(status)
1700    }
1701
1702    fn is_closed(&self) -> bool {
1703        self.inner.channel().is_closed()
1704    }
1705    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
1706        self.inner.channel().on_closed()
1707    }
1708}
1709
1710impl FontResolverControlHandle {}
1711
1712#[must_use = "FIDL methods require a response to be sent"]
1713#[derive(Debug)]
1714pub struct FontResolverResolveResponder {
1715    control_handle: std::mem::ManuallyDrop<FontResolverControlHandle>,
1716    tx_id: u32,
1717}
1718
1719/// Set the the channel to be shutdown (see [`FontResolverControlHandle::shutdown`])
1720/// if the responder is dropped without sending a response, so that the client
1721/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1722impl std::ops::Drop for FontResolverResolveResponder {
1723    fn drop(&mut self) {
1724        self.control_handle.shutdown();
1725        // Safety: drops once, never accessed again
1726        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1727    }
1728}
1729
1730impl fdomain_client::fidl::Responder for FontResolverResolveResponder {
1731    type ControlHandle = FontResolverControlHandle;
1732
1733    fn control_handle(&self) -> &FontResolverControlHandle {
1734        &self.control_handle
1735    }
1736
1737    fn drop_without_shutdown(mut self) {
1738        // Safety: drops once, never accessed again due to mem::forget
1739        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1740        // Prevent Drop from running (which would shut down the channel)
1741        std::mem::forget(self);
1742    }
1743}
1744
1745impl FontResolverResolveResponder {
1746    /// Sends a response to the FIDL transaction.
1747    ///
1748    /// Sets the channel to shutdown if an error occurs.
1749    pub fn send(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
1750        let _result = self.send_raw(result);
1751        if _result.is_err() {
1752            self.control_handle.shutdown();
1753        }
1754        self.drop_without_shutdown();
1755        _result
1756    }
1757
1758    /// Similar to "send" but does not shutdown the channel if an error occurs.
1759    pub fn send_no_shutdown_on_err(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
1760        let _result = self.send_raw(result);
1761        self.drop_without_shutdown();
1762        _result
1763    }
1764
1765    fn send_raw(&self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
1766        self.control_handle
1767            .inner
1768            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>>(
1769                result,
1770                self.tx_id,
1771                0x159f60cc5ba432da,
1772                fidl::encoding::DynamicFlags::empty(),
1773            )
1774    }
1775}
1776
1777#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
1778pub struct NeededBlobsMarker;
1779
1780impl fdomain_client::fidl::ProtocolMarker for NeededBlobsMarker {
1781    type Proxy = NeededBlobsProxy;
1782    type RequestStream = NeededBlobsRequestStream;
1783
1784    const DEBUG_NAME: &'static str = "(anonymous) NeededBlobs";
1785}
1786pub type NeededBlobsOpenMetaBlobResult = Result<
1787    Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
1788    OpenBlobError,
1789>;
1790pub type NeededBlobsOpenBlobResult = Result<
1791    Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
1792    OpenBlobError,
1793>;
1794pub type NeededBlobsBlobWrittenResult = Result<(), BlobWrittenError>;
1795
1796pub trait NeededBlobsProxyInterface: Send + Sync {
1797    type OpenMetaBlobResponseFut: std::future::Future<Output = Result<NeededBlobsOpenMetaBlobResult, fidl::Error>>
1798        + Send;
1799    fn r#open_meta_blob(&self) -> Self::OpenMetaBlobResponseFut;
1800    fn r#get_missing_blobs(
1801        &self,
1802        iterator: fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>,
1803    ) -> Result<(), fidl::Error>;
1804    type OpenBlobResponseFut: std::future::Future<Output = Result<NeededBlobsOpenBlobResult, fidl::Error>>
1805        + Send;
1806    fn r#open_blob(&self, blob_id: &BlobId, allow_existing: bool) -> Self::OpenBlobResponseFut;
1807    type BlobWrittenResponseFut: std::future::Future<Output = Result<NeededBlobsBlobWrittenResult, fidl::Error>>
1808        + Send;
1809    fn r#blob_written(&self, blob_id: &BlobId) -> Self::BlobWrittenResponseFut;
1810    type AbortResponseFut: std::future::Future<Output = Result<(), fidl::Error>> + Send;
1811    fn r#abort(&self) -> Self::AbortResponseFut;
1812}
1813
1814#[derive(Debug, Clone)]
1815pub struct NeededBlobsProxy {
1816    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
1817}
1818
1819impl fdomain_client::fidl::Proxy for NeededBlobsProxy {
1820    type Protocol = NeededBlobsMarker;
1821
1822    fn from_channel(inner: fdomain_client::Channel) -> Self {
1823        Self::new(inner)
1824    }
1825
1826    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
1827        self.client.into_channel().map_err(|client| Self { client })
1828    }
1829
1830    fn as_channel(&self) -> &fdomain_client::Channel {
1831        self.client.as_channel()
1832    }
1833}
1834
1835impl NeededBlobsProxy {
1836    /// Create a new Proxy for fuchsia.pkg/NeededBlobs.
1837    pub fn new(channel: fdomain_client::Channel) -> Self {
1838        let protocol_name = <NeededBlobsMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
1839        Self { client: fidl::client::Client::new(channel, protocol_name) }
1840    }
1841
1842    /// Get a Stream of events from the remote end of the protocol.
1843    ///
1844    /// # Panics
1845    ///
1846    /// Panics if the event stream was already taken.
1847    pub fn take_event_stream(&self) -> NeededBlobsEventStream {
1848        NeededBlobsEventStream { event_receiver: self.client.take_event_receiver() }
1849    }
1850
1851    /// Opens the package's metadata blob for writing. `GetMissingBlobs()`
1852    /// should not be called until writing the meta blob or this request
1853    /// responds with `false`.
1854    ///
1855    /// If the package was already cached, server will close the channel with a
1856    /// `ZX_OK` epitaph.
1857    ///
1858    /// - response `writer` is used to write the blob. If `writer` is absent,
1859    ///   the blob is already cached and so does not need to be written.
1860    /// * error an OpenBlobError indicating failure. Clients may retry this
1861    ///   request, though the server end may abort this cache operation on
1862    ///   errors it considers to be fatal.
1863    pub fn r#open_meta_blob(
1864        &self,
1865    ) -> fidl::client::QueryResponseFut<
1866        NeededBlobsOpenMetaBlobResult,
1867        fdomain_client::fidl::FDomainResourceDialect,
1868    > {
1869        NeededBlobsProxyInterface::r#open_meta_blob(self)
1870    }
1871
1872    /// Returns an iterator of blobs that are not present on the system that
1873    /// must be written using the `OpenBlob` request before the package will be
1874    /// fully cached.
1875    ///
1876    /// Client should call `OpenMetaBlob`, and write it if needed, before
1877    /// calling `GetMissingBlobs`.
1878    ///
1879    /// A client should make this request no more than once per `NeededBlobs`
1880    /// connection. Once all blobs yielded by this iterator are written, the
1881    /// package open request will complete.
1882    ///
1883    /// New items may be added to the obtained `BlobInfoIterator` as the client
1884    /// calls `OpenBlob`, so, to guaranatee termination of the iterator, clients
1885    /// should call `OpenBlob` concurrently with reading the iterator.
1886    ///
1887    /// + request `iterator` a request for an iterator of [`BlobInfo`] of blobs
1888    ///   that the client should try to write.
1889    pub fn r#get_missing_blobs(
1890        &self,
1891        mut iterator: fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>,
1892    ) -> Result<(), fidl::Error> {
1893        NeededBlobsProxyInterface::r#get_missing_blobs(self, iterator)
1894    }
1895
1896    /// Opens a blob for writing.
1897    ///
1898    /// + request `blob_id` the blob id describing this blob.
1899    /// + request `allow_existing` whether to open the blob even if it is already present.
1900    /// - response `writer` is used to write the blob. If `writer` is absent,
1901    ///   the blob is already cached and so does not need to be written.
1902    /// * error an OpenBlobError indicating failure. Clients may retry this
1903    ///   request, though the server end may abort this cache operation on
1904    ///   errors it considers to be fatal.
1905    pub fn r#open_blob(
1906        &self,
1907        mut blob_id: &BlobId,
1908        mut allow_existing: bool,
1909    ) -> fidl::client::QueryResponseFut<
1910        NeededBlobsOpenBlobResult,
1911        fdomain_client::fidl::FDomainResourceDialect,
1912    > {
1913        NeededBlobsProxyInterface::r#open_blob(self, blob_id, allow_existing)
1914    }
1915
1916    /// Indicates that a blob opened by `Open[Meta]Blob` has been successfully
1917    /// written.
1918    ///
1919    /// A client should call this once the blob has been fully written using
1920    /// the `writer` returned by `Open[Meta]Blob`.
1921    ///
1922    /// + request `blob_id` the blob id describing this blob.
1923    /// * error a BlobWrittenError indicating failure. Clients may retry the
1924    ///   `Open[Meta]Blob` request that prompted this call, though the server
1925    ///   end may abort this cache operation on errors it considers to be fatal.
1926    pub fn r#blob_written(
1927        &self,
1928        mut blob_id: &BlobId,
1929    ) -> fidl::client::QueryResponseFut<
1930        NeededBlobsBlobWrittenResult,
1931        fdomain_client::fidl::FDomainResourceDialect,
1932    > {
1933        NeededBlobsProxyInterface::r#blob_written(self, blob_id)
1934    }
1935
1936    /// Aborts this caching operation for the package.
1937    ///
1938    /// Any open blobs and any missing blobs iterator will be closed. Any `dir`
1939    /// provided to the associated [`PackageCache.Get`] request will also be
1940    /// closed. Once this request is acknowledged, this channel will be closed.
1941    ///
1942    /// Note, dropping this NeededBlobs channel without writing all needed blobs
1943    /// will also abort the package cache operation. However, this API provides
1944    /// the ability to wait for the operation to be torn down.
1945    pub fn r#abort(
1946        &self,
1947    ) -> fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect> {
1948        NeededBlobsProxyInterface::r#abort(self)
1949    }
1950}
1951
1952impl NeededBlobsProxyInterface for NeededBlobsProxy {
1953    type OpenMetaBlobResponseFut = fidl::client::QueryResponseFut<
1954        NeededBlobsOpenMetaBlobResult,
1955        fdomain_client::fidl::FDomainResourceDialect,
1956    >;
1957    fn r#open_meta_blob(&self) -> Self::OpenMetaBlobResponseFut {
1958        fn _decode(
1959            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1960        ) -> Result<NeededBlobsOpenMetaBlobResult, fidl::Error> {
1961            let _response = fidl::client::decode_transaction_body::<
1962                fidl::encoding::ResultType<NeededBlobsOpenMetaBlobResponse, OpenBlobError>,
1963                fdomain_client::fidl::FDomainResourceDialect,
1964                0x42f385a58180f5fb,
1965            >(_buf?)?;
1966            Ok(_response.map(|x| x.writer))
1967        }
1968        self.client
1969            .send_query_and_decode::<fidl::encoding::EmptyPayload, NeededBlobsOpenMetaBlobResult>(
1970                (),
1971                0x42f385a58180f5fb,
1972                fidl::encoding::DynamicFlags::empty(),
1973                _decode,
1974            )
1975    }
1976
1977    fn r#get_missing_blobs(
1978        &self,
1979        mut iterator: fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>,
1980    ) -> Result<(), fidl::Error> {
1981        self.client.send::<NeededBlobsGetMissingBlobsRequest>(
1982            (iterator,),
1983            0x44eaf14fd56e7ae1,
1984            fidl::encoding::DynamicFlags::empty(),
1985        )
1986    }
1987
1988    type OpenBlobResponseFut = fidl::client::QueryResponseFut<
1989        NeededBlobsOpenBlobResult,
1990        fdomain_client::fidl::FDomainResourceDialect,
1991    >;
1992    fn r#open_blob(
1993        &self,
1994        mut blob_id: &BlobId,
1995        mut allow_existing: bool,
1996    ) -> Self::OpenBlobResponseFut {
1997        fn _decode(
1998            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
1999        ) -> Result<NeededBlobsOpenBlobResult, fidl::Error> {
2000            let _response = fidl::client::decode_transaction_body::<
2001                fidl::encoding::ResultType<NeededBlobsOpenBlobResponse, OpenBlobError>,
2002                fdomain_client::fidl::FDomainResourceDialect,
2003                0x67cd4c4cd10ea9e0,
2004            >(_buf?)?;
2005            Ok(_response.map(|x| x.writer))
2006        }
2007        self.client.send_query_and_decode::<NeededBlobsOpenBlobRequest, NeededBlobsOpenBlobResult>(
2008            (blob_id, allow_existing),
2009            0x67cd4c4cd10ea9e0,
2010            fidl::encoding::DynamicFlags::empty(),
2011            _decode,
2012        )
2013    }
2014
2015    type BlobWrittenResponseFut = fidl::client::QueryResponseFut<
2016        NeededBlobsBlobWrittenResult,
2017        fdomain_client::fidl::FDomainResourceDialect,
2018    >;
2019    fn r#blob_written(&self, mut blob_id: &BlobId) -> Self::BlobWrittenResponseFut {
2020        fn _decode(
2021            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
2022        ) -> Result<NeededBlobsBlobWrittenResult, fidl::Error> {
2023            let _response = fidl::client::decode_transaction_body::<
2024                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, BlobWrittenError>,
2025                fdomain_client::fidl::FDomainResourceDialect,
2026                0x222f80ec77433f44,
2027            >(_buf?)?;
2028            Ok(_response.map(|x| x))
2029        }
2030        self.client
2031            .send_query_and_decode::<NeededBlobsBlobWrittenRequest, NeededBlobsBlobWrittenResult>(
2032                (blob_id,),
2033                0x222f80ec77433f44,
2034                fidl::encoding::DynamicFlags::empty(),
2035                _decode,
2036            )
2037    }
2038
2039    type AbortResponseFut =
2040        fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect>;
2041    fn r#abort(&self) -> Self::AbortResponseFut {
2042        fn _decode(
2043            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
2044        ) -> Result<(), fidl::Error> {
2045            let _response = fidl::client::decode_transaction_body::<
2046                fidl::encoding::EmptyPayload,
2047                fdomain_client::fidl::FDomainResourceDialect,
2048                0x6fda8d5ebea74cbb,
2049            >(_buf?)?;
2050            Ok(_response)
2051        }
2052        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, ()>(
2053            (),
2054            0x6fda8d5ebea74cbb,
2055            fidl::encoding::DynamicFlags::empty(),
2056            _decode,
2057        )
2058    }
2059}
2060
2061pub struct NeededBlobsEventStream {
2062    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
2063}
2064
2065impl std::marker::Unpin for NeededBlobsEventStream {}
2066
2067impl futures::stream::FusedStream for NeededBlobsEventStream {
2068    fn is_terminated(&self) -> bool {
2069        self.event_receiver.is_terminated()
2070    }
2071}
2072
2073impl futures::Stream for NeededBlobsEventStream {
2074    type Item = Result<NeededBlobsEvent, fidl::Error>;
2075
2076    fn poll_next(
2077        mut self: std::pin::Pin<&mut Self>,
2078        cx: &mut std::task::Context<'_>,
2079    ) -> std::task::Poll<Option<Self::Item>> {
2080        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
2081            &mut self.event_receiver,
2082            cx
2083        )?) {
2084            Some(buf) => std::task::Poll::Ready(Some(NeededBlobsEvent::decode(buf))),
2085            None => std::task::Poll::Ready(None),
2086        }
2087    }
2088}
2089
2090#[derive(Debug)]
2091pub enum NeededBlobsEvent {}
2092
2093impl NeededBlobsEvent {
2094    /// Decodes a message buffer as a [`NeededBlobsEvent`].
2095    fn decode(
2096        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
2097    ) -> Result<NeededBlobsEvent, fidl::Error> {
2098        let (bytes, _handles) = buf.split_mut();
2099        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
2100        debug_assert_eq!(tx_header.tx_id, 0);
2101        match tx_header.ordinal {
2102            _ => Err(fidl::Error::UnknownOrdinal {
2103                ordinal: tx_header.ordinal,
2104                protocol_name:
2105                    <NeededBlobsMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
2106            }),
2107        }
2108    }
2109}
2110
2111/// A Stream of incoming requests for fuchsia.pkg/NeededBlobs.
2112pub struct NeededBlobsRequestStream {
2113    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
2114    is_terminated: bool,
2115}
2116
2117impl std::marker::Unpin for NeededBlobsRequestStream {}
2118
2119impl futures::stream::FusedStream for NeededBlobsRequestStream {
2120    fn is_terminated(&self) -> bool {
2121        self.is_terminated
2122    }
2123}
2124
2125impl fdomain_client::fidl::RequestStream for NeededBlobsRequestStream {
2126    type Protocol = NeededBlobsMarker;
2127    type ControlHandle = NeededBlobsControlHandle;
2128
2129    fn from_channel(channel: fdomain_client::Channel) -> Self {
2130        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
2131    }
2132
2133    fn control_handle(&self) -> Self::ControlHandle {
2134        NeededBlobsControlHandle { inner: self.inner.clone() }
2135    }
2136
2137    fn into_inner(
2138        self,
2139    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
2140    {
2141        (self.inner, self.is_terminated)
2142    }
2143
2144    fn from_inner(
2145        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
2146        is_terminated: bool,
2147    ) -> Self {
2148        Self { inner, is_terminated }
2149    }
2150}
2151
2152impl futures::Stream for NeededBlobsRequestStream {
2153    type Item = Result<NeededBlobsRequest, fidl::Error>;
2154
2155    fn poll_next(
2156        mut self: std::pin::Pin<&mut Self>,
2157        cx: &mut std::task::Context<'_>,
2158    ) -> std::task::Poll<Option<Self::Item>> {
2159        let this = &mut *self;
2160        if this.inner.check_shutdown(cx) {
2161            this.is_terminated = true;
2162            return std::task::Poll::Ready(None);
2163        }
2164        if this.is_terminated {
2165            panic!("polled NeededBlobsRequestStream after completion");
2166        }
2167        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
2168            |bytes, handles| {
2169                match this.inner.channel().read_etc(cx, bytes, handles) {
2170                    std::task::Poll::Ready(Ok(())) => {}
2171                    std::task::Poll::Pending => return std::task::Poll::Pending,
2172                    std::task::Poll::Ready(Err(None)) => {
2173                        this.is_terminated = true;
2174                        return std::task::Poll::Ready(None);
2175                    }
2176                    std::task::Poll::Ready(Err(Some(e))) => {
2177                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
2178                            e.into(),
2179                        ))));
2180                    }
2181                }
2182
2183                // A message has been received from the channel
2184                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
2185
2186                std::task::Poll::Ready(Some(match header.ordinal {
2187                    0x42f385a58180f5fb => {
2188                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
2189                        let mut req = fidl::new_empty!(
2190                            fidl::encoding::EmptyPayload,
2191                            fdomain_client::fidl::FDomainResourceDialect
2192                        );
2193                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
2194                        let control_handle = NeededBlobsControlHandle { inner: this.inner.clone() };
2195                        Ok(NeededBlobsRequest::OpenMetaBlob {
2196                            responder: NeededBlobsOpenMetaBlobResponder {
2197                                control_handle: std::mem::ManuallyDrop::new(control_handle),
2198                                tx_id: header.tx_id,
2199                            },
2200                        })
2201                    }
2202                    0x44eaf14fd56e7ae1 => {
2203                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
2204                        let mut req = fidl::new_empty!(
2205                            NeededBlobsGetMissingBlobsRequest,
2206                            fdomain_client::fidl::FDomainResourceDialect
2207                        );
2208                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<NeededBlobsGetMissingBlobsRequest>(&header, _body_bytes, handles, &mut req)?;
2209                        let control_handle = NeededBlobsControlHandle { inner: this.inner.clone() };
2210                        Ok(NeededBlobsRequest::GetMissingBlobs {
2211                            iterator: req.iterator,
2212
2213                            control_handle,
2214                        })
2215                    }
2216                    0x67cd4c4cd10ea9e0 => {
2217                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
2218                        let mut req = fidl::new_empty!(
2219                            NeededBlobsOpenBlobRequest,
2220                            fdomain_client::fidl::FDomainResourceDialect
2221                        );
2222                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<NeededBlobsOpenBlobRequest>(&header, _body_bytes, handles, &mut req)?;
2223                        let control_handle = NeededBlobsControlHandle { inner: this.inner.clone() };
2224                        Ok(NeededBlobsRequest::OpenBlob {
2225                            blob_id: req.blob_id,
2226                            allow_existing: req.allow_existing,
2227
2228                            responder: NeededBlobsOpenBlobResponder {
2229                                control_handle: std::mem::ManuallyDrop::new(control_handle),
2230                                tx_id: header.tx_id,
2231                            },
2232                        })
2233                    }
2234                    0x222f80ec77433f44 => {
2235                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
2236                        let mut req = fidl::new_empty!(
2237                            NeededBlobsBlobWrittenRequest,
2238                            fdomain_client::fidl::FDomainResourceDialect
2239                        );
2240                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<NeededBlobsBlobWrittenRequest>(&header, _body_bytes, handles, &mut req)?;
2241                        let control_handle = NeededBlobsControlHandle { inner: this.inner.clone() };
2242                        Ok(NeededBlobsRequest::BlobWritten {
2243                            blob_id: req.blob_id,
2244
2245                            responder: NeededBlobsBlobWrittenResponder {
2246                                control_handle: std::mem::ManuallyDrop::new(control_handle),
2247                                tx_id: header.tx_id,
2248                            },
2249                        })
2250                    }
2251                    0x6fda8d5ebea74cbb => {
2252                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
2253                        let mut req = fidl::new_empty!(
2254                            fidl::encoding::EmptyPayload,
2255                            fdomain_client::fidl::FDomainResourceDialect
2256                        );
2257                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
2258                        let control_handle = NeededBlobsControlHandle { inner: this.inner.clone() };
2259                        Ok(NeededBlobsRequest::Abort {
2260                            responder: NeededBlobsAbortResponder {
2261                                control_handle: std::mem::ManuallyDrop::new(control_handle),
2262                                tx_id: header.tx_id,
2263                            },
2264                        })
2265                    }
2266                    _ => Err(fidl::Error::UnknownOrdinal {
2267                        ordinal: header.ordinal,
2268                        protocol_name:
2269                            <NeededBlobsMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
2270                    }),
2271                }))
2272            },
2273        )
2274    }
2275}
2276
2277/// Represents the transaction for caching a particular package.
2278///
2279/// Server expects client to follow the normal operation sequence defined below.
2280/// Violating the protocol (e.g. calling wrong methods at the wrong time) will result
2281/// in the channel being closed by the package cache with a `ZX_ERR_BAD_STATE` epitaph
2282/// and aborting the package cache operation.
2283/// If a fatal error occurs at any step, server will close the channel, and client
2284/// should not proceed with the sequence.
2285/// Non-fatal errors could be retried, as long as the channel remains open.
2286///
2287/// Normal operation sequence:
2288/// 1. Clients should start by requesting to `OpenMetaBlob()`, and fetch and write
2289/// the metadata blob if needed, calling `BlobWritten()` when done to indicate the
2290/// write is complete.
2291/// 2. `GetMissingBlobs()` should be used to determine which blobs need to be
2292/// fetched and written.
2293/// 3. Each of the missing blobs needs to be written using `OpenBlob()` and
2294/// `BlobWritten()` should be called after each blob is written.
2295///
2296/// Clients are responsible for avoiding concurrent creation of the same blob if the underlying
2297/// blobstore does not support it. This currently manifests as the requirement that Clients close
2298/// the `BlobWriter` handle before retrying blob creation.
2299/// This applies per `BlobId` to all `BlobWriter`s returned by all calls to `Open[Meta]Blob` across
2300/// all `NeededBlobs` connections across all `PackageCache` connections.
2301///
2302/// Once all needed blobs are written by the client, the package cache will
2303/// complete the pending [`PackageCache.Get`] request and close this channel
2304/// with a `ZX_OK` epitaph.
2305#[derive(Debug)]
2306pub enum NeededBlobsRequest {
2307    /// Opens the package's metadata blob for writing. `GetMissingBlobs()`
2308    /// should not be called until writing the meta blob or this request
2309    /// responds with `false`.
2310    ///
2311    /// If the package was already cached, server will close the channel with a
2312    /// `ZX_OK` epitaph.
2313    ///
2314    /// - response `writer` is used to write the blob. If `writer` is absent,
2315    ///   the blob is already cached and so does not need to be written.
2316    /// * error an OpenBlobError indicating failure. Clients may retry this
2317    ///   request, though the server end may abort this cache operation on
2318    ///   errors it considers to be fatal.
2319    OpenMetaBlob { responder: NeededBlobsOpenMetaBlobResponder },
2320    /// Returns an iterator of blobs that are not present on the system that
2321    /// must be written using the `OpenBlob` request before the package will be
2322    /// fully cached.
2323    ///
2324    /// Client should call `OpenMetaBlob`, and write it if needed, before
2325    /// calling `GetMissingBlobs`.
2326    ///
2327    /// A client should make this request no more than once per `NeededBlobs`
2328    /// connection. Once all blobs yielded by this iterator are written, the
2329    /// package open request will complete.
2330    ///
2331    /// New items may be added to the obtained `BlobInfoIterator` as the client
2332    /// calls `OpenBlob`, so, to guaranatee termination of the iterator, clients
2333    /// should call `OpenBlob` concurrently with reading the iterator.
2334    ///
2335    /// + request `iterator` a request for an iterator of [`BlobInfo`] of blobs
2336    ///   that the client should try to write.
2337    GetMissingBlobs {
2338        iterator: fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>,
2339        control_handle: NeededBlobsControlHandle,
2340    },
2341    /// Opens a blob for writing.
2342    ///
2343    /// + request `blob_id` the blob id describing this blob.
2344    /// + request `allow_existing` whether to open the blob even if it is already present.
2345    /// - response `writer` is used to write the blob. If `writer` is absent,
2346    ///   the blob is already cached and so does not need to be written.
2347    /// * error an OpenBlobError indicating failure. Clients may retry this
2348    ///   request, though the server end may abort this cache operation on
2349    ///   errors it considers to be fatal.
2350    OpenBlob { blob_id: BlobId, allow_existing: bool, responder: NeededBlobsOpenBlobResponder },
2351    /// Indicates that a blob opened by `Open[Meta]Blob` has been successfully
2352    /// written.
2353    ///
2354    /// A client should call this once the blob has been fully written using
2355    /// the `writer` returned by `Open[Meta]Blob`.
2356    ///
2357    /// + request `blob_id` the blob id describing this blob.
2358    /// * error a BlobWrittenError indicating failure. Clients may retry the
2359    ///   `Open[Meta]Blob` request that prompted this call, though the server
2360    ///   end may abort this cache operation on errors it considers to be fatal.
2361    BlobWritten { blob_id: BlobId, responder: NeededBlobsBlobWrittenResponder },
2362    /// Aborts this caching operation for the package.
2363    ///
2364    /// Any open blobs and any missing blobs iterator will be closed. Any `dir`
2365    /// provided to the associated [`PackageCache.Get`] request will also be
2366    /// closed. Once this request is acknowledged, this channel will be closed.
2367    ///
2368    /// Note, dropping this NeededBlobs channel without writing all needed blobs
2369    /// will also abort the package cache operation. However, this API provides
2370    /// the ability to wait for the operation to be torn down.
2371    Abort { responder: NeededBlobsAbortResponder },
2372}
2373
2374impl NeededBlobsRequest {
2375    #[allow(irrefutable_let_patterns)]
2376    pub fn into_open_meta_blob(self) -> Option<(NeededBlobsOpenMetaBlobResponder)> {
2377        if let NeededBlobsRequest::OpenMetaBlob { responder } = self {
2378            Some((responder))
2379        } else {
2380            None
2381        }
2382    }
2383
2384    #[allow(irrefutable_let_patterns)]
2385    pub fn into_get_missing_blobs(
2386        self,
2387    ) -> Option<(fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>, NeededBlobsControlHandle)>
2388    {
2389        if let NeededBlobsRequest::GetMissingBlobs { iterator, control_handle } = self {
2390            Some((iterator, control_handle))
2391        } else {
2392            None
2393        }
2394    }
2395
2396    #[allow(irrefutable_let_patterns)]
2397    pub fn into_open_blob(self) -> Option<(BlobId, bool, NeededBlobsOpenBlobResponder)> {
2398        if let NeededBlobsRequest::OpenBlob { blob_id, allow_existing, responder } = self {
2399            Some((blob_id, allow_existing, responder))
2400        } else {
2401            None
2402        }
2403    }
2404
2405    #[allow(irrefutable_let_patterns)]
2406    pub fn into_blob_written(self) -> Option<(BlobId, NeededBlobsBlobWrittenResponder)> {
2407        if let NeededBlobsRequest::BlobWritten { blob_id, responder } = self {
2408            Some((blob_id, responder))
2409        } else {
2410            None
2411        }
2412    }
2413
2414    #[allow(irrefutable_let_patterns)]
2415    pub fn into_abort(self) -> Option<(NeededBlobsAbortResponder)> {
2416        if let NeededBlobsRequest::Abort { responder } = self { Some((responder)) } else { None }
2417    }
2418
2419    /// Name of the method defined in FIDL
2420    pub fn method_name(&self) -> &'static str {
2421        match *self {
2422            NeededBlobsRequest::OpenMetaBlob { .. } => "open_meta_blob",
2423            NeededBlobsRequest::GetMissingBlobs { .. } => "get_missing_blobs",
2424            NeededBlobsRequest::OpenBlob { .. } => "open_blob",
2425            NeededBlobsRequest::BlobWritten { .. } => "blob_written",
2426            NeededBlobsRequest::Abort { .. } => "abort",
2427        }
2428    }
2429}
2430
2431#[derive(Debug, Clone)]
2432pub struct NeededBlobsControlHandle {
2433    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
2434}
2435
2436impl fdomain_client::fidl::ControlHandle for NeededBlobsControlHandle {
2437    fn shutdown(&self) {
2438        self.inner.shutdown()
2439    }
2440
2441    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
2442        self.inner.shutdown_with_epitaph(status)
2443    }
2444
2445    fn is_closed(&self) -> bool {
2446        self.inner.channel().is_closed()
2447    }
2448    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
2449        self.inner.channel().on_closed()
2450    }
2451}
2452
2453impl NeededBlobsControlHandle {}
2454
2455#[must_use = "FIDL methods require a response to be sent"]
2456#[derive(Debug)]
2457pub struct NeededBlobsOpenMetaBlobResponder {
2458    control_handle: std::mem::ManuallyDrop<NeededBlobsControlHandle>,
2459    tx_id: u32,
2460}
2461
2462/// Set the the channel to be shutdown (see [`NeededBlobsControlHandle::shutdown`])
2463/// if the responder is dropped without sending a response, so that the client
2464/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
2465impl std::ops::Drop for NeededBlobsOpenMetaBlobResponder {
2466    fn drop(&mut self) {
2467        self.control_handle.shutdown();
2468        // Safety: drops once, never accessed again
2469        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2470    }
2471}
2472
2473impl fdomain_client::fidl::Responder for NeededBlobsOpenMetaBlobResponder {
2474    type ControlHandle = NeededBlobsControlHandle;
2475
2476    fn control_handle(&self) -> &NeededBlobsControlHandle {
2477        &self.control_handle
2478    }
2479
2480    fn drop_without_shutdown(mut self) {
2481        // Safety: drops once, never accessed again due to mem::forget
2482        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2483        // Prevent Drop from running (which would shut down the channel)
2484        std::mem::forget(self);
2485    }
2486}
2487
2488impl NeededBlobsOpenMetaBlobResponder {
2489    /// Sends a response to the FIDL transaction.
2490    ///
2491    /// Sets the channel to shutdown if an error occurs.
2492    pub fn send(
2493        self,
2494        mut result: Result<
2495            Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
2496            OpenBlobError,
2497        >,
2498    ) -> Result<(), fidl::Error> {
2499        let _result = self.send_raw(result);
2500        if _result.is_err() {
2501            self.control_handle.shutdown();
2502        }
2503        self.drop_without_shutdown();
2504        _result
2505    }
2506
2507    /// Similar to "send" but does not shutdown the channel if an error occurs.
2508    pub fn send_no_shutdown_on_err(
2509        self,
2510        mut result: Result<
2511            Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
2512            OpenBlobError,
2513        >,
2514    ) -> Result<(), fidl::Error> {
2515        let _result = self.send_raw(result);
2516        self.drop_without_shutdown();
2517        _result
2518    }
2519
2520    fn send_raw(
2521        &self,
2522        mut result: Result<
2523            Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
2524            OpenBlobError,
2525        >,
2526    ) -> Result<(), fidl::Error> {
2527        self.control_handle.inner.send::<fidl::encoding::ResultType<
2528            NeededBlobsOpenMetaBlobResponse,
2529            OpenBlobError,
2530        >>(
2531            result.map(|writer| (writer,)),
2532            self.tx_id,
2533            0x42f385a58180f5fb,
2534            fidl::encoding::DynamicFlags::empty(),
2535        )
2536    }
2537}
2538
2539#[must_use = "FIDL methods require a response to be sent"]
2540#[derive(Debug)]
2541pub struct NeededBlobsOpenBlobResponder {
2542    control_handle: std::mem::ManuallyDrop<NeededBlobsControlHandle>,
2543    tx_id: u32,
2544}
2545
2546/// Set the the channel to be shutdown (see [`NeededBlobsControlHandle::shutdown`])
2547/// if the responder is dropped without sending a response, so that the client
2548/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
2549impl std::ops::Drop for NeededBlobsOpenBlobResponder {
2550    fn drop(&mut self) {
2551        self.control_handle.shutdown();
2552        // Safety: drops once, never accessed again
2553        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2554    }
2555}
2556
2557impl fdomain_client::fidl::Responder for NeededBlobsOpenBlobResponder {
2558    type ControlHandle = NeededBlobsControlHandle;
2559
2560    fn control_handle(&self) -> &NeededBlobsControlHandle {
2561        &self.control_handle
2562    }
2563
2564    fn drop_without_shutdown(mut self) {
2565        // Safety: drops once, never accessed again due to mem::forget
2566        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2567        // Prevent Drop from running (which would shut down the channel)
2568        std::mem::forget(self);
2569    }
2570}
2571
2572impl NeededBlobsOpenBlobResponder {
2573    /// Sends a response to the FIDL transaction.
2574    ///
2575    /// Sets the channel to shutdown if an error occurs.
2576    pub fn send(
2577        self,
2578        mut result: Result<
2579            Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
2580            OpenBlobError,
2581        >,
2582    ) -> Result<(), fidl::Error> {
2583        let _result = self.send_raw(result);
2584        if _result.is_err() {
2585            self.control_handle.shutdown();
2586        }
2587        self.drop_without_shutdown();
2588        _result
2589    }
2590
2591    /// Similar to "send" but does not shutdown the channel if an error occurs.
2592    pub fn send_no_shutdown_on_err(
2593        self,
2594        mut result: Result<
2595            Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
2596            OpenBlobError,
2597        >,
2598    ) -> Result<(), fidl::Error> {
2599        let _result = self.send_raw(result);
2600        self.drop_without_shutdown();
2601        _result
2602    }
2603
2604    fn send_raw(
2605        &self,
2606        mut result: Result<
2607            Option<fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>>,
2608            OpenBlobError,
2609        >,
2610    ) -> Result<(), fidl::Error> {
2611        self.control_handle.inner.send::<fidl::encoding::ResultType<
2612            NeededBlobsOpenBlobResponse,
2613            OpenBlobError,
2614        >>(
2615            result.map(|writer| (writer,)),
2616            self.tx_id,
2617            0x67cd4c4cd10ea9e0,
2618            fidl::encoding::DynamicFlags::empty(),
2619        )
2620    }
2621}
2622
2623#[must_use = "FIDL methods require a response to be sent"]
2624#[derive(Debug)]
2625pub struct NeededBlobsBlobWrittenResponder {
2626    control_handle: std::mem::ManuallyDrop<NeededBlobsControlHandle>,
2627    tx_id: u32,
2628}
2629
2630/// Set the the channel to be shutdown (see [`NeededBlobsControlHandle::shutdown`])
2631/// if the responder is dropped without sending a response, so that the client
2632/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
2633impl std::ops::Drop for NeededBlobsBlobWrittenResponder {
2634    fn drop(&mut self) {
2635        self.control_handle.shutdown();
2636        // Safety: drops once, never accessed again
2637        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2638    }
2639}
2640
2641impl fdomain_client::fidl::Responder for NeededBlobsBlobWrittenResponder {
2642    type ControlHandle = NeededBlobsControlHandle;
2643
2644    fn control_handle(&self) -> &NeededBlobsControlHandle {
2645        &self.control_handle
2646    }
2647
2648    fn drop_without_shutdown(mut self) {
2649        // Safety: drops once, never accessed again due to mem::forget
2650        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2651        // Prevent Drop from running (which would shut down the channel)
2652        std::mem::forget(self);
2653    }
2654}
2655
2656impl NeededBlobsBlobWrittenResponder {
2657    /// Sends a response to the FIDL transaction.
2658    ///
2659    /// Sets the channel to shutdown if an error occurs.
2660    pub fn send(self, mut result: Result<(), BlobWrittenError>) -> Result<(), fidl::Error> {
2661        let _result = self.send_raw(result);
2662        if _result.is_err() {
2663            self.control_handle.shutdown();
2664        }
2665        self.drop_without_shutdown();
2666        _result
2667    }
2668
2669    /// Similar to "send" but does not shutdown the channel if an error occurs.
2670    pub fn send_no_shutdown_on_err(
2671        self,
2672        mut result: Result<(), BlobWrittenError>,
2673    ) -> Result<(), fidl::Error> {
2674        let _result = self.send_raw(result);
2675        self.drop_without_shutdown();
2676        _result
2677    }
2678
2679    fn send_raw(&self, mut result: Result<(), BlobWrittenError>) -> Result<(), fidl::Error> {
2680        self.control_handle.inner.send::<fidl::encoding::ResultType<
2681            fidl::encoding::EmptyStruct,
2682            BlobWrittenError,
2683        >>(
2684            result,
2685            self.tx_id,
2686            0x222f80ec77433f44,
2687            fidl::encoding::DynamicFlags::empty(),
2688        )
2689    }
2690}
2691
2692#[must_use = "FIDL methods require a response to be sent"]
2693#[derive(Debug)]
2694pub struct NeededBlobsAbortResponder {
2695    control_handle: std::mem::ManuallyDrop<NeededBlobsControlHandle>,
2696    tx_id: u32,
2697}
2698
2699/// Set the the channel to be shutdown (see [`NeededBlobsControlHandle::shutdown`])
2700/// if the responder is dropped without sending a response, so that the client
2701/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
2702impl std::ops::Drop for NeededBlobsAbortResponder {
2703    fn drop(&mut self) {
2704        self.control_handle.shutdown();
2705        // Safety: drops once, never accessed again
2706        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2707    }
2708}
2709
2710impl fdomain_client::fidl::Responder for NeededBlobsAbortResponder {
2711    type ControlHandle = NeededBlobsControlHandle;
2712
2713    fn control_handle(&self) -> &NeededBlobsControlHandle {
2714        &self.control_handle
2715    }
2716
2717    fn drop_without_shutdown(mut self) {
2718        // Safety: drops once, never accessed again due to mem::forget
2719        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
2720        // Prevent Drop from running (which would shut down the channel)
2721        std::mem::forget(self);
2722    }
2723}
2724
2725impl NeededBlobsAbortResponder {
2726    /// Sends a response to the FIDL transaction.
2727    ///
2728    /// Sets the channel to shutdown if an error occurs.
2729    pub fn send(self) -> Result<(), fidl::Error> {
2730        let _result = self.send_raw();
2731        if _result.is_err() {
2732            self.control_handle.shutdown();
2733        }
2734        self.drop_without_shutdown();
2735        _result
2736    }
2737
2738    /// Similar to "send" but does not shutdown the channel if an error occurs.
2739    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
2740        let _result = self.send_raw();
2741        self.drop_without_shutdown();
2742        _result
2743    }
2744
2745    fn send_raw(&self) -> Result<(), fidl::Error> {
2746        self.control_handle.inner.send::<fidl::encoding::EmptyPayload>(
2747            (),
2748            self.tx_id,
2749            0x6fda8d5ebea74cbb,
2750            fidl::encoding::DynamicFlags::empty(),
2751        )
2752    }
2753}
2754
2755#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
2756pub struct PackageCacheMarker;
2757
2758impl fdomain_client::fidl::ProtocolMarker for PackageCacheMarker {
2759    type Proxy = PackageCacheProxy;
2760    type RequestStream = PackageCacheRequestStream;
2761
2762    const DEBUG_NAME: &'static str = "fuchsia.pkg.PackageCache";
2763}
2764impl fdomain_client::fidl::DiscoverableProtocolMarker for PackageCacheMarker {}
2765pub type PackageCacheGetResult = Result<(), i32>;
2766pub type PackageCacheGetSubpackageResult = Result<(), GetSubpackageError>;
2767pub type PackageCacheSyncResult = Result<(), i32>;
2768pub type PackageCacheSetUpgradableUrlsResult = Result<(), SetUpgradableUrlsError>;
2769
2770pub trait PackageCacheProxyInterface: Send + Sync {
2771    type GetResponseFut: std::future::Future<Output = Result<PackageCacheGetResult, fidl::Error>>
2772        + Send;
2773    fn r#get(
2774        &self,
2775        meta_far_blob: &BlobInfo,
2776        gc_protection: GcProtection,
2777        needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
2778        dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
2779    ) -> Self::GetResponseFut;
2780    fn r#write_blobs(
2781        &self,
2782        needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
2783    ) -> Result<(), fidl::Error>;
2784    type GetSubpackageResponseFut: std::future::Future<Output = Result<PackageCacheGetSubpackageResult, fidl::Error>>
2785        + Send;
2786    fn r#get_subpackage(
2787        &self,
2788        superpackage: &BlobId,
2789        subpackage: &PackageUrl,
2790        dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
2791    ) -> Self::GetSubpackageResponseFut;
2792    fn r#base_package_index(
2793        &self,
2794        iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
2795    ) -> Result<(), fidl::Error>;
2796    fn r#cache_package_index(
2797        &self,
2798        iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
2799    ) -> Result<(), fidl::Error>;
2800    type SyncResponseFut: std::future::Future<Output = Result<PackageCacheSyncResult, fidl::Error>>
2801        + Send;
2802    fn r#sync(&self) -> Self::SyncResponseFut;
2803    type SetUpgradableUrlsResponseFut: std::future::Future<Output = Result<PackageCacheSetUpgradableUrlsResult, fidl::Error>>
2804        + Send;
2805    fn r#set_upgradable_urls(
2806        &self,
2807        pinned_urls: &[PackageUrl],
2808    ) -> Self::SetUpgradableUrlsResponseFut;
2809}
2810
2811#[derive(Debug, Clone)]
2812pub struct PackageCacheProxy {
2813    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
2814}
2815
2816impl fdomain_client::fidl::Proxy for PackageCacheProxy {
2817    type Protocol = PackageCacheMarker;
2818
2819    fn from_channel(inner: fdomain_client::Channel) -> Self {
2820        Self::new(inner)
2821    }
2822
2823    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
2824        self.client.into_channel().map_err(|client| Self { client })
2825    }
2826
2827    fn as_channel(&self) -> &fdomain_client::Channel {
2828        self.client.as_channel()
2829    }
2830}
2831
2832impl PackageCacheProxy {
2833    /// Create a new Proxy for fuchsia.pkg/PackageCache.
2834    pub fn new(channel: fdomain_client::Channel) -> Self {
2835        let protocol_name =
2836            <PackageCacheMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
2837        Self { client: fidl::client::Client::new(channel, protocol_name) }
2838    }
2839
2840    /// Get a Stream of events from the remote end of the protocol.
2841    ///
2842    /// # Panics
2843    ///
2844    /// Panics if the event stream was already taken.
2845    pub fn take_event_stream(&self) -> PackageCacheEventStream {
2846        PackageCacheEventStream { event_receiver: self.client.take_event_receiver() }
2847    }
2848
2849    /// Gets the package directory if it is present on the local system. If it is not, the
2850    /// `missing_blobs` iterator will provide all the blobs in the package that are missing from
2851    /// the system, and the ability to write those blobs to blobfs. If all the missing blobs are
2852    /// downloaded and written to by the client, the `dir` directory will be resolved. This method
2853    /// will return successfully when the package has been fully resolved, or return an error if
2854    /// the client closes `needed_blobs` or `dir` handle before the package has been resolved.
2855    ///
2856    /// This method does not guarantee the missing blobs have been persisted. In order to guarantee
2857    /// missing blobs are persisted, clients should call ['Sync'].
2858    ///
2859    /// Clients must not make concurrent `Get()` calls for the same `meta_far_blob`, even across
2860    /// different `PackageCache` connections, *unless* the `meta_far_blob` is in base or already
2861    /// active in the dynamic index. Violating this may result in `Get()` errors.
2862    ///
2863    /// + request `meta_far_blob` the blob info for the package's meta.far.
2864    /// + request `needed_blobs` an iterator over all the blobs in the package that
2865    ///   are not present on the system.
2866    /// + request `dir` the channel on which the package directory will be served.
2867    /// * error a zx_status value indicating failure. One of the following:
2868    ///     * `ZX_ERR_UNAVAILABLE` if the client closed `needed_blobs` handles before
2869    ///       all the missing blobs were downloaded to the system.
2870    pub fn r#get(
2871        &self,
2872        mut meta_far_blob: &BlobInfo,
2873        mut gc_protection: GcProtection,
2874        mut needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
2875        mut dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
2876    ) -> fidl::client::QueryResponseFut<
2877        PackageCacheGetResult,
2878        fdomain_client::fidl::FDomainResourceDialect,
2879    > {
2880        PackageCacheProxyInterface::r#get(self, meta_far_blob, gc_protection, needed_blobs, dir)
2881    }
2882
2883    /// Writes blobs to the system.
2884    ///
2885    /// This method is intended to be used by package resolver components to write individual blobs
2886    /// that are missing from the system.
2887    ///
2888    /// Clients must avoid write collisions of any blobs with `Get()` or another `WriteBlobs()`,
2889    /// even across different `PackageCache` connections.
2890    ///
2891    /// + request `needed_blobs` a protocol can be used to write multiple blobs. This `NeededBlobs`
2892    ///   only supports `OpenBlob` and `BlobWritten`.
2893    pub fn r#write_blobs(
2894        &self,
2895        mut needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
2896    ) -> Result<(), fidl::Error> {
2897        PackageCacheProxyInterface::r#write_blobs(self, needed_blobs)
2898    }
2899
2900    /// Gets the package directory for a subpackage.
2901    /// The connection to the superpackage's package directory must still be open when this is
2902    /// called.
2903    /// The returned package will be protected by open package tracking.
2904    ///
2905    /// + request `superpackage` the hash of the superpackage's meta.far.
2906    /// + request `subpackage` the relative package URL of the subpackage.
2907    /// + request `dir` the channel on which the package directory will be served.
2908    /// * error a GetSubpackageError value indicating failure.
2909    pub fn r#get_subpackage(
2910        &self,
2911        mut superpackage: &BlobId,
2912        mut subpackage: &PackageUrl,
2913        mut dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
2914    ) -> fidl::client::QueryResponseFut<
2915        PackageCacheGetSubpackageResult,
2916        fdomain_client::fidl::FDomainResourceDialect,
2917    > {
2918        PackageCacheProxyInterface::r#get_subpackage(self, superpackage, subpackage, dir)
2919    }
2920
2921    /// Retrieves a chunk iterator to the base package index.
2922    ///
2923    /// + request `iterator` a request for the `PackageIndexIterator` that will return sets of
2924    ///   `PackageIndexEntry` objects until all packages in the base index have been iterated.
2925    pub fn r#base_package_index(
2926        &self,
2927        mut iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
2928    ) -> Result<(), fidl::Error> {
2929        PackageCacheProxyInterface::r#base_package_index(self, iterator)
2930    }
2931
2932    /// Retrieves a chunk iterator to the cache package index.
2933    ///
2934    /// + request `iterator` a request for the `PackageIndexIterator` that will return sets of
2935    ///   `PackageIndexEntry` objects until all packages in the cache index have been iterated.
2936    pub fn r#cache_package_index(
2937        &self,
2938        mut iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
2939    ) -> Result<(), fidl::Error> {
2940        PackageCacheProxyInterface::r#cache_package_index(self, iterator)
2941    }
2942
2943    /// Synchronizes updates to the cached packages to the underlying persistent storage.
2944    ///
2945    /// * error a zx_status value indicating failure. One of the following:
2946    ///     * `ZX_ERR_INTERNAL` if the sync fails.
2947    pub fn r#sync(
2948        &self,
2949    ) -> fidl::client::QueryResponseFut<
2950        PackageCacheSyncResult,
2951        fdomain_client::fidl::FDomainResourceDialect,
2952    > {
2953        PackageCacheProxyInterface::r#sync(self)
2954    }
2955
2956    /// Sets which package URLs correspond to upgradable packages and the hash they should resolve
2957    /// to.
2958    ///
2959    /// If upgradable packages are enabled in pkg-cache, this method must be called once on start up
2960    /// to set the hashes for persisted upgradable packages. All such packages must not be base
2961    /// packages. If none of the upgradable packages are persisted, a call with an empty vector
2962    /// still needs to be made. Package resolution of non base packages and GC (and therefore OTA)
2963    /// will block until this is done.
2964    ///
2965    /// Subsequent calls can be made to set new upgradable packages or change the hashes associated
2966    /// with upgradable packages.
2967    ///
2968    /// The hash most recently associated with an upgradable package URL will be protected from GC.
2969    ///
2970    /// + request `pinned_urls` packages URLs pinned to the new hash.
2971    pub fn r#set_upgradable_urls(
2972        &self,
2973        mut pinned_urls: &[PackageUrl],
2974    ) -> fidl::client::QueryResponseFut<
2975        PackageCacheSetUpgradableUrlsResult,
2976        fdomain_client::fidl::FDomainResourceDialect,
2977    > {
2978        PackageCacheProxyInterface::r#set_upgradable_urls(self, pinned_urls)
2979    }
2980}
2981
2982impl PackageCacheProxyInterface for PackageCacheProxy {
2983    type GetResponseFut = fidl::client::QueryResponseFut<
2984        PackageCacheGetResult,
2985        fdomain_client::fidl::FDomainResourceDialect,
2986    >;
2987    fn r#get(
2988        &self,
2989        mut meta_far_blob: &BlobInfo,
2990        mut gc_protection: GcProtection,
2991        mut needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
2992        mut dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
2993    ) -> Self::GetResponseFut {
2994        fn _decode(
2995            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
2996        ) -> Result<PackageCacheGetResult, fidl::Error> {
2997            let _response = fidl::client::decode_transaction_body::<
2998                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>,
2999                fdomain_client::fidl::FDomainResourceDialect,
3000                0x15e1963f4bf123b5,
3001            >(_buf?)?;
3002            Ok(_response.map(|x| x))
3003        }
3004        self.client.send_query_and_decode::<PackageCacheGetRequest, PackageCacheGetResult>(
3005            (meta_far_blob, gc_protection, needed_blobs, dir),
3006            0x15e1963f4bf123b5,
3007            fidl::encoding::DynamicFlags::empty(),
3008            _decode,
3009        )
3010    }
3011
3012    fn r#write_blobs(
3013        &self,
3014        mut needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
3015    ) -> Result<(), fidl::Error> {
3016        self.client.send::<PackageCacheWriteBlobsRequest>(
3017            (needed_blobs,),
3018            0x5d0ed48035931dbe,
3019            fidl::encoding::DynamicFlags::empty(),
3020        )
3021    }
3022
3023    type GetSubpackageResponseFut = fidl::client::QueryResponseFut<
3024        PackageCacheGetSubpackageResult,
3025        fdomain_client::fidl::FDomainResourceDialect,
3026    >;
3027    fn r#get_subpackage(
3028        &self,
3029        mut superpackage: &BlobId,
3030        mut subpackage: &PackageUrl,
3031        mut dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
3032    ) -> Self::GetSubpackageResponseFut {
3033        fn _decode(
3034            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
3035        ) -> Result<PackageCacheGetSubpackageResult, fidl::Error> {
3036            let _response = fidl::client::decode_transaction_body::<
3037                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, GetSubpackageError>,
3038                fdomain_client::fidl::FDomainResourceDialect,
3039                0x29478df87c29ffa3,
3040            >(_buf?)?;
3041            Ok(_response.map(|x| x))
3042        }
3043        self.client.send_query_and_decode::<
3044            PackageCacheGetSubpackageRequest,
3045            PackageCacheGetSubpackageResult,
3046        >(
3047            (superpackage, subpackage, dir,),
3048            0x29478df87c29ffa3,
3049            fidl::encoding::DynamicFlags::empty(),
3050            _decode,
3051        )
3052    }
3053
3054    fn r#base_package_index(
3055        &self,
3056        mut iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
3057    ) -> Result<(), fidl::Error> {
3058        self.client.send::<PackageCacheBasePackageIndexRequest>(
3059            (iterator,),
3060            0x46af9e595f8eced4,
3061            fidl::encoding::DynamicFlags::empty(),
3062        )
3063    }
3064
3065    fn r#cache_package_index(
3066        &self,
3067        mut iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
3068    ) -> Result<(), fidl::Error> {
3069        self.client.send::<PackageCacheCachePackageIndexRequest>(
3070            (iterator,),
3071            0x14a48fdb8f26ed26,
3072            fidl::encoding::DynamicFlags::empty(),
3073        )
3074    }
3075
3076    type SyncResponseFut = fidl::client::QueryResponseFut<
3077        PackageCacheSyncResult,
3078        fdomain_client::fidl::FDomainResourceDialect,
3079    >;
3080    fn r#sync(&self) -> Self::SyncResponseFut {
3081        fn _decode(
3082            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
3083        ) -> Result<PackageCacheSyncResult, fidl::Error> {
3084            let _response = fidl::client::decode_transaction_body::<
3085                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>,
3086                fdomain_client::fidl::FDomainResourceDialect,
3087                0x5c10a84094535a74,
3088            >(_buf?)?;
3089            Ok(_response.map(|x| x))
3090        }
3091        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, PackageCacheSyncResult>(
3092            (),
3093            0x5c10a84094535a74,
3094            fidl::encoding::DynamicFlags::empty(),
3095            _decode,
3096        )
3097    }
3098
3099    type SetUpgradableUrlsResponseFut = fidl::client::QueryResponseFut<
3100        PackageCacheSetUpgradableUrlsResult,
3101        fdomain_client::fidl::FDomainResourceDialect,
3102    >;
3103    fn r#set_upgradable_urls(
3104        &self,
3105        mut pinned_urls: &[PackageUrl],
3106    ) -> Self::SetUpgradableUrlsResponseFut {
3107        fn _decode(
3108            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
3109        ) -> Result<PackageCacheSetUpgradableUrlsResult, fidl::Error> {
3110            let _response = fidl::client::decode_transaction_body::<
3111                fidl::encoding::FlexibleResultType<
3112                    fidl::encoding::EmptyStruct,
3113                    SetUpgradableUrlsError,
3114                >,
3115                fdomain_client::fidl::FDomainResourceDialect,
3116                0x2c235f7efdb5e2d1,
3117            >(_buf?)?
3118            .into_result_fdomain::<PackageCacheMarker>("set_upgradable_urls")?;
3119            Ok(_response.map(|x| x))
3120        }
3121        self.client.send_query_and_decode::<
3122            PackageCacheSetUpgradableUrlsRequest,
3123            PackageCacheSetUpgradableUrlsResult,
3124        >(
3125            (pinned_urls,),
3126            0x2c235f7efdb5e2d1,
3127            fidl::encoding::DynamicFlags::FLEXIBLE,
3128            _decode,
3129        )
3130    }
3131}
3132
3133pub struct PackageCacheEventStream {
3134    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
3135}
3136
3137impl std::marker::Unpin for PackageCacheEventStream {}
3138
3139impl futures::stream::FusedStream for PackageCacheEventStream {
3140    fn is_terminated(&self) -> bool {
3141        self.event_receiver.is_terminated()
3142    }
3143}
3144
3145impl futures::Stream for PackageCacheEventStream {
3146    type Item = Result<PackageCacheEvent, fidl::Error>;
3147
3148    fn poll_next(
3149        mut self: std::pin::Pin<&mut Self>,
3150        cx: &mut std::task::Context<'_>,
3151    ) -> std::task::Poll<Option<Self::Item>> {
3152        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
3153            &mut self.event_receiver,
3154            cx
3155        )?) {
3156            Some(buf) => std::task::Poll::Ready(Some(PackageCacheEvent::decode(buf))),
3157            None => std::task::Poll::Ready(None),
3158        }
3159    }
3160}
3161
3162#[derive(Debug)]
3163pub enum PackageCacheEvent {
3164    #[non_exhaustive]
3165    _UnknownEvent {
3166        /// Ordinal of the event that was sent.
3167        ordinal: u64,
3168    },
3169}
3170
3171impl PackageCacheEvent {
3172    /// Decodes a message buffer as a [`PackageCacheEvent`].
3173    fn decode(
3174        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
3175    ) -> Result<PackageCacheEvent, fidl::Error> {
3176        let (bytes, _handles) = buf.split_mut();
3177        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
3178        debug_assert_eq!(tx_header.tx_id, 0);
3179        match tx_header.ordinal {
3180            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
3181                Ok(PackageCacheEvent::_UnknownEvent { ordinal: tx_header.ordinal })
3182            }
3183            _ => Err(fidl::Error::UnknownOrdinal {
3184                ordinal: tx_header.ordinal,
3185                protocol_name:
3186                    <PackageCacheMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
3187            }),
3188        }
3189    }
3190}
3191
3192/// A Stream of incoming requests for fuchsia.pkg/PackageCache.
3193pub struct PackageCacheRequestStream {
3194    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
3195    is_terminated: bool,
3196}
3197
3198impl std::marker::Unpin for PackageCacheRequestStream {}
3199
3200impl futures::stream::FusedStream for PackageCacheRequestStream {
3201    fn is_terminated(&self) -> bool {
3202        self.is_terminated
3203    }
3204}
3205
3206impl fdomain_client::fidl::RequestStream for PackageCacheRequestStream {
3207    type Protocol = PackageCacheMarker;
3208    type ControlHandle = PackageCacheControlHandle;
3209
3210    fn from_channel(channel: fdomain_client::Channel) -> Self {
3211        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
3212    }
3213
3214    fn control_handle(&self) -> Self::ControlHandle {
3215        PackageCacheControlHandle { inner: self.inner.clone() }
3216    }
3217
3218    fn into_inner(
3219        self,
3220    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
3221    {
3222        (self.inner, self.is_terminated)
3223    }
3224
3225    fn from_inner(
3226        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
3227        is_terminated: bool,
3228    ) -> Self {
3229        Self { inner, is_terminated }
3230    }
3231}
3232
3233impl futures::Stream for PackageCacheRequestStream {
3234    type Item = Result<PackageCacheRequest, fidl::Error>;
3235
3236    fn poll_next(
3237        mut self: std::pin::Pin<&mut Self>,
3238        cx: &mut std::task::Context<'_>,
3239    ) -> std::task::Poll<Option<Self::Item>> {
3240        let this = &mut *self;
3241        if this.inner.check_shutdown(cx) {
3242            this.is_terminated = true;
3243            return std::task::Poll::Ready(None);
3244        }
3245        if this.is_terminated {
3246            panic!("polled PackageCacheRequestStream after completion");
3247        }
3248        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
3249            |bytes, handles| {
3250                match this.inner.channel().read_etc(cx, bytes, handles) {
3251                    std::task::Poll::Ready(Ok(())) => {}
3252                    std::task::Poll::Pending => return std::task::Poll::Pending,
3253                    std::task::Poll::Ready(Err(None)) => {
3254                        this.is_terminated = true;
3255                        return std::task::Poll::Ready(None);
3256                    }
3257                    std::task::Poll::Ready(Err(Some(e))) => {
3258                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
3259                            e.into(),
3260                        ))));
3261                    }
3262                }
3263
3264                // A message has been received from the channel
3265                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
3266
3267                std::task::Poll::Ready(Some(match header.ordinal {
3268                    0x15e1963f4bf123b5 => {
3269                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
3270                        let mut req = fidl::new_empty!(
3271                            PackageCacheGetRequest,
3272                            fdomain_client::fidl::FDomainResourceDialect
3273                        );
3274                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageCacheGetRequest>(&header, _body_bytes, handles, &mut req)?;
3275                        let control_handle =
3276                            PackageCacheControlHandle { inner: this.inner.clone() };
3277                        Ok(PackageCacheRequest::Get {
3278                            meta_far_blob: req.meta_far_blob,
3279                            gc_protection: req.gc_protection,
3280                            needed_blobs: req.needed_blobs,
3281                            dir: req.dir,
3282
3283                            responder: PackageCacheGetResponder {
3284                                control_handle: std::mem::ManuallyDrop::new(control_handle),
3285                                tx_id: header.tx_id,
3286                            },
3287                        })
3288                    }
3289                    0x5d0ed48035931dbe => {
3290                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
3291                        let mut req = fidl::new_empty!(
3292                            PackageCacheWriteBlobsRequest,
3293                            fdomain_client::fidl::FDomainResourceDialect
3294                        );
3295                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageCacheWriteBlobsRequest>(&header, _body_bytes, handles, &mut req)?;
3296                        let control_handle =
3297                            PackageCacheControlHandle { inner: this.inner.clone() };
3298                        Ok(PackageCacheRequest::WriteBlobs {
3299                            needed_blobs: req.needed_blobs,
3300
3301                            control_handle,
3302                        })
3303                    }
3304                    0x29478df87c29ffa3 => {
3305                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
3306                        let mut req = fidl::new_empty!(
3307                            PackageCacheGetSubpackageRequest,
3308                            fdomain_client::fidl::FDomainResourceDialect
3309                        );
3310                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageCacheGetSubpackageRequest>(&header, _body_bytes, handles, &mut req)?;
3311                        let control_handle =
3312                            PackageCacheControlHandle { inner: this.inner.clone() };
3313                        Ok(PackageCacheRequest::GetSubpackage {
3314                            superpackage: req.superpackage,
3315                            subpackage: req.subpackage,
3316                            dir: req.dir,
3317
3318                            responder: PackageCacheGetSubpackageResponder {
3319                                control_handle: std::mem::ManuallyDrop::new(control_handle),
3320                                tx_id: header.tx_id,
3321                            },
3322                        })
3323                    }
3324                    0x46af9e595f8eced4 => {
3325                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
3326                        let mut req = fidl::new_empty!(
3327                            PackageCacheBasePackageIndexRequest,
3328                            fdomain_client::fidl::FDomainResourceDialect
3329                        );
3330                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageCacheBasePackageIndexRequest>(&header, _body_bytes, handles, &mut req)?;
3331                        let control_handle =
3332                            PackageCacheControlHandle { inner: this.inner.clone() };
3333                        Ok(PackageCacheRequest::BasePackageIndex {
3334                            iterator: req.iterator,
3335
3336                            control_handle,
3337                        })
3338                    }
3339                    0x14a48fdb8f26ed26 => {
3340                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
3341                        let mut req = fidl::new_empty!(
3342                            PackageCacheCachePackageIndexRequest,
3343                            fdomain_client::fidl::FDomainResourceDialect
3344                        );
3345                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageCacheCachePackageIndexRequest>(&header, _body_bytes, handles, &mut req)?;
3346                        let control_handle =
3347                            PackageCacheControlHandle { inner: this.inner.clone() };
3348                        Ok(PackageCacheRequest::CachePackageIndex {
3349                            iterator: req.iterator,
3350
3351                            control_handle,
3352                        })
3353                    }
3354                    0x5c10a84094535a74 => {
3355                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
3356                        let mut req = fidl::new_empty!(
3357                            fidl::encoding::EmptyPayload,
3358                            fdomain_client::fidl::FDomainResourceDialect
3359                        );
3360                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
3361                        let control_handle =
3362                            PackageCacheControlHandle { inner: this.inner.clone() };
3363                        Ok(PackageCacheRequest::Sync {
3364                            responder: PackageCacheSyncResponder {
3365                                control_handle: std::mem::ManuallyDrop::new(control_handle),
3366                                tx_id: header.tx_id,
3367                            },
3368                        })
3369                    }
3370                    0x2c235f7efdb5e2d1 => {
3371                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
3372                        let mut req = fidl::new_empty!(
3373                            PackageCacheSetUpgradableUrlsRequest,
3374                            fdomain_client::fidl::FDomainResourceDialect
3375                        );
3376                        fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageCacheSetUpgradableUrlsRequest>(&header, _body_bytes, handles, &mut req)?;
3377                        let control_handle =
3378                            PackageCacheControlHandle { inner: this.inner.clone() };
3379                        Ok(PackageCacheRequest::SetUpgradableUrls {
3380                            pinned_urls: req.pinned_urls,
3381
3382                            responder: PackageCacheSetUpgradableUrlsResponder {
3383                                control_handle: std::mem::ManuallyDrop::new(control_handle),
3384                                tx_id: header.tx_id,
3385                            },
3386                        })
3387                    }
3388                    _ if header.tx_id == 0
3389                        && header
3390                            .dynamic_flags()
3391                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
3392                    {
3393                        Ok(PackageCacheRequest::_UnknownMethod {
3394                            ordinal: header.ordinal,
3395                            control_handle: PackageCacheControlHandle { inner: this.inner.clone() },
3396                            method_type: fidl::MethodType::OneWay,
3397                        })
3398                    }
3399                    _ if header
3400                        .dynamic_flags()
3401                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
3402                    {
3403                        this.inner.send_framework_err(
3404                            fidl::encoding::FrameworkErr::UnknownMethod,
3405                            header.tx_id,
3406                            header.ordinal,
3407                            header.dynamic_flags(),
3408                            (bytes, handles),
3409                        )?;
3410                        Ok(PackageCacheRequest::_UnknownMethod {
3411                            ordinal: header.ordinal,
3412                            control_handle: PackageCacheControlHandle { inner: this.inner.clone() },
3413                            method_type: fidl::MethodType::TwoWay,
3414                        })
3415                    }
3416                    _ => Err(fidl::Error::UnknownOrdinal {
3417                        ordinal: header.ordinal,
3418                        protocol_name:
3419                            <PackageCacheMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
3420                    }),
3421                }))
3422            },
3423        )
3424    }
3425}
3426
3427/// This manages the system package cache.
3428///
3429/// This is intended to be implemented by the package manager component and used by
3430/// package resolver components.
3431#[derive(Debug)]
3432pub enum PackageCacheRequest {
3433    /// Gets the package directory if it is present on the local system. If it is not, the
3434    /// `missing_blobs` iterator will provide all the blobs in the package that are missing from
3435    /// the system, and the ability to write those blobs to blobfs. If all the missing blobs are
3436    /// downloaded and written to by the client, the `dir` directory will be resolved. This method
3437    /// will return successfully when the package has been fully resolved, or return an error if
3438    /// the client closes `needed_blobs` or `dir` handle before the package has been resolved.
3439    ///
3440    /// This method does not guarantee the missing blobs have been persisted. In order to guarantee
3441    /// missing blobs are persisted, clients should call ['Sync'].
3442    ///
3443    /// Clients must not make concurrent `Get()` calls for the same `meta_far_blob`, even across
3444    /// different `PackageCache` connections, *unless* the `meta_far_blob` is in base or already
3445    /// active in the dynamic index. Violating this may result in `Get()` errors.
3446    ///
3447    /// + request `meta_far_blob` the blob info for the package's meta.far.
3448    /// + request `needed_blobs` an iterator over all the blobs in the package that
3449    ///   are not present on the system.
3450    /// + request `dir` the channel on which the package directory will be served.
3451    /// * error a zx_status value indicating failure. One of the following:
3452    ///     * `ZX_ERR_UNAVAILABLE` if the client closed `needed_blobs` handles before
3453    ///       all the missing blobs were downloaded to the system.
3454    Get {
3455        meta_far_blob: BlobInfo,
3456        gc_protection: GcProtection,
3457        needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
3458        dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
3459        responder: PackageCacheGetResponder,
3460    },
3461    /// Writes blobs to the system.
3462    ///
3463    /// This method is intended to be used by package resolver components to write individual blobs
3464    /// that are missing from the system.
3465    ///
3466    /// Clients must avoid write collisions of any blobs with `Get()` or another `WriteBlobs()`,
3467    /// even across different `PackageCache` connections.
3468    ///
3469    /// + request `needed_blobs` a protocol can be used to write multiple blobs. This `NeededBlobs`
3470    ///   only supports `OpenBlob` and `BlobWritten`.
3471    WriteBlobs {
3472        needed_blobs: fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
3473        control_handle: PackageCacheControlHandle,
3474    },
3475    /// Gets the package directory for a subpackage.
3476    /// The connection to the superpackage's package directory must still be open when this is
3477    /// called.
3478    /// The returned package will be protected by open package tracking.
3479    ///
3480    /// + request `superpackage` the hash of the superpackage's meta.far.
3481    /// + request `subpackage` the relative package URL of the subpackage.
3482    /// + request `dir` the channel on which the package directory will be served.
3483    /// * error a GetSubpackageError value indicating failure.
3484    GetSubpackage {
3485        superpackage: BlobId,
3486        subpackage: PackageUrl,
3487        dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
3488        responder: PackageCacheGetSubpackageResponder,
3489    },
3490    /// Retrieves a chunk iterator to the base package index.
3491    ///
3492    /// + request `iterator` a request for the `PackageIndexIterator` that will return sets of
3493    ///   `PackageIndexEntry` objects until all packages in the base index have been iterated.
3494    BasePackageIndex {
3495        iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
3496        control_handle: PackageCacheControlHandle,
3497    },
3498    /// Retrieves a chunk iterator to the cache package index.
3499    ///
3500    /// + request `iterator` a request for the `PackageIndexIterator` that will return sets of
3501    ///   `PackageIndexEntry` objects until all packages in the cache index have been iterated.
3502    CachePackageIndex {
3503        iterator: fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
3504        control_handle: PackageCacheControlHandle,
3505    },
3506    /// Synchronizes updates to the cached packages to the underlying persistent storage.
3507    ///
3508    /// * error a zx_status value indicating failure. One of the following:
3509    ///     * `ZX_ERR_INTERNAL` if the sync fails.
3510    Sync { responder: PackageCacheSyncResponder },
3511    /// Sets which package URLs correspond to upgradable packages and the hash they should resolve
3512    /// to.
3513    ///
3514    /// If upgradable packages are enabled in pkg-cache, this method must be called once on start up
3515    /// to set the hashes for persisted upgradable packages. All such packages must not be base
3516    /// packages. If none of the upgradable packages are persisted, a call with an empty vector
3517    /// still needs to be made. Package resolution of non base packages and GC (and therefore OTA)
3518    /// will block until this is done.
3519    ///
3520    /// Subsequent calls can be made to set new upgradable packages or change the hashes associated
3521    /// with upgradable packages.
3522    ///
3523    /// The hash most recently associated with an upgradable package URL will be protected from GC.
3524    ///
3525    /// + request `pinned_urls` packages URLs pinned to the new hash.
3526    SetUpgradableUrls {
3527        pinned_urls: Vec<PackageUrl>,
3528        responder: PackageCacheSetUpgradableUrlsResponder,
3529    },
3530    /// An interaction was received which does not match any known method.
3531    #[non_exhaustive]
3532    _UnknownMethod {
3533        /// Ordinal of the method that was called.
3534        ordinal: u64,
3535        control_handle: PackageCacheControlHandle,
3536        method_type: fidl::MethodType,
3537    },
3538}
3539
3540impl PackageCacheRequest {
3541    #[allow(irrefutable_let_patterns)]
3542    pub fn into_get(
3543        self,
3544    ) -> Option<(
3545        BlobInfo,
3546        GcProtection,
3547        fdomain_client::fidl::ServerEnd<NeededBlobsMarker>,
3548        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
3549        PackageCacheGetResponder,
3550    )> {
3551        if let PackageCacheRequest::Get {
3552            meta_far_blob,
3553            gc_protection,
3554            needed_blobs,
3555            dir,
3556            responder,
3557        } = self
3558        {
3559            Some((meta_far_blob, gc_protection, needed_blobs, dir, responder))
3560        } else {
3561            None
3562        }
3563    }
3564
3565    #[allow(irrefutable_let_patterns)]
3566    pub fn into_write_blobs(
3567        self,
3568    ) -> Option<(fdomain_client::fidl::ServerEnd<NeededBlobsMarker>, PackageCacheControlHandle)>
3569    {
3570        if let PackageCacheRequest::WriteBlobs { needed_blobs, control_handle } = self {
3571            Some((needed_blobs, control_handle))
3572        } else {
3573            None
3574        }
3575    }
3576
3577    #[allow(irrefutable_let_patterns)]
3578    pub fn into_get_subpackage(
3579        self,
3580    ) -> Option<(
3581        BlobId,
3582        PackageUrl,
3583        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
3584        PackageCacheGetSubpackageResponder,
3585    )> {
3586        if let PackageCacheRequest::GetSubpackage { superpackage, subpackage, dir, responder } =
3587            self
3588        {
3589            Some((superpackage, subpackage, dir, responder))
3590        } else {
3591            None
3592        }
3593    }
3594
3595    #[allow(irrefutable_let_patterns)]
3596    pub fn into_base_package_index(
3597        self,
3598    ) -> Option<(
3599        fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
3600        PackageCacheControlHandle,
3601    )> {
3602        if let PackageCacheRequest::BasePackageIndex { iterator, control_handle } = self {
3603            Some((iterator, control_handle))
3604        } else {
3605            None
3606        }
3607    }
3608
3609    #[allow(irrefutable_let_patterns)]
3610    pub fn into_cache_package_index(
3611        self,
3612    ) -> Option<(
3613        fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
3614        PackageCacheControlHandle,
3615    )> {
3616        if let PackageCacheRequest::CachePackageIndex { iterator, control_handle } = self {
3617            Some((iterator, control_handle))
3618        } else {
3619            None
3620        }
3621    }
3622
3623    #[allow(irrefutable_let_patterns)]
3624    pub fn into_sync(self) -> Option<(PackageCacheSyncResponder)> {
3625        if let PackageCacheRequest::Sync { responder } = self { Some((responder)) } else { None }
3626    }
3627
3628    #[allow(irrefutable_let_patterns)]
3629    pub fn into_set_upgradable_urls(
3630        self,
3631    ) -> Option<(Vec<PackageUrl>, PackageCacheSetUpgradableUrlsResponder)> {
3632        if let PackageCacheRequest::SetUpgradableUrls { pinned_urls, responder } = self {
3633            Some((pinned_urls, responder))
3634        } else {
3635            None
3636        }
3637    }
3638
3639    /// Name of the method defined in FIDL
3640    pub fn method_name(&self) -> &'static str {
3641        match *self {
3642            PackageCacheRequest::Get { .. } => "get",
3643            PackageCacheRequest::WriteBlobs { .. } => "write_blobs",
3644            PackageCacheRequest::GetSubpackage { .. } => "get_subpackage",
3645            PackageCacheRequest::BasePackageIndex { .. } => "base_package_index",
3646            PackageCacheRequest::CachePackageIndex { .. } => "cache_package_index",
3647            PackageCacheRequest::Sync { .. } => "sync",
3648            PackageCacheRequest::SetUpgradableUrls { .. } => "set_upgradable_urls",
3649            PackageCacheRequest::_UnknownMethod {
3650                method_type: fidl::MethodType::OneWay, ..
3651            } => "unknown one-way method",
3652            PackageCacheRequest::_UnknownMethod {
3653                method_type: fidl::MethodType::TwoWay, ..
3654            } => "unknown two-way method",
3655        }
3656    }
3657}
3658
3659#[derive(Debug, Clone)]
3660pub struct PackageCacheControlHandle {
3661    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
3662}
3663
3664impl fdomain_client::fidl::ControlHandle for PackageCacheControlHandle {
3665    fn shutdown(&self) {
3666        self.inner.shutdown()
3667    }
3668
3669    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
3670        self.inner.shutdown_with_epitaph(status)
3671    }
3672
3673    fn is_closed(&self) -> bool {
3674        self.inner.channel().is_closed()
3675    }
3676    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
3677        self.inner.channel().on_closed()
3678    }
3679}
3680
3681impl PackageCacheControlHandle {}
3682
3683#[must_use = "FIDL methods require a response to be sent"]
3684#[derive(Debug)]
3685pub struct PackageCacheGetResponder {
3686    control_handle: std::mem::ManuallyDrop<PackageCacheControlHandle>,
3687    tx_id: u32,
3688}
3689
3690/// Set the the channel to be shutdown (see [`PackageCacheControlHandle::shutdown`])
3691/// if the responder is dropped without sending a response, so that the client
3692/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
3693impl std::ops::Drop for PackageCacheGetResponder {
3694    fn drop(&mut self) {
3695        self.control_handle.shutdown();
3696        // Safety: drops once, never accessed again
3697        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3698    }
3699}
3700
3701impl fdomain_client::fidl::Responder for PackageCacheGetResponder {
3702    type ControlHandle = PackageCacheControlHandle;
3703
3704    fn control_handle(&self) -> &PackageCacheControlHandle {
3705        &self.control_handle
3706    }
3707
3708    fn drop_without_shutdown(mut self) {
3709        // Safety: drops once, never accessed again due to mem::forget
3710        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3711        // Prevent Drop from running (which would shut down the channel)
3712        std::mem::forget(self);
3713    }
3714}
3715
3716impl PackageCacheGetResponder {
3717    /// Sends a response to the FIDL transaction.
3718    ///
3719    /// Sets the channel to shutdown if an error occurs.
3720    pub fn send(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
3721        let _result = self.send_raw(result);
3722        if _result.is_err() {
3723            self.control_handle.shutdown();
3724        }
3725        self.drop_without_shutdown();
3726        _result
3727    }
3728
3729    /// Similar to "send" but does not shutdown the channel if an error occurs.
3730    pub fn send_no_shutdown_on_err(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
3731        let _result = self.send_raw(result);
3732        self.drop_without_shutdown();
3733        _result
3734    }
3735
3736    fn send_raw(&self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
3737        self.control_handle
3738            .inner
3739            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>>(
3740                result,
3741                self.tx_id,
3742                0x15e1963f4bf123b5,
3743                fidl::encoding::DynamicFlags::empty(),
3744            )
3745    }
3746}
3747
3748#[must_use = "FIDL methods require a response to be sent"]
3749#[derive(Debug)]
3750pub struct PackageCacheGetSubpackageResponder {
3751    control_handle: std::mem::ManuallyDrop<PackageCacheControlHandle>,
3752    tx_id: u32,
3753}
3754
3755/// Set the the channel to be shutdown (see [`PackageCacheControlHandle::shutdown`])
3756/// if the responder is dropped without sending a response, so that the client
3757/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
3758impl std::ops::Drop for PackageCacheGetSubpackageResponder {
3759    fn drop(&mut self) {
3760        self.control_handle.shutdown();
3761        // Safety: drops once, never accessed again
3762        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3763    }
3764}
3765
3766impl fdomain_client::fidl::Responder for PackageCacheGetSubpackageResponder {
3767    type ControlHandle = PackageCacheControlHandle;
3768
3769    fn control_handle(&self) -> &PackageCacheControlHandle {
3770        &self.control_handle
3771    }
3772
3773    fn drop_without_shutdown(mut self) {
3774        // Safety: drops once, never accessed again due to mem::forget
3775        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3776        // Prevent Drop from running (which would shut down the channel)
3777        std::mem::forget(self);
3778    }
3779}
3780
3781impl PackageCacheGetSubpackageResponder {
3782    /// Sends a response to the FIDL transaction.
3783    ///
3784    /// Sets the channel to shutdown if an error occurs.
3785    pub fn send(self, mut result: Result<(), GetSubpackageError>) -> Result<(), fidl::Error> {
3786        let _result = self.send_raw(result);
3787        if _result.is_err() {
3788            self.control_handle.shutdown();
3789        }
3790        self.drop_without_shutdown();
3791        _result
3792    }
3793
3794    /// Similar to "send" but does not shutdown the channel if an error occurs.
3795    pub fn send_no_shutdown_on_err(
3796        self,
3797        mut result: Result<(), GetSubpackageError>,
3798    ) -> Result<(), fidl::Error> {
3799        let _result = self.send_raw(result);
3800        self.drop_without_shutdown();
3801        _result
3802    }
3803
3804    fn send_raw(&self, mut result: Result<(), GetSubpackageError>) -> Result<(), fidl::Error> {
3805        self.control_handle.inner.send::<fidl::encoding::ResultType<
3806            fidl::encoding::EmptyStruct,
3807            GetSubpackageError,
3808        >>(
3809            result,
3810            self.tx_id,
3811            0x29478df87c29ffa3,
3812            fidl::encoding::DynamicFlags::empty(),
3813        )
3814    }
3815}
3816
3817#[must_use = "FIDL methods require a response to be sent"]
3818#[derive(Debug)]
3819pub struct PackageCacheSyncResponder {
3820    control_handle: std::mem::ManuallyDrop<PackageCacheControlHandle>,
3821    tx_id: u32,
3822}
3823
3824/// Set the the channel to be shutdown (see [`PackageCacheControlHandle::shutdown`])
3825/// if the responder is dropped without sending a response, so that the client
3826/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
3827impl std::ops::Drop for PackageCacheSyncResponder {
3828    fn drop(&mut self) {
3829        self.control_handle.shutdown();
3830        // Safety: drops once, never accessed again
3831        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3832    }
3833}
3834
3835impl fdomain_client::fidl::Responder for PackageCacheSyncResponder {
3836    type ControlHandle = PackageCacheControlHandle;
3837
3838    fn control_handle(&self) -> &PackageCacheControlHandle {
3839        &self.control_handle
3840    }
3841
3842    fn drop_without_shutdown(mut self) {
3843        // Safety: drops once, never accessed again due to mem::forget
3844        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3845        // Prevent Drop from running (which would shut down the channel)
3846        std::mem::forget(self);
3847    }
3848}
3849
3850impl PackageCacheSyncResponder {
3851    /// Sends a response to the FIDL transaction.
3852    ///
3853    /// Sets the channel to shutdown if an error occurs.
3854    pub fn send(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
3855        let _result = self.send_raw(result);
3856        if _result.is_err() {
3857            self.control_handle.shutdown();
3858        }
3859        self.drop_without_shutdown();
3860        _result
3861    }
3862
3863    /// Similar to "send" but does not shutdown the channel if an error occurs.
3864    pub fn send_no_shutdown_on_err(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
3865        let _result = self.send_raw(result);
3866        self.drop_without_shutdown();
3867        _result
3868    }
3869
3870    fn send_raw(&self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
3871        self.control_handle
3872            .inner
3873            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>>(
3874                result,
3875                self.tx_id,
3876                0x5c10a84094535a74,
3877                fidl::encoding::DynamicFlags::empty(),
3878            )
3879    }
3880}
3881
3882#[must_use = "FIDL methods require a response to be sent"]
3883#[derive(Debug)]
3884pub struct PackageCacheSetUpgradableUrlsResponder {
3885    control_handle: std::mem::ManuallyDrop<PackageCacheControlHandle>,
3886    tx_id: u32,
3887}
3888
3889/// Set the the channel to be shutdown (see [`PackageCacheControlHandle::shutdown`])
3890/// if the responder is dropped without sending a response, so that the client
3891/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
3892impl std::ops::Drop for PackageCacheSetUpgradableUrlsResponder {
3893    fn drop(&mut self) {
3894        self.control_handle.shutdown();
3895        // Safety: drops once, never accessed again
3896        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3897    }
3898}
3899
3900impl fdomain_client::fidl::Responder for PackageCacheSetUpgradableUrlsResponder {
3901    type ControlHandle = PackageCacheControlHandle;
3902
3903    fn control_handle(&self) -> &PackageCacheControlHandle {
3904        &self.control_handle
3905    }
3906
3907    fn drop_without_shutdown(mut self) {
3908        // Safety: drops once, never accessed again due to mem::forget
3909        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
3910        // Prevent Drop from running (which would shut down the channel)
3911        std::mem::forget(self);
3912    }
3913}
3914
3915impl PackageCacheSetUpgradableUrlsResponder {
3916    /// Sends a response to the FIDL transaction.
3917    ///
3918    /// Sets the channel to shutdown if an error occurs.
3919    pub fn send(self, mut result: Result<(), SetUpgradableUrlsError>) -> Result<(), fidl::Error> {
3920        let _result = self.send_raw(result);
3921        if _result.is_err() {
3922            self.control_handle.shutdown();
3923        }
3924        self.drop_without_shutdown();
3925        _result
3926    }
3927
3928    /// Similar to "send" but does not shutdown the channel if an error occurs.
3929    pub fn send_no_shutdown_on_err(
3930        self,
3931        mut result: Result<(), SetUpgradableUrlsError>,
3932    ) -> Result<(), fidl::Error> {
3933        let _result = self.send_raw(result);
3934        self.drop_without_shutdown();
3935        _result
3936    }
3937
3938    fn send_raw(&self, mut result: Result<(), SetUpgradableUrlsError>) -> Result<(), fidl::Error> {
3939        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
3940            fidl::encoding::EmptyStruct,
3941            SetUpgradableUrlsError,
3942        >>(
3943            fidl::encoding::FlexibleResult::new(result),
3944            self.tx_id,
3945            0x2c235f7efdb5e2d1,
3946            fidl::encoding::DynamicFlags::FLEXIBLE,
3947        )
3948    }
3949}
3950
3951#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
3952pub struct PackageIndexIteratorMarker;
3953
3954impl fdomain_client::fidl::ProtocolMarker for PackageIndexIteratorMarker {
3955    type Proxy = PackageIndexIteratorProxy;
3956    type RequestStream = PackageIndexIteratorRequestStream;
3957
3958    const DEBUG_NAME: &'static str = "(anonymous) PackageIndexIterator";
3959}
3960
3961pub trait PackageIndexIteratorProxyInterface: Send + Sync {
3962    type NextResponseFut: std::future::Future<Output = Result<Vec<PackageIndexEntry>, fidl::Error>>
3963        + Send;
3964    fn r#next(&self) -> Self::NextResponseFut;
3965}
3966
3967#[derive(Debug, Clone)]
3968pub struct PackageIndexIteratorProxy {
3969    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
3970}
3971
3972impl fdomain_client::fidl::Proxy for PackageIndexIteratorProxy {
3973    type Protocol = PackageIndexIteratorMarker;
3974
3975    fn from_channel(inner: fdomain_client::Channel) -> Self {
3976        Self::new(inner)
3977    }
3978
3979    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
3980        self.client.into_channel().map_err(|client| Self { client })
3981    }
3982
3983    fn as_channel(&self) -> &fdomain_client::Channel {
3984        self.client.as_channel()
3985    }
3986}
3987
3988impl PackageIndexIteratorProxy {
3989    /// Create a new Proxy for fuchsia.pkg/PackageIndexIterator.
3990    pub fn new(channel: fdomain_client::Channel) -> Self {
3991        let protocol_name =
3992            <PackageIndexIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
3993        Self { client: fidl::client::Client::new(channel, protocol_name) }
3994    }
3995
3996    /// Get a Stream of events from the remote end of the protocol.
3997    ///
3998    /// # Panics
3999    ///
4000    /// Panics if the event stream was already taken.
4001    pub fn take_event_stream(&self) -> PackageIndexIteratorEventStream {
4002        PackageIndexIteratorEventStream { event_receiver: self.client.take_event_receiver() }
4003    }
4004
4005    /// Returns the next chunk of package index entries. When the iterator is exhausted,
4006    /// this returns an empty vector.
4007    ///
4008    /// - response `entries` the next chunk of entries in the package index.
4009    pub fn r#next(
4010        &self,
4011    ) -> fidl::client::QueryResponseFut<
4012        Vec<PackageIndexEntry>,
4013        fdomain_client::fidl::FDomainResourceDialect,
4014    > {
4015        PackageIndexIteratorProxyInterface::r#next(self)
4016    }
4017}
4018
4019impl PackageIndexIteratorProxyInterface for PackageIndexIteratorProxy {
4020    type NextResponseFut = fidl::client::QueryResponseFut<
4021        Vec<PackageIndexEntry>,
4022        fdomain_client::fidl::FDomainResourceDialect,
4023    >;
4024    fn r#next(&self) -> Self::NextResponseFut {
4025        fn _decode(
4026            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
4027        ) -> Result<Vec<PackageIndexEntry>, fidl::Error> {
4028            let _response = fidl::client::decode_transaction_body::<
4029                PackageIndexIteratorNextResponse,
4030                fdomain_client::fidl::FDomainResourceDialect,
4031                0x9de6bbc87c314d9,
4032            >(_buf?)?;
4033            Ok(_response.entries)
4034        }
4035        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, Vec<PackageIndexEntry>>(
4036            (),
4037            0x9de6bbc87c314d9,
4038            fidl::encoding::DynamicFlags::empty(),
4039            _decode,
4040        )
4041    }
4042}
4043
4044pub struct PackageIndexIteratorEventStream {
4045    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
4046}
4047
4048impl std::marker::Unpin for PackageIndexIteratorEventStream {}
4049
4050impl futures::stream::FusedStream for PackageIndexIteratorEventStream {
4051    fn is_terminated(&self) -> bool {
4052        self.event_receiver.is_terminated()
4053    }
4054}
4055
4056impl futures::Stream for PackageIndexIteratorEventStream {
4057    type Item = Result<PackageIndexIteratorEvent, fidl::Error>;
4058
4059    fn poll_next(
4060        mut self: std::pin::Pin<&mut Self>,
4061        cx: &mut std::task::Context<'_>,
4062    ) -> std::task::Poll<Option<Self::Item>> {
4063        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
4064            &mut self.event_receiver,
4065            cx
4066        )?) {
4067            Some(buf) => std::task::Poll::Ready(Some(PackageIndexIteratorEvent::decode(buf))),
4068            None => std::task::Poll::Ready(None),
4069        }
4070    }
4071}
4072
4073#[derive(Debug)]
4074pub enum PackageIndexIteratorEvent {}
4075
4076impl PackageIndexIteratorEvent {
4077    /// Decodes a message buffer as a [`PackageIndexIteratorEvent`].
4078    fn decode(
4079        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
4080    ) -> Result<PackageIndexIteratorEvent, fidl::Error> {
4081        let (bytes, _handles) = buf.split_mut();
4082        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
4083        debug_assert_eq!(tx_header.tx_id, 0);
4084        match tx_header.ordinal {
4085            _ => Err(fidl::Error::UnknownOrdinal {
4086                ordinal: tx_header.ordinal,
4087                protocol_name:
4088                    <PackageIndexIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
4089            }),
4090        }
4091    }
4092}
4093
4094/// A Stream of incoming requests for fuchsia.pkg/PackageIndexIterator.
4095pub struct PackageIndexIteratorRequestStream {
4096    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
4097    is_terminated: bool,
4098}
4099
4100impl std::marker::Unpin for PackageIndexIteratorRequestStream {}
4101
4102impl futures::stream::FusedStream for PackageIndexIteratorRequestStream {
4103    fn is_terminated(&self) -> bool {
4104        self.is_terminated
4105    }
4106}
4107
4108impl fdomain_client::fidl::RequestStream for PackageIndexIteratorRequestStream {
4109    type Protocol = PackageIndexIteratorMarker;
4110    type ControlHandle = PackageIndexIteratorControlHandle;
4111
4112    fn from_channel(channel: fdomain_client::Channel) -> Self {
4113        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
4114    }
4115
4116    fn control_handle(&self) -> Self::ControlHandle {
4117        PackageIndexIteratorControlHandle { inner: self.inner.clone() }
4118    }
4119
4120    fn into_inner(
4121        self,
4122    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
4123    {
4124        (self.inner, self.is_terminated)
4125    }
4126
4127    fn from_inner(
4128        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
4129        is_terminated: bool,
4130    ) -> Self {
4131        Self { inner, is_terminated }
4132    }
4133}
4134
4135impl futures::Stream for PackageIndexIteratorRequestStream {
4136    type Item = Result<PackageIndexIteratorRequest, fidl::Error>;
4137
4138    fn poll_next(
4139        mut self: std::pin::Pin<&mut Self>,
4140        cx: &mut std::task::Context<'_>,
4141    ) -> std::task::Poll<Option<Self::Item>> {
4142        let this = &mut *self;
4143        if this.inner.check_shutdown(cx) {
4144            this.is_terminated = true;
4145            return std::task::Poll::Ready(None);
4146        }
4147        if this.is_terminated {
4148            panic!("polled PackageIndexIteratorRequestStream after completion");
4149        }
4150        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
4151            |bytes, handles| {
4152                match this.inner.channel().read_etc(cx, bytes, handles) {
4153                    std::task::Poll::Ready(Ok(())) => {}
4154                    std::task::Poll::Pending => return std::task::Poll::Pending,
4155                    std::task::Poll::Ready(Err(None)) => {
4156                        this.is_terminated = true;
4157                        return std::task::Poll::Ready(None);
4158                    }
4159                    std::task::Poll::Ready(Err(Some(e))) => {
4160                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
4161                            e.into(),
4162                        ))));
4163                    }
4164                }
4165
4166                // A message has been received from the channel
4167                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
4168
4169                std::task::Poll::Ready(Some(match header.ordinal {
4170                0x9de6bbc87c314d9 => {
4171                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
4172                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fdomain_client::fidl::FDomainResourceDialect);
4173                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
4174                    let control_handle = PackageIndexIteratorControlHandle {
4175                        inner: this.inner.clone(),
4176                    };
4177                    Ok(PackageIndexIteratorRequest::Next {
4178                        responder: PackageIndexIteratorNextResponder {
4179                            control_handle: std::mem::ManuallyDrop::new(control_handle),
4180                            tx_id: header.tx_id,
4181                        },
4182                    })
4183                }
4184                _ => Err(fidl::Error::UnknownOrdinal {
4185                    ordinal: header.ordinal,
4186                    protocol_name: <PackageIndexIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
4187                }),
4188            }))
4189            },
4190        )
4191    }
4192}
4193
4194/// A chunk iterator for the package index. This is required because it is possible for the
4195/// package index to be too large to send over in a single request (over 64KiB).
4196#[derive(Debug)]
4197pub enum PackageIndexIteratorRequest {
4198    /// Returns the next chunk of package index entries. When the iterator is exhausted,
4199    /// this returns an empty vector.
4200    ///
4201    /// - response `entries` the next chunk of entries in the package index.
4202    Next { responder: PackageIndexIteratorNextResponder },
4203}
4204
4205impl PackageIndexIteratorRequest {
4206    #[allow(irrefutable_let_patterns)]
4207    pub fn into_next(self) -> Option<(PackageIndexIteratorNextResponder)> {
4208        if let PackageIndexIteratorRequest::Next { responder } = self {
4209            Some((responder))
4210        } else {
4211            None
4212        }
4213    }
4214
4215    /// Name of the method defined in FIDL
4216    pub fn method_name(&self) -> &'static str {
4217        match *self {
4218            PackageIndexIteratorRequest::Next { .. } => "next",
4219        }
4220    }
4221}
4222
4223#[derive(Debug, Clone)]
4224pub struct PackageIndexIteratorControlHandle {
4225    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
4226}
4227
4228impl fdomain_client::fidl::ControlHandle for PackageIndexIteratorControlHandle {
4229    fn shutdown(&self) {
4230        self.inner.shutdown()
4231    }
4232
4233    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
4234        self.inner.shutdown_with_epitaph(status)
4235    }
4236
4237    fn is_closed(&self) -> bool {
4238        self.inner.channel().is_closed()
4239    }
4240    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
4241        self.inner.channel().on_closed()
4242    }
4243}
4244
4245impl PackageIndexIteratorControlHandle {}
4246
4247#[must_use = "FIDL methods require a response to be sent"]
4248#[derive(Debug)]
4249pub struct PackageIndexIteratorNextResponder {
4250    control_handle: std::mem::ManuallyDrop<PackageIndexIteratorControlHandle>,
4251    tx_id: u32,
4252}
4253
4254/// Set the the channel to be shutdown (see [`PackageIndexIteratorControlHandle::shutdown`])
4255/// if the responder is dropped without sending a response, so that the client
4256/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
4257impl std::ops::Drop for PackageIndexIteratorNextResponder {
4258    fn drop(&mut self) {
4259        self.control_handle.shutdown();
4260        // Safety: drops once, never accessed again
4261        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4262    }
4263}
4264
4265impl fdomain_client::fidl::Responder for PackageIndexIteratorNextResponder {
4266    type ControlHandle = PackageIndexIteratorControlHandle;
4267
4268    fn control_handle(&self) -> &PackageIndexIteratorControlHandle {
4269        &self.control_handle
4270    }
4271
4272    fn drop_without_shutdown(mut self) {
4273        // Safety: drops once, never accessed again due to mem::forget
4274        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4275        // Prevent Drop from running (which would shut down the channel)
4276        std::mem::forget(self);
4277    }
4278}
4279
4280impl PackageIndexIteratorNextResponder {
4281    /// Sends a response to the FIDL transaction.
4282    ///
4283    /// Sets the channel to shutdown if an error occurs.
4284    pub fn send(self, mut entries: &[PackageIndexEntry]) -> Result<(), fidl::Error> {
4285        let _result = self.send_raw(entries);
4286        if _result.is_err() {
4287            self.control_handle.shutdown();
4288        }
4289        self.drop_without_shutdown();
4290        _result
4291    }
4292
4293    /// Similar to "send" but does not shutdown the channel if an error occurs.
4294    pub fn send_no_shutdown_on_err(
4295        self,
4296        mut entries: &[PackageIndexEntry],
4297    ) -> Result<(), fidl::Error> {
4298        let _result = self.send_raw(entries);
4299        self.drop_without_shutdown();
4300        _result
4301    }
4302
4303    fn send_raw(&self, mut entries: &[PackageIndexEntry]) -> Result<(), fidl::Error> {
4304        self.control_handle.inner.send::<PackageIndexIteratorNextResponse>(
4305            (entries,),
4306            self.tx_id,
4307            0x9de6bbc87c314d9,
4308            fidl::encoding::DynamicFlags::empty(),
4309        )
4310    }
4311}
4312
4313#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
4314pub struct PackageResolverMarker;
4315
4316impl fdomain_client::fidl::ProtocolMarker for PackageResolverMarker {
4317    type Proxy = PackageResolverProxy;
4318    type RequestStream = PackageResolverRequestStream;
4319
4320    const DEBUG_NAME: &'static str = "fuchsia.pkg.PackageResolver";
4321}
4322impl fdomain_client::fidl::DiscoverableProtocolMarker for PackageResolverMarker {}
4323pub type PackageResolverResolveResult = Result<ResolutionContext, ResolveError>;
4324pub type PackageResolverResolveWithContextResult = Result<ResolutionContext, ResolveError>;
4325pub type PackageResolverGetHashResult = Result<BlobId, i32>;
4326
4327pub trait PackageResolverProxyInterface: Send + Sync {
4328    type ResolveResponseFut: std::future::Future<Output = Result<PackageResolverResolveResult, fidl::Error>>
4329        + Send;
4330    fn r#resolve(
4331        &self,
4332        package_url: &str,
4333        dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4334    ) -> Self::ResolveResponseFut;
4335    type ResolveWithContextResponseFut: std::future::Future<Output = Result<PackageResolverResolveWithContextResult, fidl::Error>>
4336        + Send;
4337    fn r#resolve_with_context(
4338        &self,
4339        package_url: &str,
4340        context: &ResolutionContext,
4341        dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4342    ) -> Self::ResolveWithContextResponseFut;
4343    type GetHashResponseFut: std::future::Future<Output = Result<PackageResolverGetHashResult, fidl::Error>>
4344        + Send;
4345    fn r#get_hash(&self, package_url: &PackageUrl) -> Self::GetHashResponseFut;
4346}
4347
4348#[derive(Debug, Clone)]
4349pub struct PackageResolverProxy {
4350    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
4351}
4352
4353impl fdomain_client::fidl::Proxy for PackageResolverProxy {
4354    type Protocol = PackageResolverMarker;
4355
4356    fn from_channel(inner: fdomain_client::Channel) -> Self {
4357        Self::new(inner)
4358    }
4359
4360    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
4361        self.client.into_channel().map_err(|client| Self { client })
4362    }
4363
4364    fn as_channel(&self) -> &fdomain_client::Channel {
4365        self.client.as_channel()
4366    }
4367}
4368
4369impl PackageResolverProxy {
4370    /// Create a new Proxy for fuchsia.pkg/PackageResolver.
4371    pub fn new(channel: fdomain_client::Channel) -> Self {
4372        let protocol_name =
4373            <PackageResolverMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
4374        Self { client: fidl::client::Client::new(channel, protocol_name) }
4375    }
4376
4377    /// Get a Stream of events from the remote end of the protocol.
4378    ///
4379    /// # Panics
4380    ///
4381    /// Panics if the event stream was already taken.
4382    pub fn take_event_stream(&self) -> PackageResolverEventStream {
4383        PackageResolverEventStream { event_receiver: self.client.take_event_receiver() }
4384    }
4385
4386    /// Populates or updates the cache of a package using an absolute package
4387    /// URL.
4388    ///
4389    /// Ensures that a package, and any transitive subpackages, are on the local
4390    /// filesystem.
4391    ///
4392    /// + request `package_url` the absolute package URL for a package.  The
4393    ///   following link describes the format:
4394    ///   https://fuchsia.dev/fuchsia-src/concepts/packages/package_url.
4395    ///   Resource paths are not allowed.
4396    /// + request `dir` a request for a directory that will be resolved when the
4397    ///   package has been successfully cached.
4398    /// + returns a `resolved_context`, which can be passed to
4399    ///   `ResolveWithContext`, with a relative URL, to resolve a subpackage of
4400    ///   this package.
4401    /// * error indicates failure. See `ResolveError` for values and error
4402    ///   scenarios.
4403    pub fn r#resolve(
4404        &self,
4405        mut package_url: &str,
4406        mut dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4407    ) -> fidl::client::QueryResponseFut<
4408        PackageResolverResolveResult,
4409        fdomain_client::fidl::FDomainResourceDialect,
4410    > {
4411        PackageResolverProxyInterface::r#resolve(self, package_url, dir)
4412    }
4413
4414    /// Populates or updates the cache of a package using either an absolute or
4415    /// a relative package URL. If relative, the package will be resolved
4416    /// relative to the supplied `context`.
4417    ///
4418    /// Ensures that a package is on the local filesystem.
4419    ///
4420    /// + request `package_url` the absolute or relative package URL for a
4421    ///   package. If absolute, the `context` is ignored, and the behavior is
4422    ///   identical to calling `Resolve()`. A relative `package_url` is a
4423    ///   subpackage name.
4424    /// + request `context` a `ResolutionContext` associated with a previously
4425    ///   resolved package, for resolving subpackages relative to that package.
4426    /// + request `dir` a request for a directory that will be resolved when the
4427    ///   package has been successfully cached.
4428    /// + returns a `resolved_context`, which can be passed to a subsequent call
4429    ///   to `ResolveWithContext`, with a relative URL, to resolve a subpackage
4430    ///   of this package or subpackage.
4431    /// * error indicates failure. See `ResolveError` for values and error
4432    ///   scenarios.
4433    pub fn r#resolve_with_context(
4434        &self,
4435        mut package_url: &str,
4436        mut context: &ResolutionContext,
4437        mut dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4438    ) -> fidl::client::QueryResponseFut<
4439        PackageResolverResolveWithContextResult,
4440        fdomain_client::fidl::FDomainResourceDialect,
4441    > {
4442        PackageResolverProxyInterface::r#resolve_with_context(self, package_url, context, dir)
4443    }
4444
4445    /// Determines the hash of a package.
4446    ///
4447    /// + request `package_url` the package URL for a package.
4448    /// - response `meta_far_blob_id` the hash of the package.
4449    /// * error a zx_status value indicating failure. One of the following:
4450    ///     * `ZX_ERR_INTERNAL` if the resolver encountered an otherwise unspecified error
4451    ///       while handling the request.
4452    ///     * `ZX_ERR_NOT_FOUND` if the package does not exist in the repository specified by
4453    ///       `package_url`.
4454    ///     * `ZX_ERR_BAD_STATE` if the resolver does not know about the repository specified by
4455    ///       `package_url`.
4456    pub fn r#get_hash(
4457        &self,
4458        mut package_url: &PackageUrl,
4459    ) -> fidl::client::QueryResponseFut<
4460        PackageResolverGetHashResult,
4461        fdomain_client::fidl::FDomainResourceDialect,
4462    > {
4463        PackageResolverProxyInterface::r#get_hash(self, package_url)
4464    }
4465}
4466
4467impl PackageResolverProxyInterface for PackageResolverProxy {
4468    type ResolveResponseFut = fidl::client::QueryResponseFut<
4469        PackageResolverResolveResult,
4470        fdomain_client::fidl::FDomainResourceDialect,
4471    >;
4472    fn r#resolve(
4473        &self,
4474        mut package_url: &str,
4475        mut dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4476    ) -> Self::ResolveResponseFut {
4477        fn _decode(
4478            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
4479        ) -> Result<PackageResolverResolveResult, fidl::Error> {
4480            let _response = fidl::client::decode_transaction_body::<
4481                fidl::encoding::ResultType<PackageResolverResolveResponse, ResolveError>,
4482                fdomain_client::fidl::FDomainResourceDialect,
4483                0x6611263be4052d4f,
4484            >(_buf?)?;
4485            Ok(_response.map(|x| x.resolved_context))
4486        }
4487        self.client
4488            .send_query_and_decode::<PackageResolverResolveRequest, PackageResolverResolveResult>(
4489                (package_url, dir),
4490                0x6611263be4052d4f,
4491                fidl::encoding::DynamicFlags::empty(),
4492                _decode,
4493            )
4494    }
4495
4496    type ResolveWithContextResponseFut = fidl::client::QueryResponseFut<
4497        PackageResolverResolveWithContextResult,
4498        fdomain_client::fidl::FDomainResourceDialect,
4499    >;
4500    fn r#resolve_with_context(
4501        &self,
4502        mut package_url: &str,
4503        mut context: &ResolutionContext,
4504        mut dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4505    ) -> Self::ResolveWithContextResponseFut {
4506        fn _decode(
4507            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
4508        ) -> Result<PackageResolverResolveWithContextResult, fidl::Error> {
4509            let _response = fidl::client::decode_transaction_body::<
4510                fidl::encoding::ResultType<PackageResolverResolveWithContextResponse, ResolveError>,
4511                fdomain_client::fidl::FDomainResourceDialect,
4512                0x4c255ae7260298d4,
4513            >(_buf?)?;
4514            Ok(_response.map(|x| x.resolved_context))
4515        }
4516        self.client.send_query_and_decode::<
4517            PackageResolverResolveWithContextRequest,
4518            PackageResolverResolveWithContextResult,
4519        >(
4520            (package_url, context, dir,),
4521            0x4c255ae7260298d4,
4522            fidl::encoding::DynamicFlags::empty(),
4523            _decode,
4524        )
4525    }
4526
4527    type GetHashResponseFut = fidl::client::QueryResponseFut<
4528        PackageResolverGetHashResult,
4529        fdomain_client::fidl::FDomainResourceDialect,
4530    >;
4531    fn r#get_hash(&self, mut package_url: &PackageUrl) -> Self::GetHashResponseFut {
4532        fn _decode(
4533            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
4534        ) -> Result<PackageResolverGetHashResult, fidl::Error> {
4535            let _response = fidl::client::decode_transaction_body::<
4536                fidl::encoding::ResultType<PackageResolverGetHashResponse, i32>,
4537                fdomain_client::fidl::FDomainResourceDialect,
4538                0x594e8b4db51efd87,
4539            >(_buf?)?;
4540            Ok(_response.map(|x| x.meta_far_blob_id))
4541        }
4542        self.client
4543            .send_query_and_decode::<PackageResolverGetHashRequest, PackageResolverGetHashResult>(
4544                (package_url,),
4545                0x594e8b4db51efd87,
4546                fidl::encoding::DynamicFlags::empty(),
4547                _decode,
4548            )
4549    }
4550}
4551
4552pub struct PackageResolverEventStream {
4553    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
4554}
4555
4556impl std::marker::Unpin for PackageResolverEventStream {}
4557
4558impl futures::stream::FusedStream for PackageResolverEventStream {
4559    fn is_terminated(&self) -> bool {
4560        self.event_receiver.is_terminated()
4561    }
4562}
4563
4564impl futures::Stream for PackageResolverEventStream {
4565    type Item = Result<PackageResolverEvent, fidl::Error>;
4566
4567    fn poll_next(
4568        mut self: std::pin::Pin<&mut Self>,
4569        cx: &mut std::task::Context<'_>,
4570    ) -> std::task::Poll<Option<Self::Item>> {
4571        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
4572            &mut self.event_receiver,
4573            cx
4574        )?) {
4575            Some(buf) => std::task::Poll::Ready(Some(PackageResolverEvent::decode(buf))),
4576            None => std::task::Poll::Ready(None),
4577        }
4578    }
4579}
4580
4581#[derive(Debug)]
4582pub enum PackageResolverEvent {}
4583
4584impl PackageResolverEvent {
4585    /// Decodes a message buffer as a [`PackageResolverEvent`].
4586    fn decode(
4587        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
4588    ) -> Result<PackageResolverEvent, fidl::Error> {
4589        let (bytes, _handles) = buf.split_mut();
4590        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
4591        debug_assert_eq!(tx_header.tx_id, 0);
4592        match tx_header.ordinal {
4593            _ => Err(fidl::Error::UnknownOrdinal {
4594                ordinal: tx_header.ordinal,
4595                protocol_name:
4596                    <PackageResolverMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
4597            }),
4598        }
4599    }
4600}
4601
4602/// A Stream of incoming requests for fuchsia.pkg/PackageResolver.
4603pub struct PackageResolverRequestStream {
4604    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
4605    is_terminated: bool,
4606}
4607
4608impl std::marker::Unpin for PackageResolverRequestStream {}
4609
4610impl futures::stream::FusedStream for PackageResolverRequestStream {
4611    fn is_terminated(&self) -> bool {
4612        self.is_terminated
4613    }
4614}
4615
4616impl fdomain_client::fidl::RequestStream for PackageResolverRequestStream {
4617    type Protocol = PackageResolverMarker;
4618    type ControlHandle = PackageResolverControlHandle;
4619
4620    fn from_channel(channel: fdomain_client::Channel) -> Self {
4621        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
4622    }
4623
4624    fn control_handle(&self) -> Self::ControlHandle {
4625        PackageResolverControlHandle { inner: self.inner.clone() }
4626    }
4627
4628    fn into_inner(
4629        self,
4630    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
4631    {
4632        (self.inner, self.is_terminated)
4633    }
4634
4635    fn from_inner(
4636        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
4637        is_terminated: bool,
4638    ) -> Self {
4639        Self { inner, is_terminated }
4640    }
4641}
4642
4643impl futures::Stream for PackageResolverRequestStream {
4644    type Item = Result<PackageResolverRequest, fidl::Error>;
4645
4646    fn poll_next(
4647        mut self: std::pin::Pin<&mut Self>,
4648        cx: &mut std::task::Context<'_>,
4649    ) -> std::task::Poll<Option<Self::Item>> {
4650        let this = &mut *self;
4651        if this.inner.check_shutdown(cx) {
4652            this.is_terminated = true;
4653            return std::task::Poll::Ready(None);
4654        }
4655        if this.is_terminated {
4656            panic!("polled PackageResolverRequestStream after completion");
4657        }
4658        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
4659            |bytes, handles| {
4660                match this.inner.channel().read_etc(cx, bytes, handles) {
4661                    std::task::Poll::Ready(Ok(())) => {}
4662                    std::task::Poll::Pending => return std::task::Poll::Pending,
4663                    std::task::Poll::Ready(Err(None)) => {
4664                        this.is_terminated = true;
4665                        return std::task::Poll::Ready(None);
4666                    }
4667                    std::task::Poll::Ready(Err(Some(e))) => {
4668                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
4669                            e.into(),
4670                        ))));
4671                    }
4672                }
4673
4674                // A message has been received from the channel
4675                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
4676
4677                std::task::Poll::Ready(Some(match header.ordinal {
4678                0x6611263be4052d4f => {
4679                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
4680                    let mut req = fidl::new_empty!(PackageResolverResolveRequest, fdomain_client::fidl::FDomainResourceDialect);
4681                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageResolverResolveRequest>(&header, _body_bytes, handles, &mut req)?;
4682                    let control_handle = PackageResolverControlHandle {
4683                        inner: this.inner.clone(),
4684                    };
4685                    Ok(PackageResolverRequest::Resolve {package_url: req.package_url,
4686dir: req.dir,
4687
4688                        responder: PackageResolverResolveResponder {
4689                            control_handle: std::mem::ManuallyDrop::new(control_handle),
4690                            tx_id: header.tx_id,
4691                        },
4692                    })
4693                }
4694                0x4c255ae7260298d4 => {
4695                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
4696                    let mut req = fidl::new_empty!(PackageResolverResolveWithContextRequest, fdomain_client::fidl::FDomainResourceDialect);
4697                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageResolverResolveWithContextRequest>(&header, _body_bytes, handles, &mut req)?;
4698                    let control_handle = PackageResolverControlHandle {
4699                        inner: this.inner.clone(),
4700                    };
4701                    Ok(PackageResolverRequest::ResolveWithContext {package_url: req.package_url,
4702context: req.context,
4703dir: req.dir,
4704
4705                        responder: PackageResolverResolveWithContextResponder {
4706                            control_handle: std::mem::ManuallyDrop::new(control_handle),
4707                            tx_id: header.tx_id,
4708                        },
4709                    })
4710                }
4711                0x594e8b4db51efd87 => {
4712                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
4713                    let mut req = fidl::new_empty!(PackageResolverGetHashRequest, fdomain_client::fidl::FDomainResourceDialect);
4714                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<PackageResolverGetHashRequest>(&header, _body_bytes, handles, &mut req)?;
4715                    let control_handle = PackageResolverControlHandle {
4716                        inner: this.inner.clone(),
4717                    };
4718                    Ok(PackageResolverRequest::GetHash {package_url: req.package_url,
4719
4720                        responder: PackageResolverGetHashResponder {
4721                            control_handle: std::mem::ManuallyDrop::new(control_handle),
4722                            tx_id: header.tx_id,
4723                        },
4724                    })
4725                }
4726                _ => Err(fidl::Error::UnknownOrdinal {
4727                    ordinal: header.ordinal,
4728                    protocol_name: <PackageResolverMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
4729                }),
4730            }))
4731            },
4732        )
4733    }
4734}
4735
4736/// This resolves packages from a repository.
4737///
4738/// This is intended to be implemented by package resolver components, and used by
4739/// repository administration tools.
4740#[derive(Debug)]
4741pub enum PackageResolverRequest {
4742    /// Populates or updates the cache of a package using an absolute package
4743    /// URL.
4744    ///
4745    /// Ensures that a package, and any transitive subpackages, are on the local
4746    /// filesystem.
4747    ///
4748    /// + request `package_url` the absolute package URL for a package.  The
4749    ///   following link describes the format:
4750    ///   https://fuchsia.dev/fuchsia-src/concepts/packages/package_url.
4751    ///   Resource paths are not allowed.
4752    /// + request `dir` a request for a directory that will be resolved when the
4753    ///   package has been successfully cached.
4754    /// + returns a `resolved_context`, which can be passed to
4755    ///   `ResolveWithContext`, with a relative URL, to resolve a subpackage of
4756    ///   this package.
4757    /// * error indicates failure. See `ResolveError` for values and error
4758    ///   scenarios.
4759    Resolve {
4760        package_url: String,
4761        dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4762        responder: PackageResolverResolveResponder,
4763    },
4764    /// Populates or updates the cache of a package using either an absolute or
4765    /// a relative package URL. If relative, the package will be resolved
4766    /// relative to the supplied `context`.
4767    ///
4768    /// Ensures that a package is on the local filesystem.
4769    ///
4770    /// + request `package_url` the absolute or relative package URL for a
4771    ///   package. If absolute, the `context` is ignored, and the behavior is
4772    ///   identical to calling `Resolve()`. A relative `package_url` is a
4773    ///   subpackage name.
4774    /// + request `context` a `ResolutionContext` associated with a previously
4775    ///   resolved package, for resolving subpackages relative to that package.
4776    /// + request `dir` a request for a directory that will be resolved when the
4777    ///   package has been successfully cached.
4778    /// + returns a `resolved_context`, which can be passed to a subsequent call
4779    ///   to `ResolveWithContext`, with a relative URL, to resolve a subpackage
4780    ///   of this package or subpackage.
4781    /// * error indicates failure. See `ResolveError` for values and error
4782    ///   scenarios.
4783    ResolveWithContext {
4784        package_url: String,
4785        context: ResolutionContext,
4786        dir: fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4787        responder: PackageResolverResolveWithContextResponder,
4788    },
4789    /// Determines the hash of a package.
4790    ///
4791    /// + request `package_url` the package URL for a package.
4792    /// - response `meta_far_blob_id` the hash of the package.
4793    /// * error a zx_status value indicating failure. One of the following:
4794    ///     * `ZX_ERR_INTERNAL` if the resolver encountered an otherwise unspecified error
4795    ///       while handling the request.
4796    ///     * `ZX_ERR_NOT_FOUND` if the package does not exist in the repository specified by
4797    ///       `package_url`.
4798    ///     * `ZX_ERR_BAD_STATE` if the resolver does not know about the repository specified by
4799    ///       `package_url`.
4800    GetHash { package_url: PackageUrl, responder: PackageResolverGetHashResponder },
4801}
4802
4803impl PackageResolverRequest {
4804    #[allow(irrefutable_let_patterns)]
4805    pub fn into_resolve(
4806        self,
4807    ) -> Option<(
4808        String,
4809        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4810        PackageResolverResolveResponder,
4811    )> {
4812        if let PackageResolverRequest::Resolve { package_url, dir, responder } = self {
4813            Some((package_url, dir, responder))
4814        } else {
4815            None
4816        }
4817    }
4818
4819    #[allow(irrefutable_let_patterns)]
4820    pub fn into_resolve_with_context(
4821        self,
4822    ) -> Option<(
4823        String,
4824        ResolutionContext,
4825        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
4826        PackageResolverResolveWithContextResponder,
4827    )> {
4828        if let PackageResolverRequest::ResolveWithContext { package_url, context, dir, responder } =
4829            self
4830        {
4831            Some((package_url, context, dir, responder))
4832        } else {
4833            None
4834        }
4835    }
4836
4837    #[allow(irrefutable_let_patterns)]
4838    pub fn into_get_hash(self) -> Option<(PackageUrl, PackageResolverGetHashResponder)> {
4839        if let PackageResolverRequest::GetHash { package_url, responder } = self {
4840            Some((package_url, responder))
4841        } else {
4842            None
4843        }
4844    }
4845
4846    /// Name of the method defined in FIDL
4847    pub fn method_name(&self) -> &'static str {
4848        match *self {
4849            PackageResolverRequest::Resolve { .. } => "resolve",
4850            PackageResolverRequest::ResolveWithContext { .. } => "resolve_with_context",
4851            PackageResolverRequest::GetHash { .. } => "get_hash",
4852        }
4853    }
4854}
4855
4856#[derive(Debug, Clone)]
4857pub struct PackageResolverControlHandle {
4858    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
4859}
4860
4861impl fdomain_client::fidl::ControlHandle for PackageResolverControlHandle {
4862    fn shutdown(&self) {
4863        self.inner.shutdown()
4864    }
4865
4866    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
4867        self.inner.shutdown_with_epitaph(status)
4868    }
4869
4870    fn is_closed(&self) -> bool {
4871        self.inner.channel().is_closed()
4872    }
4873    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
4874        self.inner.channel().on_closed()
4875    }
4876}
4877
4878impl PackageResolverControlHandle {}
4879
4880#[must_use = "FIDL methods require a response to be sent"]
4881#[derive(Debug)]
4882pub struct PackageResolverResolveResponder {
4883    control_handle: std::mem::ManuallyDrop<PackageResolverControlHandle>,
4884    tx_id: u32,
4885}
4886
4887/// Set the the channel to be shutdown (see [`PackageResolverControlHandle::shutdown`])
4888/// if the responder is dropped without sending a response, so that the client
4889/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
4890impl std::ops::Drop for PackageResolverResolveResponder {
4891    fn drop(&mut self) {
4892        self.control_handle.shutdown();
4893        // Safety: drops once, never accessed again
4894        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4895    }
4896}
4897
4898impl fdomain_client::fidl::Responder for PackageResolverResolveResponder {
4899    type ControlHandle = PackageResolverControlHandle;
4900
4901    fn control_handle(&self) -> &PackageResolverControlHandle {
4902        &self.control_handle
4903    }
4904
4905    fn drop_without_shutdown(mut self) {
4906        // Safety: drops once, never accessed again due to mem::forget
4907        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4908        // Prevent Drop from running (which would shut down the channel)
4909        std::mem::forget(self);
4910    }
4911}
4912
4913impl PackageResolverResolveResponder {
4914    /// Sends a response to the FIDL transaction.
4915    ///
4916    /// Sets the channel to shutdown if an error occurs.
4917    pub fn send(
4918        self,
4919        mut result: Result<&ResolutionContext, ResolveError>,
4920    ) -> Result<(), fidl::Error> {
4921        let _result = self.send_raw(result);
4922        if _result.is_err() {
4923            self.control_handle.shutdown();
4924        }
4925        self.drop_without_shutdown();
4926        _result
4927    }
4928
4929    /// Similar to "send" but does not shutdown the channel if an error occurs.
4930    pub fn send_no_shutdown_on_err(
4931        self,
4932        mut result: Result<&ResolutionContext, ResolveError>,
4933    ) -> Result<(), fidl::Error> {
4934        let _result = self.send_raw(result);
4935        self.drop_without_shutdown();
4936        _result
4937    }
4938
4939    fn send_raw(
4940        &self,
4941        mut result: Result<&ResolutionContext, ResolveError>,
4942    ) -> Result<(), fidl::Error> {
4943        self.control_handle.inner.send::<fidl::encoding::ResultType<
4944            PackageResolverResolveResponse,
4945            ResolveError,
4946        >>(
4947            result.map(|resolved_context| (resolved_context,)),
4948            self.tx_id,
4949            0x6611263be4052d4f,
4950            fidl::encoding::DynamicFlags::empty(),
4951        )
4952    }
4953}
4954
4955#[must_use = "FIDL methods require a response to be sent"]
4956#[derive(Debug)]
4957pub struct PackageResolverResolveWithContextResponder {
4958    control_handle: std::mem::ManuallyDrop<PackageResolverControlHandle>,
4959    tx_id: u32,
4960}
4961
4962/// Set the the channel to be shutdown (see [`PackageResolverControlHandle::shutdown`])
4963/// if the responder is dropped without sending a response, so that the client
4964/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
4965impl std::ops::Drop for PackageResolverResolveWithContextResponder {
4966    fn drop(&mut self) {
4967        self.control_handle.shutdown();
4968        // Safety: drops once, never accessed again
4969        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4970    }
4971}
4972
4973impl fdomain_client::fidl::Responder for PackageResolverResolveWithContextResponder {
4974    type ControlHandle = PackageResolverControlHandle;
4975
4976    fn control_handle(&self) -> &PackageResolverControlHandle {
4977        &self.control_handle
4978    }
4979
4980    fn drop_without_shutdown(mut self) {
4981        // Safety: drops once, never accessed again due to mem::forget
4982        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
4983        // Prevent Drop from running (which would shut down the channel)
4984        std::mem::forget(self);
4985    }
4986}
4987
4988impl PackageResolverResolveWithContextResponder {
4989    /// Sends a response to the FIDL transaction.
4990    ///
4991    /// Sets the channel to shutdown if an error occurs.
4992    pub fn send(
4993        self,
4994        mut result: Result<&ResolutionContext, ResolveError>,
4995    ) -> Result<(), fidl::Error> {
4996        let _result = self.send_raw(result);
4997        if _result.is_err() {
4998            self.control_handle.shutdown();
4999        }
5000        self.drop_without_shutdown();
5001        _result
5002    }
5003
5004    /// Similar to "send" but does not shutdown the channel if an error occurs.
5005    pub fn send_no_shutdown_on_err(
5006        self,
5007        mut result: Result<&ResolutionContext, ResolveError>,
5008    ) -> Result<(), fidl::Error> {
5009        let _result = self.send_raw(result);
5010        self.drop_without_shutdown();
5011        _result
5012    }
5013
5014    fn send_raw(
5015        &self,
5016        mut result: Result<&ResolutionContext, ResolveError>,
5017    ) -> Result<(), fidl::Error> {
5018        self.control_handle.inner.send::<fidl::encoding::ResultType<
5019            PackageResolverResolveWithContextResponse,
5020            ResolveError,
5021        >>(
5022            result.map(|resolved_context| (resolved_context,)),
5023            self.tx_id,
5024            0x4c255ae7260298d4,
5025            fidl::encoding::DynamicFlags::empty(),
5026        )
5027    }
5028}
5029
5030#[must_use = "FIDL methods require a response to be sent"]
5031#[derive(Debug)]
5032pub struct PackageResolverGetHashResponder {
5033    control_handle: std::mem::ManuallyDrop<PackageResolverControlHandle>,
5034    tx_id: u32,
5035}
5036
5037/// Set the the channel to be shutdown (see [`PackageResolverControlHandle::shutdown`])
5038/// if the responder is dropped without sending a response, so that the client
5039/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
5040impl std::ops::Drop for PackageResolverGetHashResponder {
5041    fn drop(&mut self) {
5042        self.control_handle.shutdown();
5043        // Safety: drops once, never accessed again
5044        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
5045    }
5046}
5047
5048impl fdomain_client::fidl::Responder for PackageResolverGetHashResponder {
5049    type ControlHandle = PackageResolverControlHandle;
5050
5051    fn control_handle(&self) -> &PackageResolverControlHandle {
5052        &self.control_handle
5053    }
5054
5055    fn drop_without_shutdown(mut self) {
5056        // Safety: drops once, never accessed again due to mem::forget
5057        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
5058        // Prevent Drop from running (which would shut down the channel)
5059        std::mem::forget(self);
5060    }
5061}
5062
5063impl PackageResolverGetHashResponder {
5064    /// Sends a response to the FIDL transaction.
5065    ///
5066    /// Sets the channel to shutdown if an error occurs.
5067    pub fn send(self, mut result: Result<&BlobId, i32>) -> Result<(), fidl::Error> {
5068        let _result = self.send_raw(result);
5069        if _result.is_err() {
5070            self.control_handle.shutdown();
5071        }
5072        self.drop_without_shutdown();
5073        _result
5074    }
5075
5076    /// Similar to "send" but does not shutdown the channel if an error occurs.
5077    pub fn send_no_shutdown_on_err(
5078        self,
5079        mut result: Result<&BlobId, i32>,
5080    ) -> Result<(), fidl::Error> {
5081        let _result = self.send_raw(result);
5082        self.drop_without_shutdown();
5083        _result
5084    }
5085
5086    fn send_raw(&self, mut result: Result<&BlobId, i32>) -> Result<(), fidl::Error> {
5087        self.control_handle
5088            .inner
5089            .send::<fidl::encoding::ResultType<PackageResolverGetHashResponse, i32>>(
5090                result.map(|meta_far_blob_id| (meta_far_blob_id,)),
5091                self.tx_id,
5092                0x594e8b4db51efd87,
5093                fidl::encoding::DynamicFlags::empty(),
5094            )
5095    }
5096}
5097
5098#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
5099pub struct RepositoryIteratorMarker;
5100
5101impl fdomain_client::fidl::ProtocolMarker for RepositoryIteratorMarker {
5102    type Proxy = RepositoryIteratorProxy;
5103    type RequestStream = RepositoryIteratorRequestStream;
5104
5105    const DEBUG_NAME: &'static str = "(anonymous) RepositoryIterator";
5106}
5107
5108pub trait RepositoryIteratorProxyInterface: Send + Sync {
5109    type NextResponseFut: std::future::Future<Output = Result<Vec<RepositoryConfig>, fidl::Error>>
5110        + Send;
5111    fn r#next(&self) -> Self::NextResponseFut;
5112}
5113
5114#[derive(Debug, Clone)]
5115pub struct RepositoryIteratorProxy {
5116    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
5117}
5118
5119impl fdomain_client::fidl::Proxy for RepositoryIteratorProxy {
5120    type Protocol = RepositoryIteratorMarker;
5121
5122    fn from_channel(inner: fdomain_client::Channel) -> Self {
5123        Self::new(inner)
5124    }
5125
5126    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
5127        self.client.into_channel().map_err(|client| Self { client })
5128    }
5129
5130    fn as_channel(&self) -> &fdomain_client::Channel {
5131        self.client.as_channel()
5132    }
5133}
5134
5135impl RepositoryIteratorProxy {
5136    /// Create a new Proxy for fuchsia.pkg/RepositoryIterator.
5137    pub fn new(channel: fdomain_client::Channel) -> Self {
5138        let protocol_name =
5139            <RepositoryIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
5140        Self { client: fidl::client::Client::new(channel, protocol_name) }
5141    }
5142
5143    /// Get a Stream of events from the remote end of the protocol.
5144    ///
5145    /// # Panics
5146    ///
5147    /// Panics if the event stream was already taken.
5148    pub fn take_event_stream(&self) -> RepositoryIteratorEventStream {
5149        RepositoryIteratorEventStream { event_receiver: self.client.take_event_receiver() }
5150    }
5151
5152    /// Advances the iterator and returns the next batch of repositories.
5153    ///
5154    /// - response `repos` a vector of `RepositoryConfig` repositories.
5155    ///   Will return an empty vector when there are no more repositories.
5156    pub fn r#next(
5157        &self,
5158    ) -> fidl::client::QueryResponseFut<
5159        Vec<RepositoryConfig>,
5160        fdomain_client::fidl::FDomainResourceDialect,
5161    > {
5162        RepositoryIteratorProxyInterface::r#next(self)
5163    }
5164}
5165
5166impl RepositoryIteratorProxyInterface for RepositoryIteratorProxy {
5167    type NextResponseFut = fidl::client::QueryResponseFut<
5168        Vec<RepositoryConfig>,
5169        fdomain_client::fidl::FDomainResourceDialect,
5170    >;
5171    fn r#next(&self) -> Self::NextResponseFut {
5172        fn _decode(
5173            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
5174        ) -> Result<Vec<RepositoryConfig>, fidl::Error> {
5175            let _response = fidl::client::decode_transaction_body::<
5176                RepositoryIteratorNextResponse,
5177                fdomain_client::fidl::FDomainResourceDialect,
5178                0x5502086bc0cdd25e,
5179            >(_buf?)?;
5180            Ok(_response.repos)
5181        }
5182        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, Vec<RepositoryConfig>>(
5183            (),
5184            0x5502086bc0cdd25e,
5185            fidl::encoding::DynamicFlags::empty(),
5186            _decode,
5187        )
5188    }
5189}
5190
5191pub struct RepositoryIteratorEventStream {
5192    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
5193}
5194
5195impl std::marker::Unpin for RepositoryIteratorEventStream {}
5196
5197impl futures::stream::FusedStream for RepositoryIteratorEventStream {
5198    fn is_terminated(&self) -> bool {
5199        self.event_receiver.is_terminated()
5200    }
5201}
5202
5203impl futures::Stream for RepositoryIteratorEventStream {
5204    type Item = Result<RepositoryIteratorEvent, fidl::Error>;
5205
5206    fn poll_next(
5207        mut self: std::pin::Pin<&mut Self>,
5208        cx: &mut std::task::Context<'_>,
5209    ) -> std::task::Poll<Option<Self::Item>> {
5210        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
5211            &mut self.event_receiver,
5212            cx
5213        )?) {
5214            Some(buf) => std::task::Poll::Ready(Some(RepositoryIteratorEvent::decode(buf))),
5215            None => std::task::Poll::Ready(None),
5216        }
5217    }
5218}
5219
5220#[derive(Debug)]
5221pub enum RepositoryIteratorEvent {}
5222
5223impl RepositoryIteratorEvent {
5224    /// Decodes a message buffer as a [`RepositoryIteratorEvent`].
5225    fn decode(
5226        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
5227    ) -> Result<RepositoryIteratorEvent, fidl::Error> {
5228        let (bytes, _handles) = buf.split_mut();
5229        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
5230        debug_assert_eq!(tx_header.tx_id, 0);
5231        match tx_header.ordinal {
5232            _ => Err(fidl::Error::UnknownOrdinal {
5233                ordinal: tx_header.ordinal,
5234                protocol_name:
5235                    <RepositoryIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
5236            }),
5237        }
5238    }
5239}
5240
5241/// A Stream of incoming requests for fuchsia.pkg/RepositoryIterator.
5242pub struct RepositoryIteratorRequestStream {
5243    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
5244    is_terminated: bool,
5245}
5246
5247impl std::marker::Unpin for RepositoryIteratorRequestStream {}
5248
5249impl futures::stream::FusedStream for RepositoryIteratorRequestStream {
5250    fn is_terminated(&self) -> bool {
5251        self.is_terminated
5252    }
5253}
5254
5255impl fdomain_client::fidl::RequestStream for RepositoryIteratorRequestStream {
5256    type Protocol = RepositoryIteratorMarker;
5257    type ControlHandle = RepositoryIteratorControlHandle;
5258
5259    fn from_channel(channel: fdomain_client::Channel) -> Self {
5260        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
5261    }
5262
5263    fn control_handle(&self) -> Self::ControlHandle {
5264        RepositoryIteratorControlHandle { inner: self.inner.clone() }
5265    }
5266
5267    fn into_inner(
5268        self,
5269    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
5270    {
5271        (self.inner, self.is_terminated)
5272    }
5273
5274    fn from_inner(
5275        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
5276        is_terminated: bool,
5277    ) -> Self {
5278        Self { inner, is_terminated }
5279    }
5280}
5281
5282impl futures::Stream for RepositoryIteratorRequestStream {
5283    type Item = Result<RepositoryIteratorRequest, fidl::Error>;
5284
5285    fn poll_next(
5286        mut self: std::pin::Pin<&mut Self>,
5287        cx: &mut std::task::Context<'_>,
5288    ) -> std::task::Poll<Option<Self::Item>> {
5289        let this = &mut *self;
5290        if this.inner.check_shutdown(cx) {
5291            this.is_terminated = true;
5292            return std::task::Poll::Ready(None);
5293        }
5294        if this.is_terminated {
5295            panic!("polled RepositoryIteratorRequestStream after completion");
5296        }
5297        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
5298            |bytes, handles| {
5299                match this.inner.channel().read_etc(cx, bytes, handles) {
5300                    std::task::Poll::Ready(Ok(())) => {}
5301                    std::task::Poll::Pending => return std::task::Poll::Pending,
5302                    std::task::Poll::Ready(Err(None)) => {
5303                        this.is_terminated = true;
5304                        return std::task::Poll::Ready(None);
5305                    }
5306                    std::task::Poll::Ready(Err(Some(e))) => {
5307                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
5308                            e.into(),
5309                        ))));
5310                    }
5311                }
5312
5313                // A message has been received from the channel
5314                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
5315
5316                std::task::Poll::Ready(Some(match header.ordinal {
5317                0x5502086bc0cdd25e => {
5318                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
5319                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fdomain_client::fidl::FDomainResourceDialect);
5320                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
5321                    let control_handle = RepositoryIteratorControlHandle {
5322                        inner: this.inner.clone(),
5323                    };
5324                    Ok(RepositoryIteratorRequest::Next {
5325                        responder: RepositoryIteratorNextResponder {
5326                            control_handle: std::mem::ManuallyDrop::new(control_handle),
5327                            tx_id: header.tx_id,
5328                        },
5329                    })
5330                }
5331                _ => Err(fidl::Error::UnknownOrdinal {
5332                    ordinal: header.ordinal,
5333                    protocol_name: <RepositoryIteratorMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
5334                }),
5335            }))
5336            },
5337        )
5338    }
5339}
5340
5341/// The iterator over all the repositories defined in a `PackageResolver`.
5342#[derive(Debug)]
5343pub enum RepositoryIteratorRequest {
5344    /// Advances the iterator and returns the next batch of repositories.
5345    ///
5346    /// - response `repos` a vector of `RepositoryConfig` repositories.
5347    ///   Will return an empty vector when there are no more repositories.
5348    Next { responder: RepositoryIteratorNextResponder },
5349}
5350
5351impl RepositoryIteratorRequest {
5352    #[allow(irrefutable_let_patterns)]
5353    pub fn into_next(self) -> Option<(RepositoryIteratorNextResponder)> {
5354        if let RepositoryIteratorRequest::Next { responder } = self {
5355            Some((responder))
5356        } else {
5357            None
5358        }
5359    }
5360
5361    /// Name of the method defined in FIDL
5362    pub fn method_name(&self) -> &'static str {
5363        match *self {
5364            RepositoryIteratorRequest::Next { .. } => "next",
5365        }
5366    }
5367}
5368
5369#[derive(Debug, Clone)]
5370pub struct RepositoryIteratorControlHandle {
5371    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
5372}
5373
5374impl fdomain_client::fidl::ControlHandle for RepositoryIteratorControlHandle {
5375    fn shutdown(&self) {
5376        self.inner.shutdown()
5377    }
5378
5379    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
5380        self.inner.shutdown_with_epitaph(status)
5381    }
5382
5383    fn is_closed(&self) -> bool {
5384        self.inner.channel().is_closed()
5385    }
5386    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
5387        self.inner.channel().on_closed()
5388    }
5389}
5390
5391impl RepositoryIteratorControlHandle {}
5392
5393#[must_use = "FIDL methods require a response to be sent"]
5394#[derive(Debug)]
5395pub struct RepositoryIteratorNextResponder {
5396    control_handle: std::mem::ManuallyDrop<RepositoryIteratorControlHandle>,
5397    tx_id: u32,
5398}
5399
5400/// Set the the channel to be shutdown (see [`RepositoryIteratorControlHandle::shutdown`])
5401/// if the responder is dropped without sending a response, so that the client
5402/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
5403impl std::ops::Drop for RepositoryIteratorNextResponder {
5404    fn drop(&mut self) {
5405        self.control_handle.shutdown();
5406        // Safety: drops once, never accessed again
5407        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
5408    }
5409}
5410
5411impl fdomain_client::fidl::Responder for RepositoryIteratorNextResponder {
5412    type ControlHandle = RepositoryIteratorControlHandle;
5413
5414    fn control_handle(&self) -> &RepositoryIteratorControlHandle {
5415        &self.control_handle
5416    }
5417
5418    fn drop_without_shutdown(mut self) {
5419        // Safety: drops once, never accessed again due to mem::forget
5420        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
5421        // Prevent Drop from running (which would shut down the channel)
5422        std::mem::forget(self);
5423    }
5424}
5425
5426impl RepositoryIteratorNextResponder {
5427    /// Sends a response to the FIDL transaction.
5428    ///
5429    /// Sets the channel to shutdown if an error occurs.
5430    pub fn send(self, mut repos: &[RepositoryConfig]) -> Result<(), fidl::Error> {
5431        let _result = self.send_raw(repos);
5432        if _result.is_err() {
5433            self.control_handle.shutdown();
5434        }
5435        self.drop_without_shutdown();
5436        _result
5437    }
5438
5439    /// Similar to "send" but does not shutdown the channel if an error occurs.
5440    pub fn send_no_shutdown_on_err(
5441        self,
5442        mut repos: &[RepositoryConfig],
5443    ) -> Result<(), fidl::Error> {
5444        let _result = self.send_raw(repos);
5445        self.drop_without_shutdown();
5446        _result
5447    }
5448
5449    fn send_raw(&self, mut repos: &[RepositoryConfig]) -> Result<(), fidl::Error> {
5450        self.control_handle.inner.send::<RepositoryIteratorNextResponse>(
5451            (repos,),
5452            self.tx_id,
5453            0x5502086bc0cdd25e,
5454            fidl::encoding::DynamicFlags::empty(),
5455        )
5456    }
5457}
5458
5459#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
5460pub struct RepositoryManagerMarker;
5461
5462impl fdomain_client::fidl::ProtocolMarker for RepositoryManagerMarker {
5463    type Proxy = RepositoryManagerProxy;
5464    type RequestStream = RepositoryManagerRequestStream;
5465
5466    const DEBUG_NAME: &'static str = "fuchsia.pkg.RepositoryManager";
5467}
5468impl fdomain_client::fidl::DiscoverableProtocolMarker for RepositoryManagerMarker {}
5469pub type RepositoryManagerAddResult = Result<(), i32>;
5470pub type RepositoryManagerRemoveResult = Result<(), i32>;
5471pub type RepositoryManagerAddMirrorResult = Result<(), i32>;
5472pub type RepositoryManagerRemoveMirrorResult = Result<(), i32>;
5473
5474pub trait RepositoryManagerProxyInterface: Send + Sync {
5475    type AddResponseFut: std::future::Future<Output = Result<RepositoryManagerAddResult, fidl::Error>>
5476        + Send;
5477    fn r#add(&self, repo: &RepositoryConfig) -> Self::AddResponseFut;
5478    type RemoveResponseFut: std::future::Future<Output = Result<RepositoryManagerRemoveResult, fidl::Error>>
5479        + Send;
5480    fn r#remove(&self, repo_url: &str) -> Self::RemoveResponseFut;
5481    type AddMirrorResponseFut: std::future::Future<Output = Result<RepositoryManagerAddMirrorResult, fidl::Error>>
5482        + Send;
5483    fn r#add_mirror(&self, repo_url: &str, mirror: &MirrorConfig) -> Self::AddMirrorResponseFut;
5484    type RemoveMirrorResponseFut: std::future::Future<Output = Result<RepositoryManagerRemoveMirrorResult, fidl::Error>>
5485        + Send;
5486    fn r#remove_mirror(&self, repo_url: &str, mirror_url: &str) -> Self::RemoveMirrorResponseFut;
5487    fn r#list(
5488        &self,
5489        iterator: fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>,
5490    ) -> Result<(), fidl::Error>;
5491}
5492
5493#[derive(Debug, Clone)]
5494pub struct RepositoryManagerProxy {
5495    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
5496}
5497
5498impl fdomain_client::fidl::Proxy for RepositoryManagerProxy {
5499    type Protocol = RepositoryManagerMarker;
5500
5501    fn from_channel(inner: fdomain_client::Channel) -> Self {
5502        Self::new(inner)
5503    }
5504
5505    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
5506        self.client.into_channel().map_err(|client| Self { client })
5507    }
5508
5509    fn as_channel(&self) -> &fdomain_client::Channel {
5510        self.client.as_channel()
5511    }
5512}
5513
5514impl RepositoryManagerProxy {
5515    /// Create a new Proxy for fuchsia.pkg/RepositoryManager.
5516    pub fn new(channel: fdomain_client::Channel) -> Self {
5517        let protocol_name =
5518            <RepositoryManagerMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
5519        Self { client: fidl::client::Client::new(channel, protocol_name) }
5520    }
5521
5522    /// Get a Stream of events from the remote end of the protocol.
5523    ///
5524    /// # Panics
5525    ///
5526    /// Panics if the event stream was already taken.
5527    pub fn take_event_stream(&self) -> RepositoryManagerEventStream {
5528        RepositoryManagerEventStream { event_receiver: self.client.take_event_receiver() }
5529    }
5530
5531    /// Adds a repository. This will overwrite the repository if it already exists.
5532    ///
5533    /// + request `repo` a repository to add to the resolver.
5534    /// * error a zx_status value indicating failure. One of the following:
5535    ///     * `ZX_ERR_ACCESS_DENIED` if editing repositories is permanently disabled.
5536    ///     * `ZX_ERR_ALREADY_EXISTS` if the repository already exists.
5537    ///     * `ZX_ERR_INVALID_ARGS` if the repository is malformed.
5538    pub fn r#add(
5539        &self,
5540        mut repo: &RepositoryConfig,
5541    ) -> fidl::client::QueryResponseFut<
5542        RepositoryManagerAddResult,
5543        fdomain_client::fidl::FDomainResourceDialect,
5544    > {
5545        RepositoryManagerProxyInterface::r#add(self, repo)
5546    }
5547
5548    /// Removes a repository.
5549    ///
5550    /// Removing a repository will prevent future packages from being cached from this repository,
5551    /// but in-flight downloads may not be interrupted.
5552    ///
5553    /// + request `repo_url` the URL of the repository we want to remove.
5554    /// * error a zx_status value indicating failure. One of the following:
5555    ///     * `ZX_ERR_ACCESS_DENIED` if editing repositories is permanently disabled or the
5556    ///       `repo_url` matches a static repository.
5557    ///     * `ZX_ERR_INVALID_ARGS` if the `repo_url` is malformed.
5558    ///     * `ZX_ERR_NOT_FOUND` if the repository does not exist.
5559    pub fn r#remove(
5560        &self,
5561        mut repo_url: &str,
5562    ) -> fidl::client::QueryResponseFut<
5563        RepositoryManagerRemoveResult,
5564        fdomain_client::fidl::FDomainResourceDialect,
5565    > {
5566        RepositoryManagerProxyInterface::r#remove(self, repo_url)
5567    }
5568
5569    /// Adds a mirror to a repository. This will overwrite the mirror if it already exists.
5570    ///
5571    /// + request `repo_url` the URL of the repository to add the mirror to.
5572    /// + request `mirror` the mirror config used to add the mirror.
5573    /// * error a zx_status value indicating failure. One of the following:
5574    ///     * `ZX_ERR_ALREADY_EXISTS` if the mirror for this repository already exists.
5575    ///     * `ZX_ERR_INVALID_ARGS` if the `repo_url` or the `mirror` is malformed.
5576    ///     * `ZX_ERR_NOT_FOUND` if the repository does not exist.
5577    pub fn r#add_mirror(
5578        &self,
5579        mut repo_url: &str,
5580        mut mirror: &MirrorConfig,
5581    ) -> fidl::client::QueryResponseFut<
5582        RepositoryManagerAddMirrorResult,
5583        fdomain_client::fidl::FDomainResourceDialect,
5584    > {
5585        RepositoryManagerProxyInterface::r#add_mirror(self, repo_url, mirror)
5586    }
5587
5588    /// Removes a mirror from a repository.
5589    ///
5590    /// Removing a mirror will prevent future packages from being cached from that mirror, but
5591    /// in-flight downloads may not be interrupted.
5592    ///
5593    /// + request `repo_url` the URL of the mirror's repository.
5594    /// + request `mirror_url` the URL of the mirror we want to remove.
5595    /// * error a zx_status value indicating failure. One of the following:
5596    ///     * `ZX_ERR_INVALID_ARGS` if the `repo_url` or the `mirror_url` is malformed.
5597    ///     * `ZX_ERR_NOT_FOUND` if the repository or mirror does not exist.
5598    pub fn r#remove_mirror(
5599        &self,
5600        mut repo_url: &str,
5601        mut mirror_url: &str,
5602    ) -> fidl::client::QueryResponseFut<
5603        RepositoryManagerRemoveMirrorResult,
5604        fdomain_client::fidl::FDomainResourceDialect,
5605    > {
5606        RepositoryManagerProxyInterface::r#remove_mirror(self, repo_url, mirror_url)
5607    }
5608
5609    /// Returns an iterator over all repositories.
5610    ///
5611    /// + request `iterator` a request for an iterator.
5612    pub fn r#list(
5613        &self,
5614        mut iterator: fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>,
5615    ) -> Result<(), fidl::Error> {
5616        RepositoryManagerProxyInterface::r#list(self, iterator)
5617    }
5618}
5619
5620impl RepositoryManagerProxyInterface for RepositoryManagerProxy {
5621    type AddResponseFut = fidl::client::QueryResponseFut<
5622        RepositoryManagerAddResult,
5623        fdomain_client::fidl::FDomainResourceDialect,
5624    >;
5625    fn r#add(&self, mut repo: &RepositoryConfig) -> Self::AddResponseFut {
5626        fn _decode(
5627            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
5628        ) -> Result<RepositoryManagerAddResult, fidl::Error> {
5629            let _response = fidl::client::decode_transaction_body::<
5630                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>,
5631                fdomain_client::fidl::FDomainResourceDialect,
5632                0x7fff4b8c733c7151,
5633            >(_buf?)?;
5634            Ok(_response.map(|x| x))
5635        }
5636        self.client
5637            .send_query_and_decode::<RepositoryManagerAddRequest, RepositoryManagerAddResult>(
5638                (repo,),
5639                0x7fff4b8c733c7151,
5640                fidl::encoding::DynamicFlags::empty(),
5641                _decode,
5642            )
5643    }
5644
5645    type RemoveResponseFut = fidl::client::QueryResponseFut<
5646        RepositoryManagerRemoveResult,
5647        fdomain_client::fidl::FDomainResourceDialect,
5648    >;
5649    fn r#remove(&self, mut repo_url: &str) -> Self::RemoveResponseFut {
5650        fn _decode(
5651            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
5652        ) -> Result<RepositoryManagerRemoveResult, fidl::Error> {
5653            let _response = fidl::client::decode_transaction_body::<
5654                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>,
5655                fdomain_client::fidl::FDomainResourceDialect,
5656                0x5de23dc0e0dea4ba,
5657            >(_buf?)?;
5658            Ok(_response.map(|x| x))
5659        }
5660        self.client
5661            .send_query_and_decode::<RepositoryManagerRemoveRequest, RepositoryManagerRemoveResult>(
5662                (repo_url,),
5663                0x5de23dc0e0dea4ba,
5664                fidl::encoding::DynamicFlags::empty(),
5665                _decode,
5666            )
5667    }
5668
5669    type AddMirrorResponseFut = fidl::client::QueryResponseFut<
5670        RepositoryManagerAddMirrorResult,
5671        fdomain_client::fidl::FDomainResourceDialect,
5672    >;
5673    fn r#add_mirror(
5674        &self,
5675        mut repo_url: &str,
5676        mut mirror: &MirrorConfig,
5677    ) -> Self::AddMirrorResponseFut {
5678        fn _decode(
5679            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
5680        ) -> Result<RepositoryManagerAddMirrorResult, fidl::Error> {
5681            let _response = fidl::client::decode_transaction_body::<
5682                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>,
5683                fdomain_client::fidl::FDomainResourceDialect,
5684                0x3b7ef213730dd24c,
5685            >(_buf?)?;
5686            Ok(_response.map(|x| x))
5687        }
5688        self.client.send_query_and_decode::<
5689            RepositoryManagerAddMirrorRequest,
5690            RepositoryManagerAddMirrorResult,
5691        >(
5692            (repo_url, mirror,),
5693            0x3b7ef213730dd24c,
5694            fidl::encoding::DynamicFlags::empty(),
5695            _decode,
5696        )
5697    }
5698
5699    type RemoveMirrorResponseFut = fidl::client::QueryResponseFut<
5700        RepositoryManagerRemoveMirrorResult,
5701        fdomain_client::fidl::FDomainResourceDialect,
5702    >;
5703    fn r#remove_mirror(
5704        &self,
5705        mut repo_url: &str,
5706        mut mirror_url: &str,
5707    ) -> Self::RemoveMirrorResponseFut {
5708        fn _decode(
5709            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
5710        ) -> Result<RepositoryManagerRemoveMirrorResult, fidl::Error> {
5711            let _response = fidl::client::decode_transaction_body::<
5712                fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>,
5713                fdomain_client::fidl::FDomainResourceDialect,
5714                0x4682584cc47c23a2,
5715            >(_buf?)?;
5716            Ok(_response.map(|x| x))
5717        }
5718        self.client.send_query_and_decode::<
5719            RepositoryManagerRemoveMirrorRequest,
5720            RepositoryManagerRemoveMirrorResult,
5721        >(
5722            (repo_url, mirror_url,),
5723            0x4682584cc47c23a2,
5724            fidl::encoding::DynamicFlags::empty(),
5725            _decode,
5726        )
5727    }
5728
5729    fn r#list(
5730        &self,
5731        mut iterator: fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>,
5732    ) -> Result<(), fidl::Error> {
5733        self.client.send::<RepositoryManagerListRequest>(
5734            (iterator,),
5735            0x61837314ba6f4afb,
5736            fidl::encoding::DynamicFlags::empty(),
5737        )
5738    }
5739}
5740
5741pub struct RepositoryManagerEventStream {
5742    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
5743}
5744
5745impl std::marker::Unpin for RepositoryManagerEventStream {}
5746
5747impl futures::stream::FusedStream for RepositoryManagerEventStream {
5748    fn is_terminated(&self) -> bool {
5749        self.event_receiver.is_terminated()
5750    }
5751}
5752
5753impl futures::Stream for RepositoryManagerEventStream {
5754    type Item = Result<RepositoryManagerEvent, fidl::Error>;
5755
5756    fn poll_next(
5757        mut self: std::pin::Pin<&mut Self>,
5758        cx: &mut std::task::Context<'_>,
5759    ) -> std::task::Poll<Option<Self::Item>> {
5760        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
5761            &mut self.event_receiver,
5762            cx
5763        )?) {
5764            Some(buf) => std::task::Poll::Ready(Some(RepositoryManagerEvent::decode(buf))),
5765            None => std::task::Poll::Ready(None),
5766        }
5767    }
5768}
5769
5770#[derive(Debug)]
5771pub enum RepositoryManagerEvent {}
5772
5773impl RepositoryManagerEvent {
5774    /// Decodes a message buffer as a [`RepositoryManagerEvent`].
5775    fn decode(
5776        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
5777    ) -> Result<RepositoryManagerEvent, fidl::Error> {
5778        let (bytes, _handles) = buf.split_mut();
5779        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
5780        debug_assert_eq!(tx_header.tx_id, 0);
5781        match tx_header.ordinal {
5782            _ => Err(fidl::Error::UnknownOrdinal {
5783                ordinal: tx_header.ordinal,
5784                protocol_name:
5785                    <RepositoryManagerMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
5786            }),
5787        }
5788    }
5789}
5790
5791/// A Stream of incoming requests for fuchsia.pkg/RepositoryManager.
5792pub struct RepositoryManagerRequestStream {
5793    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
5794    is_terminated: bool,
5795}
5796
5797impl std::marker::Unpin for RepositoryManagerRequestStream {}
5798
5799impl futures::stream::FusedStream for RepositoryManagerRequestStream {
5800    fn is_terminated(&self) -> bool {
5801        self.is_terminated
5802    }
5803}
5804
5805impl fdomain_client::fidl::RequestStream for RepositoryManagerRequestStream {
5806    type Protocol = RepositoryManagerMarker;
5807    type ControlHandle = RepositoryManagerControlHandle;
5808
5809    fn from_channel(channel: fdomain_client::Channel) -> Self {
5810        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
5811    }
5812
5813    fn control_handle(&self) -> Self::ControlHandle {
5814        RepositoryManagerControlHandle { inner: self.inner.clone() }
5815    }
5816
5817    fn into_inner(
5818        self,
5819    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
5820    {
5821        (self.inner, self.is_terminated)
5822    }
5823
5824    fn from_inner(
5825        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
5826        is_terminated: bool,
5827    ) -> Self {
5828        Self { inner, is_terminated }
5829    }
5830}
5831
5832impl futures::Stream for RepositoryManagerRequestStream {
5833    type Item = Result<RepositoryManagerRequest, fidl::Error>;
5834
5835    fn poll_next(
5836        mut self: std::pin::Pin<&mut Self>,
5837        cx: &mut std::task::Context<'_>,
5838    ) -> std::task::Poll<Option<Self::Item>> {
5839        let this = &mut *self;
5840        if this.inner.check_shutdown(cx) {
5841            this.is_terminated = true;
5842            return std::task::Poll::Ready(None);
5843        }
5844        if this.is_terminated {
5845            panic!("polled RepositoryManagerRequestStream after completion");
5846        }
5847        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
5848            |bytes, handles| {
5849                match this.inner.channel().read_etc(cx, bytes, handles) {
5850                    std::task::Poll::Ready(Ok(())) => {}
5851                    std::task::Poll::Pending => return std::task::Poll::Pending,
5852                    std::task::Poll::Ready(Err(None)) => {
5853                        this.is_terminated = true;
5854                        return std::task::Poll::Ready(None);
5855                    }
5856                    std::task::Poll::Ready(Err(Some(e))) => {
5857                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
5858                            e.into(),
5859                        ))));
5860                    }
5861                }
5862
5863                // A message has been received from the channel
5864                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
5865
5866                std::task::Poll::Ready(Some(match header.ordinal {
5867                0x7fff4b8c733c7151 => {
5868                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
5869                    let mut req = fidl::new_empty!(RepositoryManagerAddRequest, fdomain_client::fidl::FDomainResourceDialect);
5870                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<RepositoryManagerAddRequest>(&header, _body_bytes, handles, &mut req)?;
5871                    let control_handle = RepositoryManagerControlHandle {
5872                        inner: this.inner.clone(),
5873                    };
5874                    Ok(RepositoryManagerRequest::Add {repo: req.repo,
5875
5876                        responder: RepositoryManagerAddResponder {
5877                            control_handle: std::mem::ManuallyDrop::new(control_handle),
5878                            tx_id: header.tx_id,
5879                        },
5880                    })
5881                }
5882                0x5de23dc0e0dea4ba => {
5883                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
5884                    let mut req = fidl::new_empty!(RepositoryManagerRemoveRequest, fdomain_client::fidl::FDomainResourceDialect);
5885                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<RepositoryManagerRemoveRequest>(&header, _body_bytes, handles, &mut req)?;
5886                    let control_handle = RepositoryManagerControlHandle {
5887                        inner: this.inner.clone(),
5888                    };
5889                    Ok(RepositoryManagerRequest::Remove {repo_url: req.repo_url,
5890
5891                        responder: RepositoryManagerRemoveResponder {
5892                            control_handle: std::mem::ManuallyDrop::new(control_handle),
5893                            tx_id: header.tx_id,
5894                        },
5895                    })
5896                }
5897                0x3b7ef213730dd24c => {
5898                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
5899                    let mut req = fidl::new_empty!(RepositoryManagerAddMirrorRequest, fdomain_client::fidl::FDomainResourceDialect);
5900                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<RepositoryManagerAddMirrorRequest>(&header, _body_bytes, handles, &mut req)?;
5901                    let control_handle = RepositoryManagerControlHandle {
5902                        inner: this.inner.clone(),
5903                    };
5904                    Ok(RepositoryManagerRequest::AddMirror {repo_url: req.repo_url,
5905mirror: req.mirror,
5906
5907                        responder: RepositoryManagerAddMirrorResponder {
5908                            control_handle: std::mem::ManuallyDrop::new(control_handle),
5909                            tx_id: header.tx_id,
5910                        },
5911                    })
5912                }
5913                0x4682584cc47c23a2 => {
5914                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
5915                    let mut req = fidl::new_empty!(RepositoryManagerRemoveMirrorRequest, fdomain_client::fidl::FDomainResourceDialect);
5916                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<RepositoryManagerRemoveMirrorRequest>(&header, _body_bytes, handles, &mut req)?;
5917                    let control_handle = RepositoryManagerControlHandle {
5918                        inner: this.inner.clone(),
5919                    };
5920                    Ok(RepositoryManagerRequest::RemoveMirror {repo_url: req.repo_url,
5921mirror_url: req.mirror_url,
5922
5923                        responder: RepositoryManagerRemoveMirrorResponder {
5924                            control_handle: std::mem::ManuallyDrop::new(control_handle),
5925                            tx_id: header.tx_id,
5926                        },
5927                    })
5928                }
5929                0x61837314ba6f4afb => {
5930                    header.validate_request_tx_id(fidl::MethodType::OneWay)?;
5931                    let mut req = fidl::new_empty!(RepositoryManagerListRequest, fdomain_client::fidl::FDomainResourceDialect);
5932                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<RepositoryManagerListRequest>(&header, _body_bytes, handles, &mut req)?;
5933                    let control_handle = RepositoryManagerControlHandle {
5934                        inner: this.inner.clone(),
5935                    };
5936                    Ok(RepositoryManagerRequest::List {iterator: req.iterator,
5937
5938                        control_handle,
5939                    })
5940                }
5941                _ => Err(fidl::Error::UnknownOrdinal {
5942                    ordinal: header.ordinal,
5943                    protocol_name: <RepositoryManagerMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
5944                }),
5945            }))
5946            },
5947        )
5948    }
5949}
5950
5951/// This manages package repositories.
5952///
5953/// This is intended to be implemented by package resolver components, and used by
5954/// repository administration tools.
5955#[derive(Debug)]
5956pub enum RepositoryManagerRequest {
5957    /// Adds a repository. This will overwrite the repository if it already exists.
5958    ///
5959    /// + request `repo` a repository to add to the resolver.
5960    /// * error a zx_status value indicating failure. One of the following:
5961    ///     * `ZX_ERR_ACCESS_DENIED` if editing repositories is permanently disabled.
5962    ///     * `ZX_ERR_ALREADY_EXISTS` if the repository already exists.
5963    ///     * `ZX_ERR_INVALID_ARGS` if the repository is malformed.
5964    Add { repo: RepositoryConfig, responder: RepositoryManagerAddResponder },
5965    /// Removes a repository.
5966    ///
5967    /// Removing a repository will prevent future packages from being cached from this repository,
5968    /// but in-flight downloads may not be interrupted.
5969    ///
5970    /// + request `repo_url` the URL of the repository we want to remove.
5971    /// * error a zx_status value indicating failure. One of the following:
5972    ///     * `ZX_ERR_ACCESS_DENIED` if editing repositories is permanently disabled or the
5973    ///       `repo_url` matches a static repository.
5974    ///     * `ZX_ERR_INVALID_ARGS` if the `repo_url` is malformed.
5975    ///     * `ZX_ERR_NOT_FOUND` if the repository does not exist.
5976    Remove { repo_url: String, responder: RepositoryManagerRemoveResponder },
5977    /// Adds a mirror to a repository. This will overwrite the mirror if it already exists.
5978    ///
5979    /// + request `repo_url` the URL of the repository to add the mirror to.
5980    /// + request `mirror` the mirror config used to add the mirror.
5981    /// * error a zx_status value indicating failure. One of the following:
5982    ///     * `ZX_ERR_ALREADY_EXISTS` if the mirror for this repository already exists.
5983    ///     * `ZX_ERR_INVALID_ARGS` if the `repo_url` or the `mirror` is malformed.
5984    ///     * `ZX_ERR_NOT_FOUND` if the repository does not exist.
5985    AddMirror {
5986        repo_url: String,
5987        mirror: MirrorConfig,
5988        responder: RepositoryManagerAddMirrorResponder,
5989    },
5990    /// Removes a mirror from a repository.
5991    ///
5992    /// Removing a mirror will prevent future packages from being cached from that mirror, but
5993    /// in-flight downloads may not be interrupted.
5994    ///
5995    /// + request `repo_url` the URL of the mirror's repository.
5996    /// + request `mirror_url` the URL of the mirror we want to remove.
5997    /// * error a zx_status value indicating failure. One of the following:
5998    ///     * `ZX_ERR_INVALID_ARGS` if the `repo_url` or the `mirror_url` is malformed.
5999    ///     * `ZX_ERR_NOT_FOUND` if the repository or mirror does not exist.
6000    RemoveMirror {
6001        repo_url: String,
6002        mirror_url: String,
6003        responder: RepositoryManagerRemoveMirrorResponder,
6004    },
6005    /// Returns an iterator over all repositories.
6006    ///
6007    /// + request `iterator` a request for an iterator.
6008    List {
6009        iterator: fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>,
6010        control_handle: RepositoryManagerControlHandle,
6011    },
6012}
6013
6014impl RepositoryManagerRequest {
6015    #[allow(irrefutable_let_patterns)]
6016    pub fn into_add(self) -> Option<(RepositoryConfig, RepositoryManagerAddResponder)> {
6017        if let RepositoryManagerRequest::Add { repo, responder } = self {
6018            Some((repo, responder))
6019        } else {
6020            None
6021        }
6022    }
6023
6024    #[allow(irrefutable_let_patterns)]
6025    pub fn into_remove(self) -> Option<(String, RepositoryManagerRemoveResponder)> {
6026        if let RepositoryManagerRequest::Remove { repo_url, responder } = self {
6027            Some((repo_url, responder))
6028        } else {
6029            None
6030        }
6031    }
6032
6033    #[allow(irrefutable_let_patterns)]
6034    pub fn into_add_mirror(
6035        self,
6036    ) -> Option<(String, MirrorConfig, RepositoryManagerAddMirrorResponder)> {
6037        if let RepositoryManagerRequest::AddMirror { repo_url, mirror, responder } = self {
6038            Some((repo_url, mirror, responder))
6039        } else {
6040            None
6041        }
6042    }
6043
6044    #[allow(irrefutable_let_patterns)]
6045    pub fn into_remove_mirror(
6046        self,
6047    ) -> Option<(String, String, RepositoryManagerRemoveMirrorResponder)> {
6048        if let RepositoryManagerRequest::RemoveMirror { repo_url, mirror_url, responder } = self {
6049            Some((repo_url, mirror_url, responder))
6050        } else {
6051            None
6052        }
6053    }
6054
6055    #[allow(irrefutable_let_patterns)]
6056    pub fn into_list(
6057        self,
6058    ) -> Option<(
6059        fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>,
6060        RepositoryManagerControlHandle,
6061    )> {
6062        if let RepositoryManagerRequest::List { iterator, control_handle } = self {
6063            Some((iterator, control_handle))
6064        } else {
6065            None
6066        }
6067    }
6068
6069    /// Name of the method defined in FIDL
6070    pub fn method_name(&self) -> &'static str {
6071        match *self {
6072            RepositoryManagerRequest::Add { .. } => "add",
6073            RepositoryManagerRequest::Remove { .. } => "remove",
6074            RepositoryManagerRequest::AddMirror { .. } => "add_mirror",
6075            RepositoryManagerRequest::RemoveMirror { .. } => "remove_mirror",
6076            RepositoryManagerRequest::List { .. } => "list",
6077        }
6078    }
6079}
6080
6081#[derive(Debug, Clone)]
6082pub struct RepositoryManagerControlHandle {
6083    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
6084}
6085
6086impl fdomain_client::fidl::ControlHandle for RepositoryManagerControlHandle {
6087    fn shutdown(&self) {
6088        self.inner.shutdown()
6089    }
6090
6091    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
6092        self.inner.shutdown_with_epitaph(status)
6093    }
6094
6095    fn is_closed(&self) -> bool {
6096        self.inner.channel().is_closed()
6097    }
6098    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
6099        self.inner.channel().on_closed()
6100    }
6101}
6102
6103impl RepositoryManagerControlHandle {}
6104
6105#[must_use = "FIDL methods require a response to be sent"]
6106#[derive(Debug)]
6107pub struct RepositoryManagerAddResponder {
6108    control_handle: std::mem::ManuallyDrop<RepositoryManagerControlHandle>,
6109    tx_id: u32,
6110}
6111
6112/// Set the the channel to be shutdown (see [`RepositoryManagerControlHandle::shutdown`])
6113/// if the responder is dropped without sending a response, so that the client
6114/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
6115impl std::ops::Drop for RepositoryManagerAddResponder {
6116    fn drop(&mut self) {
6117        self.control_handle.shutdown();
6118        // Safety: drops once, never accessed again
6119        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6120    }
6121}
6122
6123impl fdomain_client::fidl::Responder for RepositoryManagerAddResponder {
6124    type ControlHandle = RepositoryManagerControlHandle;
6125
6126    fn control_handle(&self) -> &RepositoryManagerControlHandle {
6127        &self.control_handle
6128    }
6129
6130    fn drop_without_shutdown(mut self) {
6131        // Safety: drops once, never accessed again due to mem::forget
6132        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6133        // Prevent Drop from running (which would shut down the channel)
6134        std::mem::forget(self);
6135    }
6136}
6137
6138impl RepositoryManagerAddResponder {
6139    /// Sends a response to the FIDL transaction.
6140    ///
6141    /// Sets the channel to shutdown if an error occurs.
6142    pub fn send(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6143        let _result = self.send_raw(result);
6144        if _result.is_err() {
6145            self.control_handle.shutdown();
6146        }
6147        self.drop_without_shutdown();
6148        _result
6149    }
6150
6151    /// Similar to "send" but does not shutdown the channel if an error occurs.
6152    pub fn send_no_shutdown_on_err(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6153        let _result = self.send_raw(result);
6154        self.drop_without_shutdown();
6155        _result
6156    }
6157
6158    fn send_raw(&self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6159        self.control_handle
6160            .inner
6161            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>>(
6162                result,
6163                self.tx_id,
6164                0x7fff4b8c733c7151,
6165                fidl::encoding::DynamicFlags::empty(),
6166            )
6167    }
6168}
6169
6170#[must_use = "FIDL methods require a response to be sent"]
6171#[derive(Debug)]
6172pub struct RepositoryManagerRemoveResponder {
6173    control_handle: std::mem::ManuallyDrop<RepositoryManagerControlHandle>,
6174    tx_id: u32,
6175}
6176
6177/// Set the the channel to be shutdown (see [`RepositoryManagerControlHandle::shutdown`])
6178/// if the responder is dropped without sending a response, so that the client
6179/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
6180impl std::ops::Drop for RepositoryManagerRemoveResponder {
6181    fn drop(&mut self) {
6182        self.control_handle.shutdown();
6183        // Safety: drops once, never accessed again
6184        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6185    }
6186}
6187
6188impl fdomain_client::fidl::Responder for RepositoryManagerRemoveResponder {
6189    type ControlHandle = RepositoryManagerControlHandle;
6190
6191    fn control_handle(&self) -> &RepositoryManagerControlHandle {
6192        &self.control_handle
6193    }
6194
6195    fn drop_without_shutdown(mut self) {
6196        // Safety: drops once, never accessed again due to mem::forget
6197        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6198        // Prevent Drop from running (which would shut down the channel)
6199        std::mem::forget(self);
6200    }
6201}
6202
6203impl RepositoryManagerRemoveResponder {
6204    /// Sends a response to the FIDL transaction.
6205    ///
6206    /// Sets the channel to shutdown if an error occurs.
6207    pub fn send(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6208        let _result = self.send_raw(result);
6209        if _result.is_err() {
6210            self.control_handle.shutdown();
6211        }
6212        self.drop_without_shutdown();
6213        _result
6214    }
6215
6216    /// Similar to "send" but does not shutdown the channel if an error occurs.
6217    pub fn send_no_shutdown_on_err(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6218        let _result = self.send_raw(result);
6219        self.drop_without_shutdown();
6220        _result
6221    }
6222
6223    fn send_raw(&self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6224        self.control_handle
6225            .inner
6226            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>>(
6227                result,
6228                self.tx_id,
6229                0x5de23dc0e0dea4ba,
6230                fidl::encoding::DynamicFlags::empty(),
6231            )
6232    }
6233}
6234
6235#[must_use = "FIDL methods require a response to be sent"]
6236#[derive(Debug)]
6237pub struct RepositoryManagerAddMirrorResponder {
6238    control_handle: std::mem::ManuallyDrop<RepositoryManagerControlHandle>,
6239    tx_id: u32,
6240}
6241
6242/// Set the the channel to be shutdown (see [`RepositoryManagerControlHandle::shutdown`])
6243/// if the responder is dropped without sending a response, so that the client
6244/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
6245impl std::ops::Drop for RepositoryManagerAddMirrorResponder {
6246    fn drop(&mut self) {
6247        self.control_handle.shutdown();
6248        // Safety: drops once, never accessed again
6249        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6250    }
6251}
6252
6253impl fdomain_client::fidl::Responder for RepositoryManagerAddMirrorResponder {
6254    type ControlHandle = RepositoryManagerControlHandle;
6255
6256    fn control_handle(&self) -> &RepositoryManagerControlHandle {
6257        &self.control_handle
6258    }
6259
6260    fn drop_without_shutdown(mut self) {
6261        // Safety: drops once, never accessed again due to mem::forget
6262        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6263        // Prevent Drop from running (which would shut down the channel)
6264        std::mem::forget(self);
6265    }
6266}
6267
6268impl RepositoryManagerAddMirrorResponder {
6269    /// Sends a response to the FIDL transaction.
6270    ///
6271    /// Sets the channel to shutdown if an error occurs.
6272    pub fn send(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6273        let _result = self.send_raw(result);
6274        if _result.is_err() {
6275            self.control_handle.shutdown();
6276        }
6277        self.drop_without_shutdown();
6278        _result
6279    }
6280
6281    /// Similar to "send" but does not shutdown the channel if an error occurs.
6282    pub fn send_no_shutdown_on_err(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6283        let _result = self.send_raw(result);
6284        self.drop_without_shutdown();
6285        _result
6286    }
6287
6288    fn send_raw(&self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6289        self.control_handle
6290            .inner
6291            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>>(
6292                result,
6293                self.tx_id,
6294                0x3b7ef213730dd24c,
6295                fidl::encoding::DynamicFlags::empty(),
6296            )
6297    }
6298}
6299
6300#[must_use = "FIDL methods require a response to be sent"]
6301#[derive(Debug)]
6302pub struct RepositoryManagerRemoveMirrorResponder {
6303    control_handle: std::mem::ManuallyDrop<RepositoryManagerControlHandle>,
6304    tx_id: u32,
6305}
6306
6307/// Set the the channel to be shutdown (see [`RepositoryManagerControlHandle::shutdown`])
6308/// if the responder is dropped without sending a response, so that the client
6309/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
6310impl std::ops::Drop for RepositoryManagerRemoveMirrorResponder {
6311    fn drop(&mut self) {
6312        self.control_handle.shutdown();
6313        // Safety: drops once, never accessed again
6314        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6315    }
6316}
6317
6318impl fdomain_client::fidl::Responder for RepositoryManagerRemoveMirrorResponder {
6319    type ControlHandle = RepositoryManagerControlHandle;
6320
6321    fn control_handle(&self) -> &RepositoryManagerControlHandle {
6322        &self.control_handle
6323    }
6324
6325    fn drop_without_shutdown(mut self) {
6326        // Safety: drops once, never accessed again due to mem::forget
6327        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6328        // Prevent Drop from running (which would shut down the channel)
6329        std::mem::forget(self);
6330    }
6331}
6332
6333impl RepositoryManagerRemoveMirrorResponder {
6334    /// Sends a response to the FIDL transaction.
6335    ///
6336    /// Sets the channel to shutdown if an error occurs.
6337    pub fn send(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6338        let _result = self.send_raw(result);
6339        if _result.is_err() {
6340            self.control_handle.shutdown();
6341        }
6342        self.drop_without_shutdown();
6343        _result
6344    }
6345
6346    /// Similar to "send" but does not shutdown the channel if an error occurs.
6347    pub fn send_no_shutdown_on_err(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6348        let _result = self.send_raw(result);
6349        self.drop_without_shutdown();
6350        _result
6351    }
6352
6353    fn send_raw(&self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
6354        self.control_handle
6355            .inner
6356            .send::<fidl::encoding::ResultType<fidl::encoding::EmptyStruct, i32>>(
6357                result,
6358                self.tx_id,
6359                0x4682584cc47c23a2,
6360                fidl::encoding::DynamicFlags::empty(),
6361            )
6362    }
6363}
6364
6365#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
6366pub struct RetainedBlobsMarker;
6367
6368impl fdomain_client::fidl::ProtocolMarker for RetainedBlobsMarker {
6369    type Proxy = RetainedBlobsProxy;
6370    type RequestStream = RetainedBlobsRequestStream;
6371
6372    const DEBUG_NAME: &'static str = "fuchsia.pkg.RetainedBlobs";
6373}
6374impl fdomain_client::fidl::DiscoverableProtocolMarker for RetainedBlobsMarker {}
6375
6376pub trait RetainedBlobsProxyInterface: Send + Sync {
6377    type ClearResponseFut: std::future::Future<Output = Result<(), fidl::Error>> + Send;
6378    fn r#clear(&self) -> Self::ClearResponseFut;
6379    type ReplaceResponseFut: std::future::Future<Output = Result<(), fidl::Error>> + Send;
6380    fn r#replace(
6381        &self,
6382        iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
6383    ) -> Self::ReplaceResponseFut;
6384}
6385
6386#[derive(Debug, Clone)]
6387pub struct RetainedBlobsProxy {
6388    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
6389}
6390
6391impl fdomain_client::fidl::Proxy for RetainedBlobsProxy {
6392    type Protocol = RetainedBlobsMarker;
6393
6394    fn from_channel(inner: fdomain_client::Channel) -> Self {
6395        Self::new(inner)
6396    }
6397
6398    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
6399        self.client.into_channel().map_err(|client| Self { client })
6400    }
6401
6402    fn as_channel(&self) -> &fdomain_client::Channel {
6403        self.client.as_channel()
6404    }
6405}
6406
6407impl RetainedBlobsProxy {
6408    /// Create a new Proxy for fuchsia.pkg/RetainedBlobs.
6409    pub fn new(channel: fdomain_client::Channel) -> Self {
6410        let protocol_name =
6411            <RetainedBlobsMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
6412        Self { client: fidl::client::Client::new(channel, protocol_name) }
6413    }
6414
6415    /// Get a Stream of events from the remote end of the protocol.
6416    ///
6417    /// # Panics
6418    ///
6419    /// Panics if the event stream was already taken.
6420    pub fn take_event_stream(&self) -> RetainedBlobsEventStream {
6421        RetainedBlobsEventStream { event_receiver: self.client.take_event_receiver() }
6422    }
6423
6424    /// Atomically clear the retained blob set, releasing any previously
6425    /// retained blobs.
6426    pub fn r#clear(
6427        &self,
6428    ) -> fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect> {
6429        RetainedBlobsProxyInterface::r#clear(self)
6430    }
6431
6432    /// Atomically replace the retained blob set with the blob hashes
6433    /// provided by the given iterator.
6434    /// Duplicate IDs provided will be merged and processed as a single one.
6435    ///
6436    /// + request `iterator` an iterator of blob IDs that should be
6437    ///   retained.
6438    pub fn r#replace(
6439        &self,
6440        mut iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
6441    ) -> fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect> {
6442        RetainedBlobsProxyInterface::r#replace(self, iterator)
6443    }
6444}
6445
6446impl RetainedBlobsProxyInterface for RetainedBlobsProxy {
6447    type ClearResponseFut =
6448        fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect>;
6449    fn r#clear(&self) -> Self::ClearResponseFut {
6450        fn _decode(
6451            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
6452        ) -> Result<(), fidl::Error> {
6453            let _response = fidl::client::decode_transaction_body::<
6454                fidl::encoding::EmptyPayload,
6455                fdomain_client::fidl::FDomainResourceDialect,
6456                0x3005cab30c671164,
6457            >(_buf?)?;
6458            Ok(_response)
6459        }
6460        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, ()>(
6461            (),
6462            0x3005cab30c671164,
6463            fidl::encoding::DynamicFlags::empty(),
6464            _decode,
6465        )
6466    }
6467
6468    type ReplaceResponseFut =
6469        fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect>;
6470    fn r#replace(
6471        &self,
6472        mut iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
6473    ) -> Self::ReplaceResponseFut {
6474        fn _decode(
6475            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
6476        ) -> Result<(), fidl::Error> {
6477            let _response = fidl::client::decode_transaction_body::<
6478                fidl::encoding::EmptyPayload,
6479                fdomain_client::fidl::FDomainResourceDialect,
6480                0x2c049d51026cd0b3,
6481            >(_buf?)?;
6482            Ok(_response)
6483        }
6484        self.client.send_query_and_decode::<RetainedBlobsReplaceRequest, ()>(
6485            (iterator,),
6486            0x2c049d51026cd0b3,
6487            fidl::encoding::DynamicFlags::empty(),
6488            _decode,
6489        )
6490    }
6491}
6492
6493pub struct RetainedBlobsEventStream {
6494    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
6495}
6496
6497impl std::marker::Unpin for RetainedBlobsEventStream {}
6498
6499impl futures::stream::FusedStream for RetainedBlobsEventStream {
6500    fn is_terminated(&self) -> bool {
6501        self.event_receiver.is_terminated()
6502    }
6503}
6504
6505impl futures::Stream for RetainedBlobsEventStream {
6506    type Item = Result<RetainedBlobsEvent, fidl::Error>;
6507
6508    fn poll_next(
6509        mut self: std::pin::Pin<&mut Self>,
6510        cx: &mut std::task::Context<'_>,
6511    ) -> std::task::Poll<Option<Self::Item>> {
6512        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
6513            &mut self.event_receiver,
6514            cx
6515        )?) {
6516            Some(buf) => std::task::Poll::Ready(Some(RetainedBlobsEvent::decode(buf))),
6517            None => std::task::Poll::Ready(None),
6518        }
6519    }
6520}
6521
6522#[derive(Debug)]
6523pub enum RetainedBlobsEvent {}
6524
6525impl RetainedBlobsEvent {
6526    /// Decodes a message buffer as a [`RetainedBlobsEvent`].
6527    fn decode(
6528        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
6529    ) -> Result<RetainedBlobsEvent, fidl::Error> {
6530        let (bytes, _handles) = buf.split_mut();
6531        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
6532        debug_assert_eq!(tx_header.tx_id, 0);
6533        match tx_header.ordinal {
6534            _ => Err(fidl::Error::UnknownOrdinal {
6535                ordinal: tx_header.ordinal,
6536                protocol_name:
6537                    <RetainedBlobsMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
6538            }),
6539        }
6540    }
6541}
6542
6543/// A Stream of incoming requests for fuchsia.pkg/RetainedBlobs.
6544pub struct RetainedBlobsRequestStream {
6545    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
6546    is_terminated: bool,
6547}
6548
6549impl std::marker::Unpin for RetainedBlobsRequestStream {}
6550
6551impl futures::stream::FusedStream for RetainedBlobsRequestStream {
6552    fn is_terminated(&self) -> bool {
6553        self.is_terminated
6554    }
6555}
6556
6557impl fdomain_client::fidl::RequestStream for RetainedBlobsRequestStream {
6558    type Protocol = RetainedBlobsMarker;
6559    type ControlHandle = RetainedBlobsControlHandle;
6560
6561    fn from_channel(channel: fdomain_client::Channel) -> Self {
6562        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
6563    }
6564
6565    fn control_handle(&self) -> Self::ControlHandle {
6566        RetainedBlobsControlHandle { inner: self.inner.clone() }
6567    }
6568
6569    fn into_inner(
6570        self,
6571    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
6572    {
6573        (self.inner, self.is_terminated)
6574    }
6575
6576    fn from_inner(
6577        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
6578        is_terminated: bool,
6579    ) -> Self {
6580        Self { inner, is_terminated }
6581    }
6582}
6583
6584impl futures::Stream for RetainedBlobsRequestStream {
6585    type Item = Result<RetainedBlobsRequest, fidl::Error>;
6586
6587    fn poll_next(
6588        mut self: std::pin::Pin<&mut Self>,
6589        cx: &mut std::task::Context<'_>,
6590    ) -> std::task::Poll<Option<Self::Item>> {
6591        let this = &mut *self;
6592        if this.inner.check_shutdown(cx) {
6593            this.is_terminated = true;
6594            return std::task::Poll::Ready(None);
6595        }
6596        if this.is_terminated {
6597            panic!("polled RetainedBlobsRequestStream after completion");
6598        }
6599        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
6600            |bytes, handles| {
6601                match this.inner.channel().read_etc(cx, bytes, handles) {
6602                    std::task::Poll::Ready(Ok(())) => {}
6603                    std::task::Poll::Pending => return std::task::Poll::Pending,
6604                    std::task::Poll::Ready(Err(None)) => {
6605                        this.is_terminated = true;
6606                        return std::task::Poll::Ready(None);
6607                    }
6608                    std::task::Poll::Ready(Err(Some(e))) => {
6609                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
6610                            e.into(),
6611                        ))));
6612                    }
6613                }
6614
6615                // A message has been received from the channel
6616                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
6617
6618                std::task::Poll::Ready(Some(match header.ordinal {
6619                0x3005cab30c671164 => {
6620                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
6621                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fdomain_client::fidl::FDomainResourceDialect);
6622                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
6623                    let control_handle = RetainedBlobsControlHandle {
6624                        inner: this.inner.clone(),
6625                    };
6626                    Ok(RetainedBlobsRequest::Clear {
6627                        responder: RetainedBlobsClearResponder {
6628                            control_handle: std::mem::ManuallyDrop::new(control_handle),
6629                            tx_id: header.tx_id,
6630                        },
6631                    })
6632                }
6633                0x2c049d51026cd0b3 => {
6634                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
6635                    let mut req = fidl::new_empty!(RetainedBlobsReplaceRequest, fdomain_client::fidl::FDomainResourceDialect);
6636                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<RetainedBlobsReplaceRequest>(&header, _body_bytes, handles, &mut req)?;
6637                    let control_handle = RetainedBlobsControlHandle {
6638                        inner: this.inner.clone(),
6639                    };
6640                    Ok(RetainedBlobsRequest::Replace {iterator: req.iterator,
6641
6642                        responder: RetainedBlobsReplaceResponder {
6643                            control_handle: std::mem::ManuallyDrop::new(control_handle),
6644                            tx_id: header.tx_id,
6645                        },
6646                    })
6647                }
6648                _ => Err(fidl::Error::UnknownOrdinal {
6649                    ordinal: header.ordinal,
6650                    protocol_name: <RetainedBlobsMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
6651                }),
6652            }))
6653            },
6654        )
6655    }
6656}
6657
6658/// Manages the set of retained blobs.
6659///
6660/// Retained blobs will not be removed from the package cache, even if they
6661/// aren't fully present. There is only a single set active at once, and the
6662/// provided APIs for configuring the set atomically replace the retained blobs
6663/// set, it will not affect the retained packages set. On boot, the retained
6664/// blobs set is always initialized to the empty set.
6665/// Documentation on [garbage collection](
6666/// https://fuchsia.dev/fuchsia-src/concepts/packages/garbage_collection) contains
6667/// details on various types of package indexes (static, retained, etc) and
6668/// describes when a blob will be garbage collected or retained.
6669#[derive(Debug)]
6670pub enum RetainedBlobsRequest {
6671    /// Atomically clear the retained blob set, releasing any previously
6672    /// retained blobs.
6673    Clear { responder: RetainedBlobsClearResponder },
6674    /// Atomically replace the retained blob set with the blob hashes
6675    /// provided by the given iterator.
6676    /// Duplicate IDs provided will be merged and processed as a single one.
6677    ///
6678    /// + request `iterator` an iterator of blob IDs that should be
6679    ///   retained.
6680    Replace {
6681        iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
6682        responder: RetainedBlobsReplaceResponder,
6683    },
6684}
6685
6686impl RetainedBlobsRequest {
6687    #[allow(irrefutable_let_patterns)]
6688    pub fn into_clear(self) -> Option<(RetainedBlobsClearResponder)> {
6689        if let RetainedBlobsRequest::Clear { responder } = self { Some((responder)) } else { None }
6690    }
6691
6692    #[allow(irrefutable_let_patterns)]
6693    pub fn into_replace(
6694        self,
6695    ) -> Option<(
6696        fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
6697        RetainedBlobsReplaceResponder,
6698    )> {
6699        if let RetainedBlobsRequest::Replace { iterator, responder } = self {
6700            Some((iterator, responder))
6701        } else {
6702            None
6703        }
6704    }
6705
6706    /// Name of the method defined in FIDL
6707    pub fn method_name(&self) -> &'static str {
6708        match *self {
6709            RetainedBlobsRequest::Clear { .. } => "clear",
6710            RetainedBlobsRequest::Replace { .. } => "replace",
6711        }
6712    }
6713}
6714
6715#[derive(Debug, Clone)]
6716pub struct RetainedBlobsControlHandle {
6717    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
6718}
6719
6720impl fdomain_client::fidl::ControlHandle for RetainedBlobsControlHandle {
6721    fn shutdown(&self) {
6722        self.inner.shutdown()
6723    }
6724
6725    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
6726        self.inner.shutdown_with_epitaph(status)
6727    }
6728
6729    fn is_closed(&self) -> bool {
6730        self.inner.channel().is_closed()
6731    }
6732    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
6733        self.inner.channel().on_closed()
6734    }
6735}
6736
6737impl RetainedBlobsControlHandle {}
6738
6739#[must_use = "FIDL methods require a response to be sent"]
6740#[derive(Debug)]
6741pub struct RetainedBlobsClearResponder {
6742    control_handle: std::mem::ManuallyDrop<RetainedBlobsControlHandle>,
6743    tx_id: u32,
6744}
6745
6746/// Set the the channel to be shutdown (see [`RetainedBlobsControlHandle::shutdown`])
6747/// if the responder is dropped without sending a response, so that the client
6748/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
6749impl std::ops::Drop for RetainedBlobsClearResponder {
6750    fn drop(&mut self) {
6751        self.control_handle.shutdown();
6752        // Safety: drops once, never accessed again
6753        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6754    }
6755}
6756
6757impl fdomain_client::fidl::Responder for RetainedBlobsClearResponder {
6758    type ControlHandle = RetainedBlobsControlHandle;
6759
6760    fn control_handle(&self) -> &RetainedBlobsControlHandle {
6761        &self.control_handle
6762    }
6763
6764    fn drop_without_shutdown(mut self) {
6765        // Safety: drops once, never accessed again due to mem::forget
6766        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6767        // Prevent Drop from running (which would shut down the channel)
6768        std::mem::forget(self);
6769    }
6770}
6771
6772impl RetainedBlobsClearResponder {
6773    /// Sends a response to the FIDL transaction.
6774    ///
6775    /// Sets the channel to shutdown if an error occurs.
6776    pub fn send(self) -> Result<(), fidl::Error> {
6777        let _result = self.send_raw();
6778        if _result.is_err() {
6779            self.control_handle.shutdown();
6780        }
6781        self.drop_without_shutdown();
6782        _result
6783    }
6784
6785    /// Similar to "send" but does not shutdown the channel if an error occurs.
6786    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
6787        let _result = self.send_raw();
6788        self.drop_without_shutdown();
6789        _result
6790    }
6791
6792    fn send_raw(&self) -> Result<(), fidl::Error> {
6793        self.control_handle.inner.send::<fidl::encoding::EmptyPayload>(
6794            (),
6795            self.tx_id,
6796            0x3005cab30c671164,
6797            fidl::encoding::DynamicFlags::empty(),
6798        )
6799    }
6800}
6801
6802#[must_use = "FIDL methods require a response to be sent"]
6803#[derive(Debug)]
6804pub struct RetainedBlobsReplaceResponder {
6805    control_handle: std::mem::ManuallyDrop<RetainedBlobsControlHandle>,
6806    tx_id: u32,
6807}
6808
6809/// Set the the channel to be shutdown (see [`RetainedBlobsControlHandle::shutdown`])
6810/// if the responder is dropped without sending a response, so that the client
6811/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
6812impl std::ops::Drop for RetainedBlobsReplaceResponder {
6813    fn drop(&mut self) {
6814        self.control_handle.shutdown();
6815        // Safety: drops once, never accessed again
6816        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6817    }
6818}
6819
6820impl fdomain_client::fidl::Responder for RetainedBlobsReplaceResponder {
6821    type ControlHandle = RetainedBlobsControlHandle;
6822
6823    fn control_handle(&self) -> &RetainedBlobsControlHandle {
6824        &self.control_handle
6825    }
6826
6827    fn drop_without_shutdown(mut self) {
6828        // Safety: drops once, never accessed again due to mem::forget
6829        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
6830        // Prevent Drop from running (which would shut down the channel)
6831        std::mem::forget(self);
6832    }
6833}
6834
6835impl RetainedBlobsReplaceResponder {
6836    /// Sends a response to the FIDL transaction.
6837    ///
6838    /// Sets the channel to shutdown if an error occurs.
6839    pub fn send(self) -> Result<(), fidl::Error> {
6840        let _result = self.send_raw();
6841        if _result.is_err() {
6842            self.control_handle.shutdown();
6843        }
6844        self.drop_without_shutdown();
6845        _result
6846    }
6847
6848    /// Similar to "send" but does not shutdown the channel if an error occurs.
6849    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
6850        let _result = self.send_raw();
6851        self.drop_without_shutdown();
6852        _result
6853    }
6854
6855    fn send_raw(&self) -> Result<(), fidl::Error> {
6856        self.control_handle.inner.send::<fidl::encoding::EmptyPayload>(
6857            (),
6858            self.tx_id,
6859            0x2c049d51026cd0b3,
6860            fidl::encoding::DynamicFlags::empty(),
6861        )
6862    }
6863}
6864
6865#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
6866pub struct RetainedPackagesMarker;
6867
6868impl fdomain_client::fidl::ProtocolMarker for RetainedPackagesMarker {
6869    type Proxy = RetainedPackagesProxy;
6870    type RequestStream = RetainedPackagesRequestStream;
6871
6872    const DEBUG_NAME: &'static str = "fuchsia.pkg.RetainedPackages";
6873}
6874impl fdomain_client::fidl::DiscoverableProtocolMarker for RetainedPackagesMarker {}
6875
6876pub trait RetainedPackagesProxyInterface: Send + Sync {
6877    type ClearResponseFut: std::future::Future<Output = Result<(), fidl::Error>> + Send;
6878    fn r#clear(&self) -> Self::ClearResponseFut;
6879    type ReplaceResponseFut: std::future::Future<Output = Result<(), fidl::Error>> + Send;
6880    fn r#replace(
6881        &self,
6882        iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
6883    ) -> Self::ReplaceResponseFut;
6884}
6885
6886#[derive(Debug, Clone)]
6887pub struct RetainedPackagesProxy {
6888    client: fidl::client::Client<fdomain_client::fidl::FDomainResourceDialect>,
6889}
6890
6891impl fdomain_client::fidl::Proxy for RetainedPackagesProxy {
6892    type Protocol = RetainedPackagesMarker;
6893
6894    fn from_channel(inner: fdomain_client::Channel) -> Self {
6895        Self::new(inner)
6896    }
6897
6898    fn into_channel(self) -> Result<fdomain_client::Channel, Self> {
6899        self.client.into_channel().map_err(|client| Self { client })
6900    }
6901
6902    fn as_channel(&self) -> &fdomain_client::Channel {
6903        self.client.as_channel()
6904    }
6905}
6906
6907impl RetainedPackagesProxy {
6908    /// Create a new Proxy for fuchsia.pkg/RetainedPackages.
6909    pub fn new(channel: fdomain_client::Channel) -> Self {
6910        let protocol_name =
6911            <RetainedPackagesMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME;
6912        Self { client: fidl::client::Client::new(channel, protocol_name) }
6913    }
6914
6915    /// Get a Stream of events from the remote end of the protocol.
6916    ///
6917    /// # Panics
6918    ///
6919    /// Panics if the event stream was already taken.
6920    pub fn take_event_stream(&self) -> RetainedPackagesEventStream {
6921        RetainedPackagesEventStream { event_receiver: self.client.take_event_receiver() }
6922    }
6923
6924    /// Atomically clear the retained package set, releasing any previously
6925    /// retained packages.
6926    pub fn r#clear(
6927        &self,
6928    ) -> fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect> {
6929        RetainedPackagesProxyInterface::r#clear(self)
6930    }
6931
6932    /// Atomically replace the retained package set with the [package hashes](
6933    /// https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#package-hash)
6934    /// provided by the given iterator.
6935    /// Duplicate IDs provided will be merged and processed as a single one.
6936    ///
6937    /// + request `iterator` an iterator of package blob IDs that should be
6938    ///   retained.
6939    pub fn r#replace(
6940        &self,
6941        mut iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
6942    ) -> fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect> {
6943        RetainedPackagesProxyInterface::r#replace(self, iterator)
6944    }
6945}
6946
6947impl RetainedPackagesProxyInterface for RetainedPackagesProxy {
6948    type ClearResponseFut =
6949        fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect>;
6950    fn r#clear(&self) -> Self::ClearResponseFut {
6951        fn _decode(
6952            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
6953        ) -> Result<(), fidl::Error> {
6954            let _response = fidl::client::decode_transaction_body::<
6955                fidl::encoding::EmptyPayload,
6956                fdomain_client::fidl::FDomainResourceDialect,
6957                0x7f17476f097961ac,
6958            >(_buf?)?;
6959            Ok(_response)
6960        }
6961        self.client.send_query_and_decode::<fidl::encoding::EmptyPayload, ()>(
6962            (),
6963            0x7f17476f097961ac,
6964            fidl::encoding::DynamicFlags::empty(),
6965            _decode,
6966        )
6967    }
6968
6969    type ReplaceResponseFut =
6970        fidl::client::QueryResponseFut<(), fdomain_client::fidl::FDomainResourceDialect>;
6971    fn r#replace(
6972        &self,
6973        mut iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
6974    ) -> Self::ReplaceResponseFut {
6975        fn _decode(
6976            mut _buf: Result<<fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
6977        ) -> Result<(), fidl::Error> {
6978            let _response = fidl::client::decode_transaction_body::<
6979                fidl::encoding::EmptyPayload,
6980                fdomain_client::fidl::FDomainResourceDialect,
6981                0x5021e479570f3a9f,
6982            >(_buf?)?;
6983            Ok(_response)
6984        }
6985        self.client.send_query_and_decode::<RetainedPackagesReplaceRequest, ()>(
6986            (iterator,),
6987            0x5021e479570f3a9f,
6988            fidl::encoding::DynamicFlags::empty(),
6989            _decode,
6990        )
6991    }
6992}
6993
6994pub struct RetainedPackagesEventStream {
6995    event_receiver: fidl::client::EventReceiver<fdomain_client::fidl::FDomainResourceDialect>,
6996}
6997
6998impl std::marker::Unpin for RetainedPackagesEventStream {}
6999
7000impl futures::stream::FusedStream for RetainedPackagesEventStream {
7001    fn is_terminated(&self) -> bool {
7002        self.event_receiver.is_terminated()
7003    }
7004}
7005
7006impl futures::Stream for RetainedPackagesEventStream {
7007    type Item = Result<RetainedPackagesEvent, fidl::Error>;
7008
7009    fn poll_next(
7010        mut self: std::pin::Pin<&mut Self>,
7011        cx: &mut std::task::Context<'_>,
7012    ) -> std::task::Poll<Option<Self::Item>> {
7013        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
7014            &mut self.event_receiver,
7015            cx
7016        )?) {
7017            Some(buf) => std::task::Poll::Ready(Some(RetainedPackagesEvent::decode(buf))),
7018            None => std::task::Poll::Ready(None),
7019        }
7020    }
7021}
7022
7023#[derive(Debug)]
7024pub enum RetainedPackagesEvent {}
7025
7026impl RetainedPackagesEvent {
7027    /// Decodes a message buffer as a [`RetainedPackagesEvent`].
7028    fn decode(
7029        mut buf: <fdomain_client::fidl::FDomainResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
7030    ) -> Result<RetainedPackagesEvent, fidl::Error> {
7031        let (bytes, _handles) = buf.split_mut();
7032        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
7033        debug_assert_eq!(tx_header.tx_id, 0);
7034        match tx_header.ordinal {
7035            _ => Err(fidl::Error::UnknownOrdinal {
7036                ordinal: tx_header.ordinal,
7037                protocol_name:
7038                    <RetainedPackagesMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
7039            }),
7040        }
7041    }
7042}
7043
7044/// A Stream of incoming requests for fuchsia.pkg/RetainedPackages.
7045pub struct RetainedPackagesRequestStream {
7046    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
7047    is_terminated: bool,
7048}
7049
7050impl std::marker::Unpin for RetainedPackagesRequestStream {}
7051
7052impl futures::stream::FusedStream for RetainedPackagesRequestStream {
7053    fn is_terminated(&self) -> bool {
7054        self.is_terminated
7055    }
7056}
7057
7058impl fdomain_client::fidl::RequestStream for RetainedPackagesRequestStream {
7059    type Protocol = RetainedPackagesMarker;
7060    type ControlHandle = RetainedPackagesControlHandle;
7061
7062    fn from_channel(channel: fdomain_client::Channel) -> Self {
7063        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
7064    }
7065
7066    fn control_handle(&self) -> Self::ControlHandle {
7067        RetainedPackagesControlHandle { inner: self.inner.clone() }
7068    }
7069
7070    fn into_inner(
7071        self,
7072    ) -> (::std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>, bool)
7073    {
7074        (self.inner, self.is_terminated)
7075    }
7076
7077    fn from_inner(
7078        inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
7079        is_terminated: bool,
7080    ) -> Self {
7081        Self { inner, is_terminated }
7082    }
7083}
7084
7085impl futures::Stream for RetainedPackagesRequestStream {
7086    type Item = Result<RetainedPackagesRequest, fidl::Error>;
7087
7088    fn poll_next(
7089        mut self: std::pin::Pin<&mut Self>,
7090        cx: &mut std::task::Context<'_>,
7091    ) -> std::task::Poll<Option<Self::Item>> {
7092        let this = &mut *self;
7093        if this.inner.check_shutdown(cx) {
7094            this.is_terminated = true;
7095            return std::task::Poll::Ready(None);
7096        }
7097        if this.is_terminated {
7098            panic!("polled RetainedPackagesRequestStream after completion");
7099        }
7100        fidl::encoding::with_tls_decode_buf::<_, fdomain_client::fidl::FDomainResourceDialect>(
7101            |bytes, handles| {
7102                match this.inner.channel().read_etc(cx, bytes, handles) {
7103                    std::task::Poll::Ready(Ok(())) => {}
7104                    std::task::Poll::Pending => return std::task::Poll::Pending,
7105                    std::task::Poll::Ready(Err(None)) => {
7106                        this.is_terminated = true;
7107                        return std::task::Poll::Ready(None);
7108                    }
7109                    std::task::Poll::Ready(Err(Some(e))) => {
7110                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
7111                            e.into(),
7112                        ))));
7113                    }
7114                }
7115
7116                // A message has been received from the channel
7117                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
7118
7119                std::task::Poll::Ready(Some(match header.ordinal {
7120                0x7f17476f097961ac => {
7121                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
7122                    let mut req = fidl::new_empty!(fidl::encoding::EmptyPayload, fdomain_client::fidl::FDomainResourceDialect);
7123                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<fidl::encoding::EmptyPayload>(&header, _body_bytes, handles, &mut req)?;
7124                    let control_handle = RetainedPackagesControlHandle {
7125                        inner: this.inner.clone(),
7126                    };
7127                    Ok(RetainedPackagesRequest::Clear {
7128                        responder: RetainedPackagesClearResponder {
7129                            control_handle: std::mem::ManuallyDrop::new(control_handle),
7130                            tx_id: header.tx_id,
7131                        },
7132                    })
7133                }
7134                0x5021e479570f3a9f => {
7135                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
7136                    let mut req = fidl::new_empty!(RetainedPackagesReplaceRequest, fdomain_client::fidl::FDomainResourceDialect);
7137                    fidl::encoding::Decoder::<fdomain_client::fidl::FDomainResourceDialect>::decode_into::<RetainedPackagesReplaceRequest>(&header, _body_bytes, handles, &mut req)?;
7138                    let control_handle = RetainedPackagesControlHandle {
7139                        inner: this.inner.clone(),
7140                    };
7141                    Ok(RetainedPackagesRequest::Replace {iterator: req.iterator,
7142
7143                        responder: RetainedPackagesReplaceResponder {
7144                            control_handle: std::mem::ManuallyDrop::new(control_handle),
7145                            tx_id: header.tx_id,
7146                        },
7147                    })
7148                }
7149                _ => Err(fidl::Error::UnknownOrdinal {
7150                    ordinal: header.ordinal,
7151                    protocol_name: <RetainedPackagesMarker as fdomain_client::fidl::ProtocolMarker>::DEBUG_NAME,
7152                }),
7153            }))
7154            },
7155        )
7156    }
7157}
7158
7159/// Manages the set of retained packages.
7160///
7161/// Retained packages will not be removed from the package cache, even if they
7162/// aren't fully present. There is only a single set active at once, and the
7163/// provided APIs for configuring the set atomically replace the retained
7164/// packages set, it will not affect the retained blobs set. On boot, the
7165/// retained packages set is always initialized to the empty set.
7166/// Documentation on [garbage collection](
7167/// https://fuchsia.dev/fuchsia-src/concepts/packages/garbage_collection) contains
7168/// details on various types of package indexes (static, retained, etc) and
7169/// describes when a package will be garbage collected or retained.
7170#[derive(Debug)]
7171pub enum RetainedPackagesRequest {
7172    /// Atomically clear the retained package set, releasing any previously
7173    /// retained packages.
7174    Clear { responder: RetainedPackagesClearResponder },
7175    /// Atomically replace the retained package set with the [package hashes](
7176    /// https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#package-hash)
7177    /// provided by the given iterator.
7178    /// Duplicate IDs provided will be merged and processed as a single one.
7179    ///
7180    /// + request `iterator` an iterator of package blob IDs that should be
7181    ///   retained.
7182    Replace {
7183        iterator: fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
7184        responder: RetainedPackagesReplaceResponder,
7185    },
7186}
7187
7188impl RetainedPackagesRequest {
7189    #[allow(irrefutable_let_patterns)]
7190    pub fn into_clear(self) -> Option<(RetainedPackagesClearResponder)> {
7191        if let RetainedPackagesRequest::Clear { responder } = self {
7192            Some((responder))
7193        } else {
7194            None
7195        }
7196    }
7197
7198    #[allow(irrefutable_let_patterns)]
7199    pub fn into_replace(
7200        self,
7201    ) -> Option<(
7202        fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>,
7203        RetainedPackagesReplaceResponder,
7204    )> {
7205        if let RetainedPackagesRequest::Replace { iterator, responder } = self {
7206            Some((iterator, responder))
7207        } else {
7208            None
7209        }
7210    }
7211
7212    /// Name of the method defined in FIDL
7213    pub fn method_name(&self) -> &'static str {
7214        match *self {
7215            RetainedPackagesRequest::Clear { .. } => "clear",
7216            RetainedPackagesRequest::Replace { .. } => "replace",
7217        }
7218    }
7219}
7220
7221#[derive(Debug, Clone)]
7222pub struct RetainedPackagesControlHandle {
7223    inner: std::sync::Arc<fidl::ServeInner<fdomain_client::fidl::FDomainResourceDialect>>,
7224}
7225
7226impl fdomain_client::fidl::ControlHandle for RetainedPackagesControlHandle {
7227    fn shutdown(&self) {
7228        self.inner.shutdown()
7229    }
7230
7231    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
7232        self.inner.shutdown_with_epitaph(status)
7233    }
7234
7235    fn is_closed(&self) -> bool {
7236        self.inner.channel().is_closed()
7237    }
7238    fn on_closed(&self) -> fdomain_client::OnFDomainSignals {
7239        self.inner.channel().on_closed()
7240    }
7241}
7242
7243impl RetainedPackagesControlHandle {}
7244
7245#[must_use = "FIDL methods require a response to be sent"]
7246#[derive(Debug)]
7247pub struct RetainedPackagesClearResponder {
7248    control_handle: std::mem::ManuallyDrop<RetainedPackagesControlHandle>,
7249    tx_id: u32,
7250}
7251
7252/// Set the the channel to be shutdown (see [`RetainedPackagesControlHandle::shutdown`])
7253/// if the responder is dropped without sending a response, so that the client
7254/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
7255impl std::ops::Drop for RetainedPackagesClearResponder {
7256    fn drop(&mut self) {
7257        self.control_handle.shutdown();
7258        // Safety: drops once, never accessed again
7259        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
7260    }
7261}
7262
7263impl fdomain_client::fidl::Responder for RetainedPackagesClearResponder {
7264    type ControlHandle = RetainedPackagesControlHandle;
7265
7266    fn control_handle(&self) -> &RetainedPackagesControlHandle {
7267        &self.control_handle
7268    }
7269
7270    fn drop_without_shutdown(mut self) {
7271        // Safety: drops once, never accessed again due to mem::forget
7272        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
7273        // Prevent Drop from running (which would shut down the channel)
7274        std::mem::forget(self);
7275    }
7276}
7277
7278impl RetainedPackagesClearResponder {
7279    /// Sends a response to the FIDL transaction.
7280    ///
7281    /// Sets the channel to shutdown if an error occurs.
7282    pub fn send(self) -> Result<(), fidl::Error> {
7283        let _result = self.send_raw();
7284        if _result.is_err() {
7285            self.control_handle.shutdown();
7286        }
7287        self.drop_without_shutdown();
7288        _result
7289    }
7290
7291    /// Similar to "send" but does not shutdown the channel if an error occurs.
7292    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
7293        let _result = self.send_raw();
7294        self.drop_without_shutdown();
7295        _result
7296    }
7297
7298    fn send_raw(&self) -> Result<(), fidl::Error> {
7299        self.control_handle.inner.send::<fidl::encoding::EmptyPayload>(
7300            (),
7301            self.tx_id,
7302            0x7f17476f097961ac,
7303            fidl::encoding::DynamicFlags::empty(),
7304        )
7305    }
7306}
7307
7308#[must_use = "FIDL methods require a response to be sent"]
7309#[derive(Debug)]
7310pub struct RetainedPackagesReplaceResponder {
7311    control_handle: std::mem::ManuallyDrop<RetainedPackagesControlHandle>,
7312    tx_id: u32,
7313}
7314
7315/// Set the the channel to be shutdown (see [`RetainedPackagesControlHandle::shutdown`])
7316/// if the responder is dropped without sending a response, so that the client
7317/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
7318impl std::ops::Drop for RetainedPackagesReplaceResponder {
7319    fn drop(&mut self) {
7320        self.control_handle.shutdown();
7321        // Safety: drops once, never accessed again
7322        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
7323    }
7324}
7325
7326impl fdomain_client::fidl::Responder for RetainedPackagesReplaceResponder {
7327    type ControlHandle = RetainedPackagesControlHandle;
7328
7329    fn control_handle(&self) -> &RetainedPackagesControlHandle {
7330        &self.control_handle
7331    }
7332
7333    fn drop_without_shutdown(mut self) {
7334        // Safety: drops once, never accessed again due to mem::forget
7335        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
7336        // Prevent Drop from running (which would shut down the channel)
7337        std::mem::forget(self);
7338    }
7339}
7340
7341impl RetainedPackagesReplaceResponder {
7342    /// Sends a response to the FIDL transaction.
7343    ///
7344    /// Sets the channel to shutdown if an error occurs.
7345    pub fn send(self) -> Result<(), fidl::Error> {
7346        let _result = self.send_raw();
7347        if _result.is_err() {
7348            self.control_handle.shutdown();
7349        }
7350        self.drop_without_shutdown();
7351        _result
7352    }
7353
7354    /// Similar to "send" but does not shutdown the channel if an error occurs.
7355    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
7356        let _result = self.send_raw();
7357        self.drop_without_shutdown();
7358        _result
7359    }
7360
7361    fn send_raw(&self) -> Result<(), fidl::Error> {
7362        self.control_handle.inner.send::<fidl::encoding::EmptyPayload>(
7363            (),
7364            self.tx_id,
7365            0x5021e479570f3a9f,
7366            fidl::encoding::DynamicFlags::empty(),
7367        )
7368    }
7369}
7370
7371mod internal {
7372    use super::*;
7373
7374    impl fidl::encoding::ResourceTypeMarker for FontResolverResolveRequest {
7375        type Borrowed<'a> = &'a mut Self;
7376        fn take_or_borrow<'a>(
7377            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
7378        ) -> Self::Borrowed<'a> {
7379            value
7380        }
7381    }
7382
7383    unsafe impl fidl::encoding::TypeMarker for FontResolverResolveRequest {
7384        type Owned = Self;
7385
7386        #[inline(always)]
7387        fn inline_align(_context: fidl::encoding::Context) -> usize {
7388            8
7389        }
7390
7391        #[inline(always)]
7392        fn inline_size(_context: fidl::encoding::Context) -> usize {
7393            24
7394        }
7395    }
7396
7397    unsafe impl
7398        fidl::encoding::Encode<
7399            FontResolverResolveRequest,
7400            fdomain_client::fidl::FDomainResourceDialect,
7401        > for &mut FontResolverResolveRequest
7402    {
7403        #[inline]
7404        unsafe fn encode(
7405            self,
7406            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7407            offset: usize,
7408            _depth: fidl::encoding::Depth,
7409        ) -> fidl::Result<()> {
7410            encoder.debug_check_bounds::<FontResolverResolveRequest>(offset);
7411            // Delegate to tuple encoding.
7412            fidl::encoding::Encode::<
7413                FontResolverResolveRequest,
7414                fdomain_client::fidl::FDomainResourceDialect,
7415            >::encode(
7416                (
7417                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow(
7418                        &self.package_url,
7419                    ),
7420                    <fidl::encoding::Endpoint<
7421                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
7422                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
7423                        &mut self.directory_request,
7424                    ),
7425                ),
7426                encoder,
7427                offset,
7428                _depth,
7429            )
7430        }
7431    }
7432    unsafe impl<
7433        T0: fidl::encoding::Encode<
7434                fidl::encoding::UnboundedString,
7435                fdomain_client::fidl::FDomainResourceDialect,
7436            >,
7437        T1: fidl::encoding::Encode<
7438                fidl::encoding::Endpoint<
7439                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
7440                >,
7441                fdomain_client::fidl::FDomainResourceDialect,
7442            >,
7443    >
7444        fidl::encoding::Encode<
7445            FontResolverResolveRequest,
7446            fdomain_client::fidl::FDomainResourceDialect,
7447        > for (T0, T1)
7448    {
7449        #[inline]
7450        unsafe fn encode(
7451            self,
7452            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7453            offset: usize,
7454            depth: fidl::encoding::Depth,
7455        ) -> fidl::Result<()> {
7456            encoder.debug_check_bounds::<FontResolverResolveRequest>(offset);
7457            // Zero out padding regions. There's no need to apply masks
7458            // because the unmasked parts will be overwritten by fields.
7459            unsafe {
7460                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
7461                (ptr as *mut u64).write_unaligned(0);
7462            }
7463            // Write the fields.
7464            self.0.encode(encoder, offset + 0, depth)?;
7465            self.1.encode(encoder, offset + 16, depth)?;
7466            Ok(())
7467        }
7468    }
7469
7470    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
7471        for FontResolverResolveRequest
7472    {
7473        #[inline(always)]
7474        fn new_empty() -> Self {
7475            Self {
7476                package_url: fidl::new_empty!(
7477                    fidl::encoding::UnboundedString,
7478                    fdomain_client::fidl::FDomainResourceDialect
7479                ),
7480                directory_request: fidl::new_empty!(
7481                    fidl::encoding::Endpoint<
7482                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
7483                    >,
7484                    fdomain_client::fidl::FDomainResourceDialect
7485                ),
7486            }
7487        }
7488
7489        #[inline]
7490        unsafe fn decode(
7491            &mut self,
7492            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7493            offset: usize,
7494            _depth: fidl::encoding::Depth,
7495        ) -> fidl::Result<()> {
7496            decoder.debug_check_bounds::<Self>(offset);
7497            // Verify that padding bytes are zero.
7498            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
7499            let padval = unsafe { (ptr as *const u64).read_unaligned() };
7500            let mask = 0xffffffff00000000u64;
7501            let maskedval = padval & mask;
7502            if maskedval != 0 {
7503                return Err(fidl::Error::NonZeroPadding {
7504                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
7505                });
7506            }
7507            fidl::decode!(
7508                fidl::encoding::UnboundedString,
7509                fdomain_client::fidl::FDomainResourceDialect,
7510                &mut self.package_url,
7511                decoder,
7512                offset + 0,
7513                _depth
7514            )?;
7515            fidl::decode!(
7516                fidl::encoding::Endpoint<
7517                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
7518                >,
7519                fdomain_client::fidl::FDomainResourceDialect,
7520                &mut self.directory_request,
7521                decoder,
7522                offset + 16,
7523                _depth
7524            )?;
7525            Ok(())
7526        }
7527    }
7528
7529    impl fidl::encoding::ResourceTypeMarker for NeededBlobsGetMissingBlobsRequest {
7530        type Borrowed<'a> = &'a mut Self;
7531        fn take_or_borrow<'a>(
7532            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
7533        ) -> Self::Borrowed<'a> {
7534            value
7535        }
7536    }
7537
7538    unsafe impl fidl::encoding::TypeMarker for NeededBlobsGetMissingBlobsRequest {
7539        type Owned = Self;
7540
7541        #[inline(always)]
7542        fn inline_align(_context: fidl::encoding::Context) -> usize {
7543            4
7544        }
7545
7546        #[inline(always)]
7547        fn inline_size(_context: fidl::encoding::Context) -> usize {
7548            4
7549        }
7550    }
7551
7552    unsafe impl
7553        fidl::encoding::Encode<
7554            NeededBlobsGetMissingBlobsRequest,
7555            fdomain_client::fidl::FDomainResourceDialect,
7556        > for &mut NeededBlobsGetMissingBlobsRequest
7557    {
7558        #[inline]
7559        unsafe fn encode(
7560            self,
7561            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7562            offset: usize,
7563            _depth: fidl::encoding::Depth,
7564        ) -> fidl::Result<()> {
7565            encoder.debug_check_bounds::<NeededBlobsGetMissingBlobsRequest>(offset);
7566            // Delegate to tuple encoding.
7567            fidl::encoding::Encode::<
7568                NeededBlobsGetMissingBlobsRequest,
7569                fdomain_client::fidl::FDomainResourceDialect,
7570            >::encode(
7571                (
7572                    <fidl::encoding::Endpoint<
7573                        fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>,
7574                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
7575                        &mut self.iterator
7576                    ),
7577                ),
7578                encoder,
7579                offset,
7580                _depth,
7581            )
7582        }
7583    }
7584    unsafe impl<
7585        T0: fidl::encoding::Encode<
7586                fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>>,
7587                fdomain_client::fidl::FDomainResourceDialect,
7588            >,
7589    >
7590        fidl::encoding::Encode<
7591            NeededBlobsGetMissingBlobsRequest,
7592            fdomain_client::fidl::FDomainResourceDialect,
7593        > for (T0,)
7594    {
7595        #[inline]
7596        unsafe fn encode(
7597            self,
7598            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7599            offset: usize,
7600            depth: fidl::encoding::Depth,
7601        ) -> fidl::Result<()> {
7602            encoder.debug_check_bounds::<NeededBlobsGetMissingBlobsRequest>(offset);
7603            // Zero out padding regions. There's no need to apply masks
7604            // because the unmasked parts will be overwritten by fields.
7605            // Write the fields.
7606            self.0.encode(encoder, offset + 0, depth)?;
7607            Ok(())
7608        }
7609    }
7610
7611    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
7612        for NeededBlobsGetMissingBlobsRequest
7613    {
7614        #[inline(always)]
7615        fn new_empty() -> Self {
7616            Self {
7617                iterator: fidl::new_empty!(
7618                    fidl::encoding::Endpoint<
7619                        fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>,
7620                    >,
7621                    fdomain_client::fidl::FDomainResourceDialect
7622                ),
7623            }
7624        }
7625
7626        #[inline]
7627        unsafe fn decode(
7628            &mut self,
7629            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7630            offset: usize,
7631            _depth: fidl::encoding::Depth,
7632        ) -> fidl::Result<()> {
7633            decoder.debug_check_bounds::<Self>(offset);
7634            // Verify that padding bytes are zero.
7635            fidl::decode!(
7636                fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<BlobInfoIteratorMarker>>,
7637                fdomain_client::fidl::FDomainResourceDialect,
7638                &mut self.iterator,
7639                decoder,
7640                offset + 0,
7641                _depth
7642            )?;
7643            Ok(())
7644        }
7645    }
7646
7647    impl fidl::encoding::ResourceTypeMarker for NeededBlobsOpenBlobResponse {
7648        type Borrowed<'a> = &'a mut Self;
7649        fn take_or_borrow<'a>(
7650            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
7651        ) -> Self::Borrowed<'a> {
7652            value
7653        }
7654    }
7655
7656    unsafe impl fidl::encoding::TypeMarker for NeededBlobsOpenBlobResponse {
7657        type Owned = Self;
7658
7659        #[inline(always)]
7660        fn inline_align(_context: fidl::encoding::Context) -> usize {
7661            4
7662        }
7663
7664        #[inline(always)]
7665        fn inline_size(_context: fidl::encoding::Context) -> usize {
7666            4
7667        }
7668    }
7669
7670    unsafe impl
7671        fidl::encoding::Encode<
7672            NeededBlobsOpenBlobResponse,
7673            fdomain_client::fidl::FDomainResourceDialect,
7674        > for &mut NeededBlobsOpenBlobResponse
7675    {
7676        #[inline]
7677        unsafe fn encode(
7678            self,
7679            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7680            offset: usize,
7681            _depth: fidl::encoding::Depth,
7682        ) -> fidl::Result<()> {
7683            encoder.debug_check_bounds::<NeededBlobsOpenBlobResponse>(offset);
7684            // Delegate to tuple encoding.
7685            fidl::encoding::Encode::<
7686                NeededBlobsOpenBlobResponse,
7687                fdomain_client::fidl::FDomainResourceDialect,
7688            >::encode(
7689                (<fidl::encoding::Optional<
7690                    fidl::encoding::Endpoint<
7691                        fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>,
7692                    >,
7693                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
7694                    &mut self.writer
7695                ),),
7696                encoder,
7697                offset,
7698                _depth,
7699            )
7700        }
7701    }
7702    unsafe impl<
7703        T0: fidl::encoding::Encode<
7704                fidl::encoding::Optional<
7705                    fidl::encoding::Endpoint<
7706                        fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>,
7707                    >,
7708                >,
7709                fdomain_client::fidl::FDomainResourceDialect,
7710            >,
7711    >
7712        fidl::encoding::Encode<
7713            NeededBlobsOpenBlobResponse,
7714            fdomain_client::fidl::FDomainResourceDialect,
7715        > for (T0,)
7716    {
7717        #[inline]
7718        unsafe fn encode(
7719            self,
7720            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7721            offset: usize,
7722            depth: fidl::encoding::Depth,
7723        ) -> fidl::Result<()> {
7724            encoder.debug_check_bounds::<NeededBlobsOpenBlobResponse>(offset);
7725            // Zero out padding regions. There's no need to apply masks
7726            // because the unmasked parts will be overwritten by fields.
7727            // Write the fields.
7728            self.0.encode(encoder, offset + 0, depth)?;
7729            Ok(())
7730        }
7731    }
7732
7733    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
7734        for NeededBlobsOpenBlobResponse
7735    {
7736        #[inline(always)]
7737        fn new_empty() -> Self {
7738            Self {
7739                writer: fidl::new_empty!(
7740                    fidl::encoding::Optional<
7741                        fidl::encoding::Endpoint<
7742                            fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>,
7743                        >,
7744                    >,
7745                    fdomain_client::fidl::FDomainResourceDialect
7746                ),
7747            }
7748        }
7749
7750        #[inline]
7751        unsafe fn decode(
7752            &mut self,
7753            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7754            offset: usize,
7755            _depth: fidl::encoding::Depth,
7756        ) -> fidl::Result<()> {
7757            decoder.debug_check_bounds::<Self>(offset);
7758            // Verify that padding bytes are zero.
7759            fidl::decode!(
7760                fidl::encoding::Optional<
7761                    fidl::encoding::Endpoint<
7762                        fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>,
7763                    >,
7764                >,
7765                fdomain_client::fidl::FDomainResourceDialect,
7766                &mut self.writer,
7767                decoder,
7768                offset + 0,
7769                _depth
7770            )?;
7771            Ok(())
7772        }
7773    }
7774
7775    impl fidl::encoding::ResourceTypeMarker for NeededBlobsOpenMetaBlobResponse {
7776        type Borrowed<'a> = &'a mut Self;
7777        fn take_or_borrow<'a>(
7778            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
7779        ) -> Self::Borrowed<'a> {
7780            value
7781        }
7782    }
7783
7784    unsafe impl fidl::encoding::TypeMarker for NeededBlobsOpenMetaBlobResponse {
7785        type Owned = Self;
7786
7787        #[inline(always)]
7788        fn inline_align(_context: fidl::encoding::Context) -> usize {
7789            4
7790        }
7791
7792        #[inline(always)]
7793        fn inline_size(_context: fidl::encoding::Context) -> usize {
7794            4
7795        }
7796    }
7797
7798    unsafe impl
7799        fidl::encoding::Encode<
7800            NeededBlobsOpenMetaBlobResponse,
7801            fdomain_client::fidl::FDomainResourceDialect,
7802        > for &mut NeededBlobsOpenMetaBlobResponse
7803    {
7804        #[inline]
7805        unsafe fn encode(
7806            self,
7807            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7808            offset: usize,
7809            _depth: fidl::encoding::Depth,
7810        ) -> fidl::Result<()> {
7811            encoder.debug_check_bounds::<NeededBlobsOpenMetaBlobResponse>(offset);
7812            // Delegate to tuple encoding.
7813            fidl::encoding::Encode::<
7814                NeededBlobsOpenMetaBlobResponse,
7815                fdomain_client::fidl::FDomainResourceDialect,
7816            >::encode(
7817                (<fidl::encoding::Optional<
7818                    fidl::encoding::Endpoint<
7819                        fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>,
7820                    >,
7821                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
7822                    &mut self.writer
7823                ),),
7824                encoder,
7825                offset,
7826                _depth,
7827            )
7828        }
7829    }
7830    unsafe impl<
7831        T0: fidl::encoding::Encode<
7832                fidl::encoding::Optional<
7833                    fidl::encoding::Endpoint<
7834                        fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>,
7835                    >,
7836                >,
7837                fdomain_client::fidl::FDomainResourceDialect,
7838            >,
7839    >
7840        fidl::encoding::Encode<
7841            NeededBlobsOpenMetaBlobResponse,
7842            fdomain_client::fidl::FDomainResourceDialect,
7843        > for (T0,)
7844    {
7845        #[inline]
7846        unsafe fn encode(
7847            self,
7848            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7849            offset: usize,
7850            depth: fidl::encoding::Depth,
7851        ) -> fidl::Result<()> {
7852            encoder.debug_check_bounds::<NeededBlobsOpenMetaBlobResponse>(offset);
7853            // Zero out padding regions. There's no need to apply masks
7854            // because the unmasked parts will be overwritten by fields.
7855            // Write the fields.
7856            self.0.encode(encoder, offset + 0, depth)?;
7857            Ok(())
7858        }
7859    }
7860
7861    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
7862        for NeededBlobsOpenMetaBlobResponse
7863    {
7864        #[inline(always)]
7865        fn new_empty() -> Self {
7866            Self {
7867                writer: fidl::new_empty!(
7868                    fidl::encoding::Optional<
7869                        fidl::encoding::Endpoint<
7870                            fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>,
7871                        >,
7872                    >,
7873                    fdomain_client::fidl::FDomainResourceDialect
7874                ),
7875            }
7876        }
7877
7878        #[inline]
7879        unsafe fn decode(
7880            &mut self,
7881            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7882            offset: usize,
7883            _depth: fidl::encoding::Depth,
7884        ) -> fidl::Result<()> {
7885            decoder.debug_check_bounds::<Self>(offset);
7886            // Verify that padding bytes are zero.
7887            fidl::decode!(
7888                fidl::encoding::Optional<
7889                    fidl::encoding::Endpoint<
7890                        fdomain_client::fidl::ClientEnd<fdomain_fuchsia_fxfs::BlobWriterMarker>,
7891                    >,
7892                >,
7893                fdomain_client::fidl::FDomainResourceDialect,
7894                &mut self.writer,
7895                decoder,
7896                offset + 0,
7897                _depth
7898            )?;
7899            Ok(())
7900        }
7901    }
7902
7903    impl fidl::encoding::ResourceTypeMarker for PackageCacheBasePackageIndexRequest {
7904        type Borrowed<'a> = &'a mut Self;
7905        fn take_or_borrow<'a>(
7906            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
7907        ) -> Self::Borrowed<'a> {
7908            value
7909        }
7910    }
7911
7912    unsafe impl fidl::encoding::TypeMarker for PackageCacheBasePackageIndexRequest {
7913        type Owned = Self;
7914
7915        #[inline(always)]
7916        fn inline_align(_context: fidl::encoding::Context) -> usize {
7917            4
7918        }
7919
7920        #[inline(always)]
7921        fn inline_size(_context: fidl::encoding::Context) -> usize {
7922            4
7923        }
7924    }
7925
7926    unsafe impl
7927        fidl::encoding::Encode<
7928            PackageCacheBasePackageIndexRequest,
7929            fdomain_client::fidl::FDomainResourceDialect,
7930        > for &mut PackageCacheBasePackageIndexRequest
7931    {
7932        #[inline]
7933        unsafe fn encode(
7934            self,
7935            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7936            offset: usize,
7937            _depth: fidl::encoding::Depth,
7938        ) -> fidl::Result<()> {
7939            encoder.debug_check_bounds::<PackageCacheBasePackageIndexRequest>(offset);
7940            // Delegate to tuple encoding.
7941            fidl::encoding::Encode::<
7942                PackageCacheBasePackageIndexRequest,
7943                fdomain_client::fidl::FDomainResourceDialect,
7944            >::encode(
7945                (<fidl::encoding::Endpoint<
7946                    fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
7947                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
7948                    &mut self.iterator
7949                ),),
7950                encoder,
7951                offset,
7952                _depth,
7953            )
7954        }
7955    }
7956    unsafe impl<
7957        T0: fidl::encoding::Encode<
7958                fidl::encoding::Endpoint<
7959                    fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
7960                >,
7961                fdomain_client::fidl::FDomainResourceDialect,
7962            >,
7963    >
7964        fidl::encoding::Encode<
7965            PackageCacheBasePackageIndexRequest,
7966            fdomain_client::fidl::FDomainResourceDialect,
7967        > for (T0,)
7968    {
7969        #[inline]
7970        unsafe fn encode(
7971            self,
7972            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
7973            offset: usize,
7974            depth: fidl::encoding::Depth,
7975        ) -> fidl::Result<()> {
7976            encoder.debug_check_bounds::<PackageCacheBasePackageIndexRequest>(offset);
7977            // Zero out padding regions. There's no need to apply masks
7978            // because the unmasked parts will be overwritten by fields.
7979            // Write the fields.
7980            self.0.encode(encoder, offset + 0, depth)?;
7981            Ok(())
7982        }
7983    }
7984
7985    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
7986        for PackageCacheBasePackageIndexRequest
7987    {
7988        #[inline(always)]
7989        fn new_empty() -> Self {
7990            Self {
7991                iterator: fidl::new_empty!(
7992                    fidl::encoding::Endpoint<
7993                        fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
7994                    >,
7995                    fdomain_client::fidl::FDomainResourceDialect
7996                ),
7997            }
7998        }
7999
8000        #[inline]
8001        unsafe fn decode(
8002            &mut self,
8003            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8004            offset: usize,
8005            _depth: fidl::encoding::Depth,
8006        ) -> fidl::Result<()> {
8007            decoder.debug_check_bounds::<Self>(offset);
8008            // Verify that padding bytes are zero.
8009            fidl::decode!(
8010                fidl::encoding::Endpoint<
8011                    fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
8012                >,
8013                fdomain_client::fidl::FDomainResourceDialect,
8014                &mut self.iterator,
8015                decoder,
8016                offset + 0,
8017                _depth
8018            )?;
8019            Ok(())
8020        }
8021    }
8022
8023    impl fidl::encoding::ResourceTypeMarker for PackageCacheCachePackageIndexRequest {
8024        type Borrowed<'a> = &'a mut Self;
8025        fn take_or_borrow<'a>(
8026            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
8027        ) -> Self::Borrowed<'a> {
8028            value
8029        }
8030    }
8031
8032    unsafe impl fidl::encoding::TypeMarker for PackageCacheCachePackageIndexRequest {
8033        type Owned = Self;
8034
8035        #[inline(always)]
8036        fn inline_align(_context: fidl::encoding::Context) -> usize {
8037            4
8038        }
8039
8040        #[inline(always)]
8041        fn inline_size(_context: fidl::encoding::Context) -> usize {
8042            4
8043        }
8044    }
8045
8046    unsafe impl
8047        fidl::encoding::Encode<
8048            PackageCacheCachePackageIndexRequest,
8049            fdomain_client::fidl::FDomainResourceDialect,
8050        > for &mut PackageCacheCachePackageIndexRequest
8051    {
8052        #[inline]
8053        unsafe fn encode(
8054            self,
8055            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8056            offset: usize,
8057            _depth: fidl::encoding::Depth,
8058        ) -> fidl::Result<()> {
8059            encoder.debug_check_bounds::<PackageCacheCachePackageIndexRequest>(offset);
8060            // Delegate to tuple encoding.
8061            fidl::encoding::Encode::<
8062                PackageCacheCachePackageIndexRequest,
8063                fdomain_client::fidl::FDomainResourceDialect,
8064            >::encode(
8065                (<fidl::encoding::Endpoint<
8066                    fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
8067                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
8068                    &mut self.iterator
8069                ),),
8070                encoder,
8071                offset,
8072                _depth,
8073            )
8074        }
8075    }
8076    unsafe impl<
8077        T0: fidl::encoding::Encode<
8078                fidl::encoding::Endpoint<
8079                    fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
8080                >,
8081                fdomain_client::fidl::FDomainResourceDialect,
8082            >,
8083    >
8084        fidl::encoding::Encode<
8085            PackageCacheCachePackageIndexRequest,
8086            fdomain_client::fidl::FDomainResourceDialect,
8087        > for (T0,)
8088    {
8089        #[inline]
8090        unsafe fn encode(
8091            self,
8092            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8093            offset: usize,
8094            depth: fidl::encoding::Depth,
8095        ) -> fidl::Result<()> {
8096            encoder.debug_check_bounds::<PackageCacheCachePackageIndexRequest>(offset);
8097            // Zero out padding regions. There's no need to apply masks
8098            // because the unmasked parts will be overwritten by fields.
8099            // Write the fields.
8100            self.0.encode(encoder, offset + 0, depth)?;
8101            Ok(())
8102        }
8103    }
8104
8105    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
8106        for PackageCacheCachePackageIndexRequest
8107    {
8108        #[inline(always)]
8109        fn new_empty() -> Self {
8110            Self {
8111                iterator: fidl::new_empty!(
8112                    fidl::encoding::Endpoint<
8113                        fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
8114                    >,
8115                    fdomain_client::fidl::FDomainResourceDialect
8116                ),
8117            }
8118        }
8119
8120        #[inline]
8121        unsafe fn decode(
8122            &mut self,
8123            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8124            offset: usize,
8125            _depth: fidl::encoding::Depth,
8126        ) -> fidl::Result<()> {
8127            decoder.debug_check_bounds::<Self>(offset);
8128            // Verify that padding bytes are zero.
8129            fidl::decode!(
8130                fidl::encoding::Endpoint<
8131                    fdomain_client::fidl::ServerEnd<PackageIndexIteratorMarker>,
8132                >,
8133                fdomain_client::fidl::FDomainResourceDialect,
8134                &mut self.iterator,
8135                decoder,
8136                offset + 0,
8137                _depth
8138            )?;
8139            Ok(())
8140        }
8141    }
8142
8143    impl fidl::encoding::ResourceTypeMarker for PackageCacheGetRequest {
8144        type Borrowed<'a> = &'a mut Self;
8145        fn take_or_borrow<'a>(
8146            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
8147        ) -> Self::Borrowed<'a> {
8148            value
8149        }
8150    }
8151
8152    unsafe impl fidl::encoding::TypeMarker for PackageCacheGetRequest {
8153        type Owned = Self;
8154
8155        #[inline(always)]
8156        fn inline_align(_context: fidl::encoding::Context) -> usize {
8157            8
8158        }
8159
8160        #[inline(always)]
8161        fn inline_size(_context: fidl::encoding::Context) -> usize {
8162            56
8163        }
8164    }
8165
8166    unsafe impl
8167        fidl::encoding::Encode<PackageCacheGetRequest, fdomain_client::fidl::FDomainResourceDialect>
8168        for &mut PackageCacheGetRequest
8169    {
8170        #[inline]
8171        unsafe fn encode(
8172            self,
8173            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8174            offset: usize,
8175            _depth: fidl::encoding::Depth,
8176        ) -> fidl::Result<()> {
8177            encoder.debug_check_bounds::<PackageCacheGetRequest>(offset);
8178            // Delegate to tuple encoding.
8179            fidl::encoding::Encode::<PackageCacheGetRequest, fdomain_client::fidl::FDomainResourceDialect>::encode(
8180                (
8181                    <BlobInfo as fidl::encoding::ValueTypeMarker>::borrow(&self.meta_far_blob),
8182                    <GcProtection as fidl::encoding::ValueTypeMarker>::borrow(&self.gc_protection),
8183                    <fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<NeededBlobsMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.needed_blobs),
8184                    <fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.dir),
8185                ),
8186                encoder, offset, _depth
8187            )
8188        }
8189    }
8190    unsafe impl<
8191        T0: fidl::encoding::Encode<BlobInfo, fdomain_client::fidl::FDomainResourceDialect>,
8192        T1: fidl::encoding::Encode<GcProtection, fdomain_client::fidl::FDomainResourceDialect>,
8193        T2: fidl::encoding::Encode<
8194                fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<NeededBlobsMarker>>,
8195                fdomain_client::fidl::FDomainResourceDialect,
8196            >,
8197        T3: fidl::encoding::Encode<
8198                fidl::encoding::Endpoint<
8199                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8200                >,
8201                fdomain_client::fidl::FDomainResourceDialect,
8202            >,
8203    >
8204        fidl::encoding::Encode<PackageCacheGetRequest, fdomain_client::fidl::FDomainResourceDialect>
8205        for (T0, T1, T2, T3)
8206    {
8207        #[inline]
8208        unsafe fn encode(
8209            self,
8210            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8211            offset: usize,
8212            depth: fidl::encoding::Depth,
8213        ) -> fidl::Result<()> {
8214            encoder.debug_check_bounds::<PackageCacheGetRequest>(offset);
8215            // Zero out padding regions. There's no need to apply masks
8216            // because the unmasked parts will be overwritten by fields.
8217            unsafe {
8218                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(48);
8219                (ptr as *mut u64).write_unaligned(0);
8220            }
8221            // Write the fields.
8222            self.0.encode(encoder, offset + 0, depth)?;
8223            self.1.encode(encoder, offset + 40, depth)?;
8224            self.2.encode(encoder, offset + 44, depth)?;
8225            self.3.encode(encoder, offset + 48, depth)?;
8226            Ok(())
8227        }
8228    }
8229
8230    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
8231        for PackageCacheGetRequest
8232    {
8233        #[inline(always)]
8234        fn new_empty() -> Self {
8235            Self {
8236                meta_far_blob: fidl::new_empty!(
8237                    BlobInfo,
8238                    fdomain_client::fidl::FDomainResourceDialect
8239                ),
8240                gc_protection: fidl::new_empty!(
8241                    GcProtection,
8242                    fdomain_client::fidl::FDomainResourceDialect
8243                ),
8244                needed_blobs: fidl::new_empty!(
8245                    fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<NeededBlobsMarker>>,
8246                    fdomain_client::fidl::FDomainResourceDialect
8247                ),
8248                dir: fidl::new_empty!(
8249                    fidl::encoding::Endpoint<
8250                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8251                    >,
8252                    fdomain_client::fidl::FDomainResourceDialect
8253                ),
8254            }
8255        }
8256
8257        #[inline]
8258        unsafe fn decode(
8259            &mut self,
8260            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8261            offset: usize,
8262            _depth: fidl::encoding::Depth,
8263        ) -> fidl::Result<()> {
8264            decoder.debug_check_bounds::<Self>(offset);
8265            // Verify that padding bytes are zero.
8266            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(48) };
8267            let padval = unsafe { (ptr as *const u64).read_unaligned() };
8268            let mask = 0xffffffff00000000u64;
8269            let maskedval = padval & mask;
8270            if maskedval != 0 {
8271                return Err(fidl::Error::NonZeroPadding {
8272                    padding_start: offset + 48 + ((mask as u64).trailing_zeros() / 8) as usize,
8273                });
8274            }
8275            fidl::decode!(
8276                BlobInfo,
8277                fdomain_client::fidl::FDomainResourceDialect,
8278                &mut self.meta_far_blob,
8279                decoder,
8280                offset + 0,
8281                _depth
8282            )?;
8283            fidl::decode!(
8284                GcProtection,
8285                fdomain_client::fidl::FDomainResourceDialect,
8286                &mut self.gc_protection,
8287                decoder,
8288                offset + 40,
8289                _depth
8290            )?;
8291            fidl::decode!(
8292                fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<NeededBlobsMarker>>,
8293                fdomain_client::fidl::FDomainResourceDialect,
8294                &mut self.needed_blobs,
8295                decoder,
8296                offset + 44,
8297                _depth
8298            )?;
8299            fidl::decode!(
8300                fidl::encoding::Endpoint<
8301                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8302                >,
8303                fdomain_client::fidl::FDomainResourceDialect,
8304                &mut self.dir,
8305                decoder,
8306                offset + 48,
8307                _depth
8308            )?;
8309            Ok(())
8310        }
8311    }
8312
8313    impl fidl::encoding::ResourceTypeMarker for PackageCacheGetSubpackageRequest {
8314        type Borrowed<'a> = &'a mut Self;
8315        fn take_or_borrow<'a>(
8316            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
8317        ) -> Self::Borrowed<'a> {
8318            value
8319        }
8320    }
8321
8322    unsafe impl fidl::encoding::TypeMarker for PackageCacheGetSubpackageRequest {
8323        type Owned = Self;
8324
8325        #[inline(always)]
8326        fn inline_align(_context: fidl::encoding::Context) -> usize {
8327            8
8328        }
8329
8330        #[inline(always)]
8331        fn inline_size(_context: fidl::encoding::Context) -> usize {
8332            56
8333        }
8334    }
8335
8336    unsafe impl
8337        fidl::encoding::Encode<
8338            PackageCacheGetSubpackageRequest,
8339            fdomain_client::fidl::FDomainResourceDialect,
8340        > for &mut PackageCacheGetSubpackageRequest
8341    {
8342        #[inline]
8343        unsafe fn encode(
8344            self,
8345            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8346            offset: usize,
8347            _depth: fidl::encoding::Depth,
8348        ) -> fidl::Result<()> {
8349            encoder.debug_check_bounds::<PackageCacheGetSubpackageRequest>(offset);
8350            // Delegate to tuple encoding.
8351            fidl::encoding::Encode::<
8352                PackageCacheGetSubpackageRequest,
8353                fdomain_client::fidl::FDomainResourceDialect,
8354            >::encode(
8355                (
8356                    <BlobId as fidl::encoding::ValueTypeMarker>::borrow(&self.superpackage),
8357                    <PackageUrl as fidl::encoding::ValueTypeMarker>::borrow(&self.subpackage),
8358                    <fidl::encoding::Endpoint<
8359                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8360                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
8361                        &mut self.dir
8362                    ),
8363                ),
8364                encoder,
8365                offset,
8366                _depth,
8367            )
8368        }
8369    }
8370    unsafe impl<
8371        T0: fidl::encoding::Encode<BlobId, fdomain_client::fidl::FDomainResourceDialect>,
8372        T1: fidl::encoding::Encode<PackageUrl, fdomain_client::fidl::FDomainResourceDialect>,
8373        T2: fidl::encoding::Encode<
8374                fidl::encoding::Endpoint<
8375                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8376                >,
8377                fdomain_client::fidl::FDomainResourceDialect,
8378            >,
8379    >
8380        fidl::encoding::Encode<
8381            PackageCacheGetSubpackageRequest,
8382            fdomain_client::fidl::FDomainResourceDialect,
8383        > for (T0, T1, T2)
8384    {
8385        #[inline]
8386        unsafe fn encode(
8387            self,
8388            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8389            offset: usize,
8390            depth: fidl::encoding::Depth,
8391        ) -> fidl::Result<()> {
8392            encoder.debug_check_bounds::<PackageCacheGetSubpackageRequest>(offset);
8393            // Zero out padding regions. There's no need to apply masks
8394            // because the unmasked parts will be overwritten by fields.
8395            unsafe {
8396                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(48);
8397                (ptr as *mut u64).write_unaligned(0);
8398            }
8399            // Write the fields.
8400            self.0.encode(encoder, offset + 0, depth)?;
8401            self.1.encode(encoder, offset + 32, depth)?;
8402            self.2.encode(encoder, offset + 48, depth)?;
8403            Ok(())
8404        }
8405    }
8406
8407    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
8408        for PackageCacheGetSubpackageRequest
8409    {
8410        #[inline(always)]
8411        fn new_empty() -> Self {
8412            Self {
8413                superpackage: fidl::new_empty!(
8414                    BlobId,
8415                    fdomain_client::fidl::FDomainResourceDialect
8416                ),
8417                subpackage: fidl::new_empty!(
8418                    PackageUrl,
8419                    fdomain_client::fidl::FDomainResourceDialect
8420                ),
8421                dir: fidl::new_empty!(
8422                    fidl::encoding::Endpoint<
8423                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8424                    >,
8425                    fdomain_client::fidl::FDomainResourceDialect
8426                ),
8427            }
8428        }
8429
8430        #[inline]
8431        unsafe fn decode(
8432            &mut self,
8433            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8434            offset: usize,
8435            _depth: fidl::encoding::Depth,
8436        ) -> fidl::Result<()> {
8437            decoder.debug_check_bounds::<Self>(offset);
8438            // Verify that padding bytes are zero.
8439            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(48) };
8440            let padval = unsafe { (ptr as *const u64).read_unaligned() };
8441            let mask = 0xffffffff00000000u64;
8442            let maskedval = padval & mask;
8443            if maskedval != 0 {
8444                return Err(fidl::Error::NonZeroPadding {
8445                    padding_start: offset + 48 + ((mask as u64).trailing_zeros() / 8) as usize,
8446                });
8447            }
8448            fidl::decode!(
8449                BlobId,
8450                fdomain_client::fidl::FDomainResourceDialect,
8451                &mut self.superpackage,
8452                decoder,
8453                offset + 0,
8454                _depth
8455            )?;
8456            fidl::decode!(
8457                PackageUrl,
8458                fdomain_client::fidl::FDomainResourceDialect,
8459                &mut self.subpackage,
8460                decoder,
8461                offset + 32,
8462                _depth
8463            )?;
8464            fidl::decode!(
8465                fidl::encoding::Endpoint<
8466                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8467                >,
8468                fdomain_client::fidl::FDomainResourceDialect,
8469                &mut self.dir,
8470                decoder,
8471                offset + 48,
8472                _depth
8473            )?;
8474            Ok(())
8475        }
8476    }
8477
8478    impl fidl::encoding::ResourceTypeMarker for PackageCacheWriteBlobsRequest {
8479        type Borrowed<'a> = &'a mut Self;
8480        fn take_or_borrow<'a>(
8481            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
8482        ) -> Self::Borrowed<'a> {
8483            value
8484        }
8485    }
8486
8487    unsafe impl fidl::encoding::TypeMarker for PackageCacheWriteBlobsRequest {
8488        type Owned = Self;
8489
8490        #[inline(always)]
8491        fn inline_align(_context: fidl::encoding::Context) -> usize {
8492            4
8493        }
8494
8495        #[inline(always)]
8496        fn inline_size(_context: fidl::encoding::Context) -> usize {
8497            4
8498        }
8499    }
8500
8501    unsafe impl
8502        fidl::encoding::Encode<
8503            PackageCacheWriteBlobsRequest,
8504            fdomain_client::fidl::FDomainResourceDialect,
8505        > for &mut PackageCacheWriteBlobsRequest
8506    {
8507        #[inline]
8508        unsafe fn encode(
8509            self,
8510            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8511            offset: usize,
8512            _depth: fidl::encoding::Depth,
8513        ) -> fidl::Result<()> {
8514            encoder.debug_check_bounds::<PackageCacheWriteBlobsRequest>(offset);
8515            // Delegate to tuple encoding.
8516            fidl::encoding::Encode::<PackageCacheWriteBlobsRequest, fdomain_client::fidl::FDomainResourceDialect>::encode(
8517                (
8518                    <fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<NeededBlobsMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.needed_blobs),
8519                ),
8520                encoder, offset, _depth
8521            )
8522        }
8523    }
8524    unsafe impl<
8525        T0: fidl::encoding::Encode<
8526                fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<NeededBlobsMarker>>,
8527                fdomain_client::fidl::FDomainResourceDialect,
8528            >,
8529    >
8530        fidl::encoding::Encode<
8531            PackageCacheWriteBlobsRequest,
8532            fdomain_client::fidl::FDomainResourceDialect,
8533        > for (T0,)
8534    {
8535        #[inline]
8536        unsafe fn encode(
8537            self,
8538            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8539            offset: usize,
8540            depth: fidl::encoding::Depth,
8541        ) -> fidl::Result<()> {
8542            encoder.debug_check_bounds::<PackageCacheWriteBlobsRequest>(offset);
8543            // Zero out padding regions. There's no need to apply masks
8544            // because the unmasked parts will be overwritten by fields.
8545            // Write the fields.
8546            self.0.encode(encoder, offset + 0, depth)?;
8547            Ok(())
8548        }
8549    }
8550
8551    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
8552        for PackageCacheWriteBlobsRequest
8553    {
8554        #[inline(always)]
8555        fn new_empty() -> Self {
8556            Self {
8557                needed_blobs: fidl::new_empty!(
8558                    fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<NeededBlobsMarker>>,
8559                    fdomain_client::fidl::FDomainResourceDialect
8560                ),
8561            }
8562        }
8563
8564        #[inline]
8565        unsafe fn decode(
8566            &mut self,
8567            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8568            offset: usize,
8569            _depth: fidl::encoding::Depth,
8570        ) -> fidl::Result<()> {
8571            decoder.debug_check_bounds::<Self>(offset);
8572            // Verify that padding bytes are zero.
8573            fidl::decode!(
8574                fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<NeededBlobsMarker>>,
8575                fdomain_client::fidl::FDomainResourceDialect,
8576                &mut self.needed_blobs,
8577                decoder,
8578                offset + 0,
8579                _depth
8580            )?;
8581            Ok(())
8582        }
8583    }
8584
8585    impl fidl::encoding::ResourceTypeMarker for PackageResolverResolveRequest {
8586        type Borrowed<'a> = &'a mut Self;
8587        fn take_or_borrow<'a>(
8588            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
8589        ) -> Self::Borrowed<'a> {
8590            value
8591        }
8592    }
8593
8594    unsafe impl fidl::encoding::TypeMarker for PackageResolverResolveRequest {
8595        type Owned = Self;
8596
8597        #[inline(always)]
8598        fn inline_align(_context: fidl::encoding::Context) -> usize {
8599            8
8600        }
8601
8602        #[inline(always)]
8603        fn inline_size(_context: fidl::encoding::Context) -> usize {
8604            24
8605        }
8606    }
8607
8608    unsafe impl
8609        fidl::encoding::Encode<
8610            PackageResolverResolveRequest,
8611            fdomain_client::fidl::FDomainResourceDialect,
8612        > for &mut PackageResolverResolveRequest
8613    {
8614        #[inline]
8615        unsafe fn encode(
8616            self,
8617            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8618            offset: usize,
8619            _depth: fidl::encoding::Depth,
8620        ) -> fidl::Result<()> {
8621            encoder.debug_check_bounds::<PackageResolverResolveRequest>(offset);
8622            // Delegate to tuple encoding.
8623            fidl::encoding::Encode::<
8624                PackageResolverResolveRequest,
8625                fdomain_client::fidl::FDomainResourceDialect,
8626            >::encode(
8627                (
8628                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow(
8629                        &self.package_url,
8630                    ),
8631                    <fidl::encoding::Endpoint<
8632                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8633                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
8634                        &mut self.dir
8635                    ),
8636                ),
8637                encoder,
8638                offset,
8639                _depth,
8640            )
8641        }
8642    }
8643    unsafe impl<
8644        T0: fidl::encoding::Encode<
8645                fidl::encoding::UnboundedString,
8646                fdomain_client::fidl::FDomainResourceDialect,
8647            >,
8648        T1: fidl::encoding::Encode<
8649                fidl::encoding::Endpoint<
8650                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8651                >,
8652                fdomain_client::fidl::FDomainResourceDialect,
8653            >,
8654    >
8655        fidl::encoding::Encode<
8656            PackageResolverResolveRequest,
8657            fdomain_client::fidl::FDomainResourceDialect,
8658        > for (T0, T1)
8659    {
8660        #[inline]
8661        unsafe fn encode(
8662            self,
8663            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8664            offset: usize,
8665            depth: fidl::encoding::Depth,
8666        ) -> fidl::Result<()> {
8667            encoder.debug_check_bounds::<PackageResolverResolveRequest>(offset);
8668            // Zero out padding regions. There's no need to apply masks
8669            // because the unmasked parts will be overwritten by fields.
8670            unsafe {
8671                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
8672                (ptr as *mut u64).write_unaligned(0);
8673            }
8674            // Write the fields.
8675            self.0.encode(encoder, offset + 0, depth)?;
8676            self.1.encode(encoder, offset + 16, depth)?;
8677            Ok(())
8678        }
8679    }
8680
8681    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
8682        for PackageResolverResolveRequest
8683    {
8684        #[inline(always)]
8685        fn new_empty() -> Self {
8686            Self {
8687                package_url: fidl::new_empty!(
8688                    fidl::encoding::UnboundedString,
8689                    fdomain_client::fidl::FDomainResourceDialect
8690                ),
8691                dir: fidl::new_empty!(
8692                    fidl::encoding::Endpoint<
8693                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8694                    >,
8695                    fdomain_client::fidl::FDomainResourceDialect
8696                ),
8697            }
8698        }
8699
8700        #[inline]
8701        unsafe fn decode(
8702            &mut self,
8703            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8704            offset: usize,
8705            _depth: fidl::encoding::Depth,
8706        ) -> fidl::Result<()> {
8707            decoder.debug_check_bounds::<Self>(offset);
8708            // Verify that padding bytes are zero.
8709            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
8710            let padval = unsafe { (ptr as *const u64).read_unaligned() };
8711            let mask = 0xffffffff00000000u64;
8712            let maskedval = padval & mask;
8713            if maskedval != 0 {
8714                return Err(fidl::Error::NonZeroPadding {
8715                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
8716                });
8717            }
8718            fidl::decode!(
8719                fidl::encoding::UnboundedString,
8720                fdomain_client::fidl::FDomainResourceDialect,
8721                &mut self.package_url,
8722                decoder,
8723                offset + 0,
8724                _depth
8725            )?;
8726            fidl::decode!(
8727                fidl::encoding::Endpoint<
8728                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8729                >,
8730                fdomain_client::fidl::FDomainResourceDialect,
8731                &mut self.dir,
8732                decoder,
8733                offset + 16,
8734                _depth
8735            )?;
8736            Ok(())
8737        }
8738    }
8739
8740    impl fidl::encoding::ResourceTypeMarker for PackageResolverResolveWithContextRequest {
8741        type Borrowed<'a> = &'a mut Self;
8742        fn take_or_borrow<'a>(
8743            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
8744        ) -> Self::Borrowed<'a> {
8745            value
8746        }
8747    }
8748
8749    unsafe impl fidl::encoding::TypeMarker for PackageResolverResolveWithContextRequest {
8750        type Owned = Self;
8751
8752        #[inline(always)]
8753        fn inline_align(_context: fidl::encoding::Context) -> usize {
8754            8
8755        }
8756
8757        #[inline(always)]
8758        fn inline_size(_context: fidl::encoding::Context) -> usize {
8759            40
8760        }
8761    }
8762
8763    unsafe impl
8764        fidl::encoding::Encode<
8765            PackageResolverResolveWithContextRequest,
8766            fdomain_client::fidl::FDomainResourceDialect,
8767        > for &mut PackageResolverResolveWithContextRequest
8768    {
8769        #[inline]
8770        unsafe fn encode(
8771            self,
8772            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8773            offset: usize,
8774            _depth: fidl::encoding::Depth,
8775        ) -> fidl::Result<()> {
8776            encoder.debug_check_bounds::<PackageResolverResolveWithContextRequest>(offset);
8777            // Delegate to tuple encoding.
8778            fidl::encoding::Encode::<
8779                PackageResolverResolveWithContextRequest,
8780                fdomain_client::fidl::FDomainResourceDialect,
8781            >::encode(
8782                (
8783                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow(
8784                        &self.package_url,
8785                    ),
8786                    <ResolutionContext as fidl::encoding::ValueTypeMarker>::borrow(&self.context),
8787                    <fidl::encoding::Endpoint<
8788                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8789                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
8790                        &mut self.dir
8791                    ),
8792                ),
8793                encoder,
8794                offset,
8795                _depth,
8796            )
8797        }
8798    }
8799    unsafe impl<
8800        T0: fidl::encoding::Encode<
8801                fidl::encoding::UnboundedString,
8802                fdomain_client::fidl::FDomainResourceDialect,
8803            >,
8804        T1: fidl::encoding::Encode<ResolutionContext, fdomain_client::fidl::FDomainResourceDialect>,
8805        T2: fidl::encoding::Encode<
8806                fidl::encoding::Endpoint<
8807                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8808                >,
8809                fdomain_client::fidl::FDomainResourceDialect,
8810            >,
8811    >
8812        fidl::encoding::Encode<
8813            PackageResolverResolveWithContextRequest,
8814            fdomain_client::fidl::FDomainResourceDialect,
8815        > for (T0, T1, T2)
8816    {
8817        #[inline]
8818        unsafe fn encode(
8819            self,
8820            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8821            offset: usize,
8822            depth: fidl::encoding::Depth,
8823        ) -> fidl::Result<()> {
8824            encoder.debug_check_bounds::<PackageResolverResolveWithContextRequest>(offset);
8825            // Zero out padding regions. There's no need to apply masks
8826            // because the unmasked parts will be overwritten by fields.
8827            unsafe {
8828                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(32);
8829                (ptr as *mut u64).write_unaligned(0);
8830            }
8831            // Write the fields.
8832            self.0.encode(encoder, offset + 0, depth)?;
8833            self.1.encode(encoder, offset + 16, depth)?;
8834            self.2.encode(encoder, offset + 32, depth)?;
8835            Ok(())
8836        }
8837    }
8838
8839    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
8840        for PackageResolverResolveWithContextRequest
8841    {
8842        #[inline(always)]
8843        fn new_empty() -> Self {
8844            Self {
8845                package_url: fidl::new_empty!(
8846                    fidl::encoding::UnboundedString,
8847                    fdomain_client::fidl::FDomainResourceDialect
8848                ),
8849                context: fidl::new_empty!(
8850                    ResolutionContext,
8851                    fdomain_client::fidl::FDomainResourceDialect
8852                ),
8853                dir: fidl::new_empty!(
8854                    fidl::encoding::Endpoint<
8855                        fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8856                    >,
8857                    fdomain_client::fidl::FDomainResourceDialect
8858                ),
8859            }
8860        }
8861
8862        #[inline]
8863        unsafe fn decode(
8864            &mut self,
8865            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8866            offset: usize,
8867            _depth: fidl::encoding::Depth,
8868        ) -> fidl::Result<()> {
8869            decoder.debug_check_bounds::<Self>(offset);
8870            // Verify that padding bytes are zero.
8871            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(32) };
8872            let padval = unsafe { (ptr as *const u64).read_unaligned() };
8873            let mask = 0xffffffff00000000u64;
8874            let maskedval = padval & mask;
8875            if maskedval != 0 {
8876                return Err(fidl::Error::NonZeroPadding {
8877                    padding_start: offset + 32 + ((mask as u64).trailing_zeros() / 8) as usize,
8878                });
8879            }
8880            fidl::decode!(
8881                fidl::encoding::UnboundedString,
8882                fdomain_client::fidl::FDomainResourceDialect,
8883                &mut self.package_url,
8884                decoder,
8885                offset + 0,
8886                _depth
8887            )?;
8888            fidl::decode!(
8889                ResolutionContext,
8890                fdomain_client::fidl::FDomainResourceDialect,
8891                &mut self.context,
8892                decoder,
8893                offset + 16,
8894                _depth
8895            )?;
8896            fidl::decode!(
8897                fidl::encoding::Endpoint<
8898                    fdomain_client::fidl::ServerEnd<fdomain_fuchsia_io::DirectoryMarker>,
8899                >,
8900                fdomain_client::fidl::FDomainResourceDialect,
8901                &mut self.dir,
8902                decoder,
8903                offset + 32,
8904                _depth
8905            )?;
8906            Ok(())
8907        }
8908    }
8909
8910    impl fidl::encoding::ResourceTypeMarker for RepositoryManagerListRequest {
8911        type Borrowed<'a> = &'a mut Self;
8912        fn take_or_borrow<'a>(
8913            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
8914        ) -> Self::Borrowed<'a> {
8915            value
8916        }
8917    }
8918
8919    unsafe impl fidl::encoding::TypeMarker for RepositoryManagerListRequest {
8920        type Owned = Self;
8921
8922        #[inline(always)]
8923        fn inline_align(_context: fidl::encoding::Context) -> usize {
8924            4
8925        }
8926
8927        #[inline(always)]
8928        fn inline_size(_context: fidl::encoding::Context) -> usize {
8929            4
8930        }
8931    }
8932
8933    unsafe impl
8934        fidl::encoding::Encode<
8935            RepositoryManagerListRequest,
8936            fdomain_client::fidl::FDomainResourceDialect,
8937        > for &mut RepositoryManagerListRequest
8938    {
8939        #[inline]
8940        unsafe fn encode(
8941            self,
8942            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8943            offset: usize,
8944            _depth: fidl::encoding::Depth,
8945        ) -> fidl::Result<()> {
8946            encoder.debug_check_bounds::<RepositoryManagerListRequest>(offset);
8947            // Delegate to tuple encoding.
8948            fidl::encoding::Encode::<
8949                RepositoryManagerListRequest,
8950                fdomain_client::fidl::FDomainResourceDialect,
8951            >::encode(
8952                (<fidl::encoding::Endpoint<
8953                    fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>,
8954                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
8955                    &mut self.iterator
8956                ),),
8957                encoder,
8958                offset,
8959                _depth,
8960            )
8961        }
8962    }
8963    unsafe impl<
8964        T0: fidl::encoding::Encode<
8965                fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>>,
8966                fdomain_client::fidl::FDomainResourceDialect,
8967            >,
8968    >
8969        fidl::encoding::Encode<
8970            RepositoryManagerListRequest,
8971            fdomain_client::fidl::FDomainResourceDialect,
8972        > for (T0,)
8973    {
8974        #[inline]
8975        unsafe fn encode(
8976            self,
8977            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
8978            offset: usize,
8979            depth: fidl::encoding::Depth,
8980        ) -> fidl::Result<()> {
8981            encoder.debug_check_bounds::<RepositoryManagerListRequest>(offset);
8982            // Zero out padding regions. There's no need to apply masks
8983            // because the unmasked parts will be overwritten by fields.
8984            // Write the fields.
8985            self.0.encode(encoder, offset + 0, depth)?;
8986            Ok(())
8987        }
8988    }
8989
8990    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
8991        for RepositoryManagerListRequest
8992    {
8993        #[inline(always)]
8994        fn new_empty() -> Self {
8995            Self {
8996                iterator: fidl::new_empty!(
8997                    fidl::encoding::Endpoint<
8998                        fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>,
8999                    >,
9000                    fdomain_client::fidl::FDomainResourceDialect
9001                ),
9002            }
9003        }
9004
9005        #[inline]
9006        unsafe fn decode(
9007            &mut self,
9008            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
9009            offset: usize,
9010            _depth: fidl::encoding::Depth,
9011        ) -> fidl::Result<()> {
9012            decoder.debug_check_bounds::<Self>(offset);
9013            // Verify that padding bytes are zero.
9014            fidl::decode!(
9015                fidl::encoding::Endpoint<fdomain_client::fidl::ServerEnd<RepositoryIteratorMarker>>,
9016                fdomain_client::fidl::FDomainResourceDialect,
9017                &mut self.iterator,
9018                decoder,
9019                offset + 0,
9020                _depth
9021            )?;
9022            Ok(())
9023        }
9024    }
9025
9026    impl fidl::encoding::ResourceTypeMarker for RetainedBlobsReplaceRequest {
9027        type Borrowed<'a> = &'a mut Self;
9028        fn take_or_borrow<'a>(
9029            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
9030        ) -> Self::Borrowed<'a> {
9031            value
9032        }
9033    }
9034
9035    unsafe impl fidl::encoding::TypeMarker for RetainedBlobsReplaceRequest {
9036        type Owned = Self;
9037
9038        #[inline(always)]
9039        fn inline_align(_context: fidl::encoding::Context) -> usize {
9040            4
9041        }
9042
9043        #[inline(always)]
9044        fn inline_size(_context: fidl::encoding::Context) -> usize {
9045            4
9046        }
9047    }
9048
9049    unsafe impl
9050        fidl::encoding::Encode<
9051            RetainedBlobsReplaceRequest,
9052            fdomain_client::fidl::FDomainResourceDialect,
9053        > for &mut RetainedBlobsReplaceRequest
9054    {
9055        #[inline]
9056        unsafe fn encode(
9057            self,
9058            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
9059            offset: usize,
9060            _depth: fidl::encoding::Depth,
9061        ) -> fidl::Result<()> {
9062            encoder.debug_check_bounds::<RetainedBlobsReplaceRequest>(offset);
9063            // Delegate to tuple encoding.
9064            fidl::encoding::Encode::<RetainedBlobsReplaceRequest, fdomain_client::fidl::FDomainResourceDialect>::encode(
9065                (
9066                    <fidl::encoding::Endpoint<fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.iterator),
9067                ),
9068                encoder, offset, _depth
9069            )
9070        }
9071    }
9072    unsafe impl<
9073        T0: fidl::encoding::Encode<
9074                fidl::encoding::Endpoint<fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>>,
9075                fdomain_client::fidl::FDomainResourceDialect,
9076            >,
9077    >
9078        fidl::encoding::Encode<
9079            RetainedBlobsReplaceRequest,
9080            fdomain_client::fidl::FDomainResourceDialect,
9081        > for (T0,)
9082    {
9083        #[inline]
9084        unsafe fn encode(
9085            self,
9086            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
9087            offset: usize,
9088            depth: fidl::encoding::Depth,
9089        ) -> fidl::Result<()> {
9090            encoder.debug_check_bounds::<RetainedBlobsReplaceRequest>(offset);
9091            // Zero out padding regions. There's no need to apply masks
9092            // because the unmasked parts will be overwritten by fields.
9093            // Write the fields.
9094            self.0.encode(encoder, offset + 0, depth)?;
9095            Ok(())
9096        }
9097    }
9098
9099    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
9100        for RetainedBlobsReplaceRequest
9101    {
9102        #[inline(always)]
9103        fn new_empty() -> Self {
9104            Self {
9105                iterator: fidl::new_empty!(
9106                    fidl::encoding::Endpoint<fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>>,
9107                    fdomain_client::fidl::FDomainResourceDialect
9108                ),
9109            }
9110        }
9111
9112        #[inline]
9113        unsafe fn decode(
9114            &mut self,
9115            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
9116            offset: usize,
9117            _depth: fidl::encoding::Depth,
9118        ) -> fidl::Result<()> {
9119            decoder.debug_check_bounds::<Self>(offset);
9120            // Verify that padding bytes are zero.
9121            fidl::decode!(
9122                fidl::encoding::Endpoint<fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>>,
9123                fdomain_client::fidl::FDomainResourceDialect,
9124                &mut self.iterator,
9125                decoder,
9126                offset + 0,
9127                _depth
9128            )?;
9129            Ok(())
9130        }
9131    }
9132
9133    impl fidl::encoding::ResourceTypeMarker for RetainedPackagesReplaceRequest {
9134        type Borrowed<'a> = &'a mut Self;
9135        fn take_or_borrow<'a>(
9136            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
9137        ) -> Self::Borrowed<'a> {
9138            value
9139        }
9140    }
9141
9142    unsafe impl fidl::encoding::TypeMarker for RetainedPackagesReplaceRequest {
9143        type Owned = Self;
9144
9145        #[inline(always)]
9146        fn inline_align(_context: fidl::encoding::Context) -> usize {
9147            4
9148        }
9149
9150        #[inline(always)]
9151        fn inline_size(_context: fidl::encoding::Context) -> usize {
9152            4
9153        }
9154    }
9155
9156    unsafe impl
9157        fidl::encoding::Encode<
9158            RetainedPackagesReplaceRequest,
9159            fdomain_client::fidl::FDomainResourceDialect,
9160        > for &mut RetainedPackagesReplaceRequest
9161    {
9162        #[inline]
9163        unsafe fn encode(
9164            self,
9165            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
9166            offset: usize,
9167            _depth: fidl::encoding::Depth,
9168        ) -> fidl::Result<()> {
9169            encoder.debug_check_bounds::<RetainedPackagesReplaceRequest>(offset);
9170            // Delegate to tuple encoding.
9171            fidl::encoding::Encode::<RetainedPackagesReplaceRequest, fdomain_client::fidl::FDomainResourceDialect>::encode(
9172                (
9173                    <fidl::encoding::Endpoint<fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.iterator),
9174                ),
9175                encoder, offset, _depth
9176            )
9177        }
9178    }
9179    unsafe impl<
9180        T0: fidl::encoding::Encode<
9181                fidl::encoding::Endpoint<fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>>,
9182                fdomain_client::fidl::FDomainResourceDialect,
9183            >,
9184    >
9185        fidl::encoding::Encode<
9186            RetainedPackagesReplaceRequest,
9187            fdomain_client::fidl::FDomainResourceDialect,
9188        > for (T0,)
9189    {
9190        #[inline]
9191        unsafe fn encode(
9192            self,
9193            encoder: &mut fidl::encoding::Encoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
9194            offset: usize,
9195            depth: fidl::encoding::Depth,
9196        ) -> fidl::Result<()> {
9197            encoder.debug_check_bounds::<RetainedPackagesReplaceRequest>(offset);
9198            // Zero out padding regions. There's no need to apply masks
9199            // because the unmasked parts will be overwritten by fields.
9200            // Write the fields.
9201            self.0.encode(encoder, offset + 0, depth)?;
9202            Ok(())
9203        }
9204    }
9205
9206    impl fidl::encoding::Decode<Self, fdomain_client::fidl::FDomainResourceDialect>
9207        for RetainedPackagesReplaceRequest
9208    {
9209        #[inline(always)]
9210        fn new_empty() -> Self {
9211            Self {
9212                iterator: fidl::new_empty!(
9213                    fidl::encoding::Endpoint<fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>>,
9214                    fdomain_client::fidl::FDomainResourceDialect
9215                ),
9216            }
9217        }
9218
9219        #[inline]
9220        unsafe fn decode(
9221            &mut self,
9222            decoder: &mut fidl::encoding::Decoder<'_, fdomain_client::fidl::FDomainResourceDialect>,
9223            offset: usize,
9224            _depth: fidl::encoding::Depth,
9225        ) -> fidl::Result<()> {
9226            decoder.debug_check_bounds::<Self>(offset);
9227            // Verify that padding bytes are zero.
9228            fidl::decode!(
9229                fidl::encoding::Endpoint<fdomain_client::fidl::ClientEnd<BlobIdIteratorMarker>>,
9230                fdomain_client::fidl::FDomainResourceDialect,
9231                &mut self.iterator,
9232                decoder,
9233                offset + 0,
9234                _depth
9235            )?;
9236            Ok(())
9237        }
9238    }
9239}