Skip to main content

fidl_fuchsia_fonts/
fidl_fuchsia_fonts.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_fonts_common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct ProviderGetFontResponse {
16    pub response: Option<Box<Response>>,
17}
18
19impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ProviderGetFontResponse {}
20
21#[derive(Debug, PartialEq)]
22pub struct ProviderGetTypefaceResponse {
23    pub response: TypefaceResponse,
24}
25
26impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
27    for ProviderGetTypefaceResponse
28{
29}
30
31#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
32pub struct ProviderRegisterFontSetEventListenerRequest {
33    pub listener: fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
34}
35
36impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
37    for ProviderRegisterFontSetEventListenerRequest
38{
39}
40
41#[derive(Debug, PartialEq)]
42pub struct Response {
43    pub buffer: fidl_fuchsia_mem::Buffer,
44    /// Buffer identifier for the buffer. Responses with the same buffer_id are
45    /// guaranteed to contain the same data in the buffer. Clients may use this
46    /// value to detect if they already have the font cached in parsed form.
47    pub buffer_id: u32,
48    /// Font index within `buffer`. Used for font formats that may contain more
49    /// than one font per file, e.g. TTC (TrueType Collection).
50    pub font_index: u32,
51}
52
53impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Response {}
54
55/// Response to a TypefaceRequest. Contains the digital font file and metadata corresponding to a
56/// returned typeface. Clients are expected to cache the results if they plan to reuse them.
57///
58/// If a matching typeface cannot be found, the table will be empty.
59#[derive(Debug, Default, PartialEq)]
60pub struct TypefaceResponse {
61    /// A memory buffer containing the bytes of a digital font file.
62    /// It is the client's responsibility to identify the type of file and to parse it (usually by
63    /// delegating to FreeType or a similar library).
64    pub buffer: Option<fidl_fuchsia_mem::Buffer>,
65    /// Identifier for the buffer. Responses with the same `buffer_id` are guaranteed to contain the
66    /// same data in the buffer. Clients may use this value to detect if they already have the font
67    /// cached in parsed form.
68    pub buffer_id: Option<u32>,
69    /// Index of the returned typeface within `buffer`. Used for digital font formats that may
70    /// contain more than one typeface per file, e.g. TTC (TrueType Collection).
71    pub font_index: Option<u32>,
72    #[doc(hidden)]
73    pub __source_breaking: fidl::marker::SourceBreaking,
74}
75
76impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for TypefaceResponse {}
77
78#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
79pub struct FontSetEventListenerMarker;
80
81impl fidl::endpoints::ProtocolMarker for FontSetEventListenerMarker {
82    type Proxy = FontSetEventListenerProxy;
83    type RequestStream = FontSetEventListenerRequestStream;
84    #[cfg(target_os = "fuchsia")]
85    type SynchronousProxy = FontSetEventListenerSynchronousProxy;
86
87    const DEBUG_NAME: &'static str = "(anonymous) FontSetEventListener";
88}
89
90pub trait FontSetEventListenerProxyInterface: Send + Sync {
91    type OnFontSetUpdatedResponseFut: std::future::Future<Output = Result<(), fidl::Error>> + Send;
92    fn r#on_font_set_updated(
93        &self,
94        event: &FontSetUpdatedEvent,
95    ) -> Self::OnFontSetUpdatedResponseFut;
96}
97#[derive(Debug)]
98#[cfg(target_os = "fuchsia")]
99pub struct FontSetEventListenerSynchronousProxy {
100    client: fidl::client::sync::Client,
101}
102
103#[cfg(target_os = "fuchsia")]
104impl fidl::endpoints::SynchronousProxy for FontSetEventListenerSynchronousProxy {
105    type Proxy = FontSetEventListenerProxy;
106    type Protocol = FontSetEventListenerMarker;
107
108    fn from_channel(inner: fidl::Channel) -> Self {
109        Self::new(inner)
110    }
111
112    fn into_channel(self) -> fidl::Channel {
113        self.client.into_channel()
114    }
115
116    fn as_channel(&self) -> &fidl::Channel {
117        self.client.as_channel()
118    }
119}
120
121#[cfg(target_os = "fuchsia")]
122impl FontSetEventListenerSynchronousProxy {
123    pub fn new(channel: fidl::Channel) -> Self {
124        Self { client: fidl::client::sync::Client::new(channel) }
125    }
126
127    pub fn into_channel(self) -> fidl::Channel {
128        self.client.into_channel()
129    }
130
131    /// Waits until an event arrives and returns it. It is safe for other
132    /// threads to make concurrent requests while waiting for an event.
133    pub fn wait_for_event(
134        &self,
135        deadline: zx::MonotonicInstant,
136    ) -> Result<FontSetEventListenerEvent, fidl::Error> {
137        FontSetEventListenerEvent::decode(
138            self.client.wait_for_event::<FontSetEventListenerMarker>(deadline)?,
139        )
140    }
141
142    /// The set of fonts available in the `Provider` has changed. See
143    /// [`fuchsia.fonts/FontSetUpdatedEvent`].
144    pub fn r#on_font_set_updated(
145        &self,
146        mut event: &FontSetUpdatedEvent,
147        ___deadline: zx::MonotonicInstant,
148    ) -> Result<(), fidl::Error> {
149        let _response = self.client.send_query::<
150            FontSetEventListenerOnFontSetUpdatedRequest,
151            fidl::encoding::EmptyPayload,
152            FontSetEventListenerMarker,
153        >(
154            (event,),
155            0xf0cd2d121f881f9,
156            fidl::encoding::DynamicFlags::empty(),
157            ___deadline,
158        )?;
159        Ok(_response)
160    }
161}
162
163#[cfg(target_os = "fuchsia")]
164impl From<FontSetEventListenerSynchronousProxy> for zx::NullableHandle {
165    fn from(value: FontSetEventListenerSynchronousProxy) -> Self {
166        value.into_channel().into()
167    }
168}
169
170#[cfg(target_os = "fuchsia")]
171impl From<fidl::Channel> for FontSetEventListenerSynchronousProxy {
172    fn from(value: fidl::Channel) -> Self {
173        Self::new(value)
174    }
175}
176
177#[cfg(target_os = "fuchsia")]
178impl fidl::endpoints::FromClient for FontSetEventListenerSynchronousProxy {
179    type Protocol = FontSetEventListenerMarker;
180
181    fn from_client(value: fidl::endpoints::ClientEnd<FontSetEventListenerMarker>) -> Self {
182        Self::new(value.into_channel())
183    }
184}
185
186#[derive(Debug, Clone)]
187pub struct FontSetEventListenerProxy {
188    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
189}
190
191impl fidl::endpoints::Proxy for FontSetEventListenerProxy {
192    type Protocol = FontSetEventListenerMarker;
193
194    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
195        Self::new(inner)
196    }
197
198    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
199        self.client.into_channel().map_err(|client| Self { client })
200    }
201
202    fn as_channel(&self) -> &::fidl::AsyncChannel {
203        self.client.as_channel()
204    }
205}
206
207impl FontSetEventListenerProxy {
208    /// Create a new Proxy for fuchsia.fonts/FontSetEventListener.
209    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
210        let protocol_name =
211            <FontSetEventListenerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
212        Self { client: fidl::client::Client::new(channel, protocol_name) }
213    }
214
215    /// Get a Stream of events from the remote end of the protocol.
216    ///
217    /// # Panics
218    ///
219    /// Panics if the event stream was already taken.
220    pub fn take_event_stream(&self) -> FontSetEventListenerEventStream {
221        FontSetEventListenerEventStream { event_receiver: self.client.take_event_receiver() }
222    }
223
224    /// The set of fonts available in the `Provider` has changed. See
225    /// [`fuchsia.fonts/FontSetUpdatedEvent`].
226    pub fn r#on_font_set_updated(
227        &self,
228        mut event: &FontSetUpdatedEvent,
229    ) -> fidl::client::QueryResponseFut<(), fidl::encoding::DefaultFuchsiaResourceDialect> {
230        FontSetEventListenerProxyInterface::r#on_font_set_updated(self, event)
231    }
232}
233
234impl FontSetEventListenerProxyInterface for FontSetEventListenerProxy {
235    type OnFontSetUpdatedResponseFut =
236        fidl::client::QueryResponseFut<(), fidl::encoding::DefaultFuchsiaResourceDialect>;
237    fn r#on_font_set_updated(
238        &self,
239        mut event: &FontSetUpdatedEvent,
240    ) -> Self::OnFontSetUpdatedResponseFut {
241        fn _decode(
242            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
243        ) -> Result<(), fidl::Error> {
244            let _response = fidl::client::decode_transaction_body::<
245                fidl::encoding::EmptyPayload,
246                fidl::encoding::DefaultFuchsiaResourceDialect,
247                0xf0cd2d121f881f9,
248            >(_buf?)?;
249            Ok(_response)
250        }
251        self.client.send_query_and_decode::<FontSetEventListenerOnFontSetUpdatedRequest, ()>(
252            (event,),
253            0xf0cd2d121f881f9,
254            fidl::encoding::DynamicFlags::empty(),
255            _decode,
256        )
257    }
258}
259
260pub struct FontSetEventListenerEventStream {
261    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
262}
263
264impl std::marker::Unpin for FontSetEventListenerEventStream {}
265
266impl futures::stream::FusedStream for FontSetEventListenerEventStream {
267    fn is_terminated(&self) -> bool {
268        self.event_receiver.is_terminated()
269    }
270}
271
272impl futures::Stream for FontSetEventListenerEventStream {
273    type Item = Result<FontSetEventListenerEvent, fidl::Error>;
274
275    fn poll_next(
276        mut self: std::pin::Pin<&mut Self>,
277        cx: &mut std::task::Context<'_>,
278    ) -> std::task::Poll<Option<Self::Item>> {
279        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
280            &mut self.event_receiver,
281            cx
282        )?) {
283            Some(buf) => std::task::Poll::Ready(Some(FontSetEventListenerEvent::decode(buf))),
284            None => std::task::Poll::Ready(None),
285        }
286    }
287}
288
289#[derive(Debug)]
290pub enum FontSetEventListenerEvent {}
291
292impl FontSetEventListenerEvent {
293    /// Decodes a message buffer as a [`FontSetEventListenerEvent`].
294    fn decode(
295        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
296    ) -> Result<FontSetEventListenerEvent, fidl::Error> {
297        let (bytes, _handles) = buf.split_mut();
298        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
299        debug_assert_eq!(tx_header.tx_id, 0);
300        match tx_header.ordinal {
301            _ => Err(fidl::Error::UnknownOrdinal {
302                ordinal: tx_header.ordinal,
303                protocol_name:
304                    <FontSetEventListenerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
305            }),
306        }
307    }
308}
309
310/// A Stream of incoming requests for fuchsia.fonts/FontSetEventListener.
311pub struct FontSetEventListenerRequestStream {
312    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
313    is_terminated: bool,
314}
315
316impl std::marker::Unpin for FontSetEventListenerRequestStream {}
317
318impl futures::stream::FusedStream for FontSetEventListenerRequestStream {
319    fn is_terminated(&self) -> bool {
320        self.is_terminated
321    }
322}
323
324impl fidl::endpoints::RequestStream for FontSetEventListenerRequestStream {
325    type Protocol = FontSetEventListenerMarker;
326    type ControlHandle = FontSetEventListenerControlHandle;
327
328    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
329        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
330    }
331
332    fn control_handle(&self) -> Self::ControlHandle {
333        FontSetEventListenerControlHandle { inner: self.inner.clone() }
334    }
335
336    fn into_inner(
337        self,
338    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
339    {
340        (self.inner, self.is_terminated)
341    }
342
343    fn from_inner(
344        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
345        is_terminated: bool,
346    ) -> Self {
347        Self { inner, is_terminated }
348    }
349}
350
351impl futures::Stream for FontSetEventListenerRequestStream {
352    type Item = Result<FontSetEventListenerRequest, fidl::Error>;
353
354    fn poll_next(
355        mut self: std::pin::Pin<&mut Self>,
356        cx: &mut std::task::Context<'_>,
357    ) -> std::task::Poll<Option<Self::Item>> {
358        let this = &mut *self;
359        if this.inner.check_shutdown(cx) {
360            this.is_terminated = true;
361            return std::task::Poll::Ready(None);
362        }
363        if this.is_terminated {
364            panic!("polled FontSetEventListenerRequestStream after completion");
365        }
366        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
367            |bytes, handles| {
368                match this.inner.channel().read_etc(cx, bytes, handles) {
369                    std::task::Poll::Ready(Ok(())) => {}
370                    std::task::Poll::Pending => return std::task::Poll::Pending,
371                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
372                        this.is_terminated = true;
373                        return std::task::Poll::Ready(None);
374                    }
375                    std::task::Poll::Ready(Err(e)) => {
376                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
377                            e.into(),
378                        ))));
379                    }
380                }
381
382                // A message has been received from the channel
383                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
384
385                std::task::Poll::Ready(Some(match header.ordinal {
386                0xf0cd2d121f881f9 => {
387                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
388                    let mut req = fidl::new_empty!(FontSetEventListenerOnFontSetUpdatedRequest, fidl::encoding::DefaultFuchsiaResourceDialect);
389                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<FontSetEventListenerOnFontSetUpdatedRequest>(&header, _body_bytes, handles, &mut req)?;
390                    let control_handle = FontSetEventListenerControlHandle {
391                        inner: this.inner.clone(),
392                    };
393                    Ok(FontSetEventListenerRequest::OnFontSetUpdated {event: req.event,
394
395                        responder: FontSetEventListenerOnFontSetUpdatedResponder {
396                            control_handle: std::mem::ManuallyDrop::new(control_handle),
397                            tx_id: header.tx_id,
398                        },
399                    })
400                }
401                _ => Err(fidl::Error::UnknownOrdinal {
402                    ordinal: header.ordinal,
403                    protocol_name: <FontSetEventListenerMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
404                }),
405            }))
406            },
407        )
408    }
409}
410
411/// Protocol for listening to possible events that may occur in the `Provider`'s set of fonts.
412///
413/// Register a listener using [`fuchsia.fonts/Provider.RegisterFontSetEventListener`].
414#[derive(Debug)]
415pub enum FontSetEventListenerRequest {
416    /// The set of fonts available in the `Provider` has changed. See
417    /// [`fuchsia.fonts/FontSetUpdatedEvent`].
418    OnFontSetUpdated {
419        event: FontSetUpdatedEvent,
420        responder: FontSetEventListenerOnFontSetUpdatedResponder,
421    },
422}
423
424impl FontSetEventListenerRequest {
425    #[allow(irrefutable_let_patterns)]
426    pub fn into_on_font_set_updated(
427        self,
428    ) -> Option<(FontSetUpdatedEvent, FontSetEventListenerOnFontSetUpdatedResponder)> {
429        if let FontSetEventListenerRequest::OnFontSetUpdated { event, responder } = self {
430            Some((event, responder))
431        } else {
432            None
433        }
434    }
435
436    /// Name of the method defined in FIDL
437    pub fn method_name(&self) -> &'static str {
438        match *self {
439            FontSetEventListenerRequest::OnFontSetUpdated { .. } => "on_font_set_updated",
440        }
441    }
442}
443
444#[derive(Debug, Clone)]
445pub struct FontSetEventListenerControlHandle {
446    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
447}
448
449impl FontSetEventListenerControlHandle {
450    pub fn shutdown_with_epitaph(&self, status: impl Into<fidl::Epitaph>) {
451        self.inner.shutdown_with_epitaph(status.into())
452    }
453}
454
455impl fidl::endpoints::ControlHandle for FontSetEventListenerControlHandle {
456    fn shutdown(&self) {
457        self.inner.shutdown()
458    }
459
460    fn shutdown_with_epitaph(&self, status: fidl::Epitaph) {
461        self.inner.shutdown_with_epitaph(status)
462    }
463
464    fn is_closed(&self) -> bool {
465        self.inner.channel().is_closed()
466    }
467    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
468        self.inner.channel().on_closed()
469    }
470
471    #[cfg(target_os = "fuchsia")]
472    fn signal_peer(
473        &self,
474        clear_mask: zx::Signals,
475        set_mask: zx::Signals,
476    ) -> Result<(), zx_status::Status> {
477        use fidl::Peered;
478        self.inner.channel().signal_peer(clear_mask, set_mask)
479    }
480}
481
482impl FontSetEventListenerControlHandle {}
483
484#[must_use = "FIDL methods require a response to be sent"]
485#[derive(Debug)]
486pub struct FontSetEventListenerOnFontSetUpdatedResponder {
487    control_handle: std::mem::ManuallyDrop<FontSetEventListenerControlHandle>,
488    tx_id: u32,
489}
490
491/// Set the the channel to be shutdown (see [`FontSetEventListenerControlHandle::shutdown`])
492/// if the responder is dropped without sending a response, so that the client
493/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
494impl std::ops::Drop for FontSetEventListenerOnFontSetUpdatedResponder {
495    fn drop(&mut self) {
496        self.control_handle.shutdown();
497        // Safety: drops once, never accessed again
498        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
499    }
500}
501
502impl fidl::endpoints::Responder for FontSetEventListenerOnFontSetUpdatedResponder {
503    type ControlHandle = FontSetEventListenerControlHandle;
504
505    fn control_handle(&self) -> &FontSetEventListenerControlHandle {
506        &self.control_handle
507    }
508
509    fn drop_without_shutdown(mut self) {
510        // Safety: drops once, never accessed again due to mem::forget
511        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
512        // Prevent Drop from running (which would shut down the channel)
513        std::mem::forget(self);
514    }
515}
516
517impl FontSetEventListenerOnFontSetUpdatedResponder {
518    /// Sends a response to the FIDL transaction.
519    ///
520    /// Sets the channel to shutdown if an error occurs.
521    pub fn send(self) -> Result<(), fidl::Error> {
522        let _result = self.send_raw();
523        if _result.is_err() {
524            self.control_handle.shutdown();
525        }
526        self.drop_without_shutdown();
527        _result
528    }
529
530    /// Similar to "send" but does not shutdown the channel if an error occurs.
531    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
532        let _result = self.send_raw();
533        self.drop_without_shutdown();
534        _result
535    }
536
537    fn send_raw(&self) -> Result<(), fidl::Error> {
538        self.control_handle.inner.send::<fidl::encoding::EmptyPayload>(
539            (),
540            self.tx_id,
541            0xf0cd2d121f881f9,
542            fidl::encoding::DynamicFlags::empty(),
543        )
544    }
545}
546
547#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
548pub struct ProviderMarker;
549
550impl fidl::endpoints::ProtocolMarker for ProviderMarker {
551    type Proxy = ProviderProxy;
552    type RequestStream = ProviderRequestStream;
553    #[cfg(target_os = "fuchsia")]
554    type SynchronousProxy = ProviderSynchronousProxy;
555
556    const DEBUG_NAME: &'static str = "fuchsia.fonts.Provider";
557}
558impl fidl::endpoints::DiscoverableProtocolMarker for ProviderMarker {}
559
560pub trait ProviderProxyInterface: Send + Sync {
561    type GetFontResponseFut: std::future::Future<Output = Result<Option<Box<Response>>, fidl::Error>>
562        + Send;
563    fn r#get_font(&self, request: &Request) -> Self::GetFontResponseFut;
564    type GetFamilyInfoResponseFut: std::future::Future<Output = Result<Option<Box<FamilyInfo>>, fidl::Error>>
565        + Send;
566    fn r#get_family_info(&self, family: &str) -> Self::GetFamilyInfoResponseFut;
567    type GetTypefaceResponseFut: std::future::Future<Output = Result<TypefaceResponse, fidl::Error>>
568        + Send;
569    fn r#get_typeface(&self, request: &TypefaceRequest) -> Self::GetTypefaceResponseFut;
570    type GetFontFamilyInfoResponseFut: std::future::Future<Output = Result<FontFamilyInfo, fidl::Error>>
571        + Send;
572    fn r#get_font_family_info(&self, family: &FamilyName) -> Self::GetFontFamilyInfoResponseFut;
573    type RegisterFontSetEventListenerResponseFut: std::future::Future<Output = Result<(), fidl::Error>>
574        + Send;
575    fn r#register_font_set_event_listener(
576        &self,
577        listener: fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
578    ) -> Self::RegisterFontSetEventListenerResponseFut;
579}
580#[derive(Debug)]
581#[cfg(target_os = "fuchsia")]
582pub struct ProviderSynchronousProxy {
583    client: fidl::client::sync::Client,
584}
585
586#[cfg(target_os = "fuchsia")]
587impl fidl::endpoints::SynchronousProxy for ProviderSynchronousProxy {
588    type Proxy = ProviderProxy;
589    type Protocol = ProviderMarker;
590
591    fn from_channel(inner: fidl::Channel) -> Self {
592        Self::new(inner)
593    }
594
595    fn into_channel(self) -> fidl::Channel {
596        self.client.into_channel()
597    }
598
599    fn as_channel(&self) -> &fidl::Channel {
600        self.client.as_channel()
601    }
602}
603
604#[cfg(target_os = "fuchsia")]
605impl ProviderSynchronousProxy {
606    pub fn new(channel: fidl::Channel) -> Self {
607        Self { client: fidl::client::sync::Client::new(channel) }
608    }
609
610    pub fn into_channel(self) -> fidl::Channel {
611        self.client.into_channel()
612    }
613
614    /// Waits until an event arrives and returns it. It is safe for other
615    /// threads to make concurrent requests while waiting for an event.
616    pub fn wait_for_event(
617        &self,
618        deadline: zx::MonotonicInstant,
619    ) -> Result<ProviderEvent, fidl::Error> {
620        ProviderEvent::decode(self.client.wait_for_event::<ProviderMarker>(deadline)?)
621    }
622
623    /// Deprecated. See `GetTypeface`.
624    ///
625    /// Returns font that matches specified `request`.
626    pub fn r#get_font(
627        &self,
628        mut request: &Request,
629        ___deadline: zx::MonotonicInstant,
630    ) -> Result<Option<Box<Response>>, fidl::Error> {
631        let _response = self
632            .client
633            .send_query::<ProviderGetFontRequest, ProviderGetFontResponse, ProviderMarker>(
634                (request,),
635                0x6daeaad83184076b,
636                fidl::encoding::DynamicFlags::empty(),
637                ___deadline,
638            )?;
639        Ok(_response.response)
640    }
641
642    /// Deprecated. See `GetFontFamilyInfo`.
643    ///
644    /// Returns information for the specified font family or null if there is
645    /// no family with the specified name. This function respects family name
646    /// aliases and ignores case, so request for "robotoSLAB" will return
647    /// FamilyInfo for "Roboto Slab".
648    pub fn r#get_family_info(
649        &self,
650        mut family: &str,
651        ___deadline: zx::MonotonicInstant,
652    ) -> Result<Option<Box<FamilyInfo>>, fidl::Error> {
653        let _response = self.client.send_query::<
654            ProviderGetFamilyInfoRequest,
655            ProviderGetFamilyInfoResponse,
656            ProviderMarker,
657        >(
658            (family,),
659            0x27aba13280090db3,
660            fidl::encoding::DynamicFlags::empty(),
661            ___deadline,
662        )?;
663        Ok(_response.family_info)
664    }
665
666    /// Returns a typeface that matches the specified `request`, or an empty table if no matching
667    /// face is found. (The latter is more likely to happen if `TypefaceRequestFlags.EXACT_FAMILY`
668    /// is used to disable fallbacks.)
669    pub fn r#get_typeface(
670        &self,
671        mut request: &TypefaceRequest,
672        ___deadline: zx::MonotonicInstant,
673    ) -> Result<TypefaceResponse, fidl::Error> {
674        let _response = self
675            .client
676            .send_query::<ProviderGetTypefaceRequest, ProviderGetTypefaceResponse, ProviderMarker>(
677                (request,),
678                0x5481d24f1a4b0671,
679                fidl::encoding::DynamicFlags::empty(),
680                ___deadline,
681            )?;
682        Ok(_response.response)
683    }
684
685    /// Returns information for the specified font family, or an empty table if there is no family
686    /// with the specified name.
687    ///
688    /// This function respects family name aliases and ignores case. For example, "RobotoSlab" is an
689    /// alias for the canonical name "Roboto Slab". A request for "robotoSLAB" would return the
690    /// `FontFamilyInfo` for "Roboto Slab" due to the case-insensitivity and alias resolution.
691    pub fn r#get_font_family_info(
692        &self,
693        mut family: &FamilyName,
694        ___deadline: zx::MonotonicInstant,
695    ) -> Result<FontFamilyInfo, fidl::Error> {
696        let _response = self.client.send_query::<
697            ProviderGetFontFamilyInfoRequest,
698            ProviderGetFontFamilyInfoResponse,
699            ProviderMarker,
700        >(
701            (family,),
702            0x7520ee83bf25c9ca,
703            fidl::encoding::DynamicFlags::empty(),
704            ___deadline,
705        )?;
706        Ok(_response.family_info)
707    }
708
709    /// Register a listener to be notified when the set of available fonts or mappings has changed.
710    /// A client can register as many listeners as it wishes.
711    ///
712    /// To unregister, close the channel.
713    pub fn r#register_font_set_event_listener(
714        &self,
715        mut listener: fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
716        ___deadline: zx::MonotonicInstant,
717    ) -> Result<(), fidl::Error> {
718        let _response = self.client.send_query::<
719            ProviderRegisterFontSetEventListenerRequest,
720            fidl::encoding::EmptyPayload,
721            ProviderMarker,
722        >(
723            (listener,),
724            0x196898fd17cb694c,
725            fidl::encoding::DynamicFlags::empty(),
726            ___deadline,
727        )?;
728        Ok(_response)
729    }
730}
731
732#[cfg(target_os = "fuchsia")]
733impl From<ProviderSynchronousProxy> for zx::NullableHandle {
734    fn from(value: ProviderSynchronousProxy) -> Self {
735        value.into_channel().into()
736    }
737}
738
739#[cfg(target_os = "fuchsia")]
740impl From<fidl::Channel> for ProviderSynchronousProxy {
741    fn from(value: fidl::Channel) -> Self {
742        Self::new(value)
743    }
744}
745
746#[cfg(target_os = "fuchsia")]
747impl fidl::endpoints::FromClient for ProviderSynchronousProxy {
748    type Protocol = ProviderMarker;
749
750    fn from_client(value: fidl::endpoints::ClientEnd<ProviderMarker>) -> Self {
751        Self::new(value.into_channel())
752    }
753}
754
755#[derive(Debug, Clone)]
756pub struct ProviderProxy {
757    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
758}
759
760impl fidl::endpoints::Proxy for ProviderProxy {
761    type Protocol = ProviderMarker;
762
763    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
764        Self::new(inner)
765    }
766
767    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
768        self.client.into_channel().map_err(|client| Self { client })
769    }
770
771    fn as_channel(&self) -> &::fidl::AsyncChannel {
772        self.client.as_channel()
773    }
774}
775
776impl ProviderProxy {
777    /// Create a new Proxy for fuchsia.fonts/Provider.
778    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
779        let protocol_name = <ProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
780        Self { client: fidl::client::Client::new(channel, protocol_name) }
781    }
782
783    /// Get a Stream of events from the remote end of the protocol.
784    ///
785    /// # Panics
786    ///
787    /// Panics if the event stream was already taken.
788    pub fn take_event_stream(&self) -> ProviderEventStream {
789        ProviderEventStream { event_receiver: self.client.take_event_receiver() }
790    }
791
792    /// Deprecated. See `GetTypeface`.
793    ///
794    /// Returns font that matches specified `request`.
795    pub fn r#get_font(
796        &self,
797        mut request: &Request,
798    ) -> fidl::client::QueryResponseFut<
799        Option<Box<Response>>,
800        fidl::encoding::DefaultFuchsiaResourceDialect,
801    > {
802        ProviderProxyInterface::r#get_font(self, request)
803    }
804
805    /// Deprecated. See `GetFontFamilyInfo`.
806    ///
807    /// Returns information for the specified font family or null if there is
808    /// no family with the specified name. This function respects family name
809    /// aliases and ignores case, so request for "robotoSLAB" will return
810    /// FamilyInfo for "Roboto Slab".
811    pub fn r#get_family_info(
812        &self,
813        mut family: &str,
814    ) -> fidl::client::QueryResponseFut<
815        Option<Box<FamilyInfo>>,
816        fidl::encoding::DefaultFuchsiaResourceDialect,
817    > {
818        ProviderProxyInterface::r#get_family_info(self, family)
819    }
820
821    /// Returns a typeface that matches the specified `request`, or an empty table if no matching
822    /// face is found. (The latter is more likely to happen if `TypefaceRequestFlags.EXACT_FAMILY`
823    /// is used to disable fallbacks.)
824    pub fn r#get_typeface(
825        &self,
826        mut request: &TypefaceRequest,
827    ) -> fidl::client::QueryResponseFut<
828        TypefaceResponse,
829        fidl::encoding::DefaultFuchsiaResourceDialect,
830    > {
831        ProviderProxyInterface::r#get_typeface(self, request)
832    }
833
834    /// Returns information for the specified font family, or an empty table if there is no family
835    /// with the specified name.
836    ///
837    /// This function respects family name aliases and ignores case. For example, "RobotoSlab" is an
838    /// alias for the canonical name "Roboto Slab". A request for "robotoSLAB" would return the
839    /// `FontFamilyInfo` for "Roboto Slab" due to the case-insensitivity and alias resolution.
840    pub fn r#get_font_family_info(
841        &self,
842        mut family: &FamilyName,
843    ) -> fidl::client::QueryResponseFut<FontFamilyInfo, fidl::encoding::DefaultFuchsiaResourceDialect>
844    {
845        ProviderProxyInterface::r#get_font_family_info(self, family)
846    }
847
848    /// Register a listener to be notified when the set of available fonts or mappings has changed.
849    /// A client can register as many listeners as it wishes.
850    ///
851    /// To unregister, close the channel.
852    pub fn r#register_font_set_event_listener(
853        &self,
854        mut listener: fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
855    ) -> fidl::client::QueryResponseFut<(), fidl::encoding::DefaultFuchsiaResourceDialect> {
856        ProviderProxyInterface::r#register_font_set_event_listener(self, listener)
857    }
858}
859
860impl ProviderProxyInterface for ProviderProxy {
861    type GetFontResponseFut = fidl::client::QueryResponseFut<
862        Option<Box<Response>>,
863        fidl::encoding::DefaultFuchsiaResourceDialect,
864    >;
865    fn r#get_font(&self, mut request: &Request) -> Self::GetFontResponseFut {
866        fn _decode(
867            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
868        ) -> Result<Option<Box<Response>>, fidl::Error> {
869            let _response = fidl::client::decode_transaction_body::<
870                ProviderGetFontResponse,
871                fidl::encoding::DefaultFuchsiaResourceDialect,
872                0x6daeaad83184076b,
873            >(_buf?)?;
874            Ok(_response.response)
875        }
876        self.client.send_query_and_decode::<ProviderGetFontRequest, Option<Box<Response>>>(
877            (request,),
878            0x6daeaad83184076b,
879            fidl::encoding::DynamicFlags::empty(),
880            _decode,
881        )
882    }
883
884    type GetFamilyInfoResponseFut = fidl::client::QueryResponseFut<
885        Option<Box<FamilyInfo>>,
886        fidl::encoding::DefaultFuchsiaResourceDialect,
887    >;
888    fn r#get_family_info(&self, mut family: &str) -> Self::GetFamilyInfoResponseFut {
889        fn _decode(
890            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
891        ) -> Result<Option<Box<FamilyInfo>>, fidl::Error> {
892            let _response = fidl::client::decode_transaction_body::<
893                ProviderGetFamilyInfoResponse,
894                fidl::encoding::DefaultFuchsiaResourceDialect,
895                0x27aba13280090db3,
896            >(_buf?)?;
897            Ok(_response.family_info)
898        }
899        self.client.send_query_and_decode::<ProviderGetFamilyInfoRequest, Option<Box<FamilyInfo>>>(
900            (family,),
901            0x27aba13280090db3,
902            fidl::encoding::DynamicFlags::empty(),
903            _decode,
904        )
905    }
906
907    type GetTypefaceResponseFut = fidl::client::QueryResponseFut<
908        TypefaceResponse,
909        fidl::encoding::DefaultFuchsiaResourceDialect,
910    >;
911    fn r#get_typeface(&self, mut request: &TypefaceRequest) -> Self::GetTypefaceResponseFut {
912        fn _decode(
913            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
914        ) -> Result<TypefaceResponse, fidl::Error> {
915            let _response = fidl::client::decode_transaction_body::<
916                ProviderGetTypefaceResponse,
917                fidl::encoding::DefaultFuchsiaResourceDialect,
918                0x5481d24f1a4b0671,
919            >(_buf?)?;
920            Ok(_response.response)
921        }
922        self.client.send_query_and_decode::<ProviderGetTypefaceRequest, TypefaceResponse>(
923            (request,),
924            0x5481d24f1a4b0671,
925            fidl::encoding::DynamicFlags::empty(),
926            _decode,
927        )
928    }
929
930    type GetFontFamilyInfoResponseFut = fidl::client::QueryResponseFut<
931        FontFamilyInfo,
932        fidl::encoding::DefaultFuchsiaResourceDialect,
933    >;
934    fn r#get_font_family_info(
935        &self,
936        mut family: &FamilyName,
937    ) -> Self::GetFontFamilyInfoResponseFut {
938        fn _decode(
939            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
940        ) -> Result<FontFamilyInfo, fidl::Error> {
941            let _response = fidl::client::decode_transaction_body::<
942                ProviderGetFontFamilyInfoResponse,
943                fidl::encoding::DefaultFuchsiaResourceDialect,
944                0x7520ee83bf25c9ca,
945            >(_buf?)?;
946            Ok(_response.family_info)
947        }
948        self.client.send_query_and_decode::<ProviderGetFontFamilyInfoRequest, FontFamilyInfo>(
949            (family,),
950            0x7520ee83bf25c9ca,
951            fidl::encoding::DynamicFlags::empty(),
952            _decode,
953        )
954    }
955
956    type RegisterFontSetEventListenerResponseFut =
957        fidl::client::QueryResponseFut<(), fidl::encoding::DefaultFuchsiaResourceDialect>;
958    fn r#register_font_set_event_listener(
959        &self,
960        mut listener: fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
961    ) -> Self::RegisterFontSetEventListenerResponseFut {
962        fn _decode(
963            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
964        ) -> Result<(), fidl::Error> {
965            let _response = fidl::client::decode_transaction_body::<
966                fidl::encoding::EmptyPayload,
967                fidl::encoding::DefaultFuchsiaResourceDialect,
968                0x196898fd17cb694c,
969            >(_buf?)?;
970            Ok(_response)
971        }
972        self.client.send_query_and_decode::<ProviderRegisterFontSetEventListenerRequest, ()>(
973            (listener,),
974            0x196898fd17cb694c,
975            fidl::encoding::DynamicFlags::empty(),
976            _decode,
977        )
978    }
979}
980
981pub struct ProviderEventStream {
982    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
983}
984
985impl std::marker::Unpin for ProviderEventStream {}
986
987impl futures::stream::FusedStream for ProviderEventStream {
988    fn is_terminated(&self) -> bool {
989        self.event_receiver.is_terminated()
990    }
991}
992
993impl futures::Stream for ProviderEventStream {
994    type Item = Result<ProviderEvent, fidl::Error>;
995
996    fn poll_next(
997        mut self: std::pin::Pin<&mut Self>,
998        cx: &mut std::task::Context<'_>,
999    ) -> std::task::Poll<Option<Self::Item>> {
1000        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
1001            &mut self.event_receiver,
1002            cx
1003        )?) {
1004            Some(buf) => std::task::Poll::Ready(Some(ProviderEvent::decode(buf))),
1005            None => std::task::Poll::Ready(None),
1006        }
1007    }
1008}
1009
1010#[derive(Debug)]
1011pub enum ProviderEvent {}
1012
1013impl ProviderEvent {
1014    /// Decodes a message buffer as a [`ProviderEvent`].
1015    fn decode(
1016        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
1017    ) -> Result<ProviderEvent, fidl::Error> {
1018        let (bytes, _handles) = buf.split_mut();
1019        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1020        debug_assert_eq!(tx_header.tx_id, 0);
1021        match tx_header.ordinal {
1022            _ => Err(fidl::Error::UnknownOrdinal {
1023                ordinal: tx_header.ordinal,
1024                protocol_name: <ProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1025            }),
1026        }
1027    }
1028}
1029
1030/// A Stream of incoming requests for fuchsia.fonts/Provider.
1031pub struct ProviderRequestStream {
1032    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1033    is_terminated: bool,
1034}
1035
1036impl std::marker::Unpin for ProviderRequestStream {}
1037
1038impl futures::stream::FusedStream for ProviderRequestStream {
1039    fn is_terminated(&self) -> bool {
1040        self.is_terminated
1041    }
1042}
1043
1044impl fidl::endpoints::RequestStream for ProviderRequestStream {
1045    type Protocol = ProviderMarker;
1046    type ControlHandle = ProviderControlHandle;
1047
1048    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
1049        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
1050    }
1051
1052    fn control_handle(&self) -> Self::ControlHandle {
1053        ProviderControlHandle { inner: self.inner.clone() }
1054    }
1055
1056    fn into_inner(
1057        self,
1058    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
1059    {
1060        (self.inner, self.is_terminated)
1061    }
1062
1063    fn from_inner(
1064        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1065        is_terminated: bool,
1066    ) -> Self {
1067        Self { inner, is_terminated }
1068    }
1069}
1070
1071impl futures::Stream for ProviderRequestStream {
1072    type Item = Result<ProviderRequest, fidl::Error>;
1073
1074    fn poll_next(
1075        mut self: std::pin::Pin<&mut Self>,
1076        cx: &mut std::task::Context<'_>,
1077    ) -> std::task::Poll<Option<Self::Item>> {
1078        let this = &mut *self;
1079        if this.inner.check_shutdown(cx) {
1080            this.is_terminated = true;
1081            return std::task::Poll::Ready(None);
1082        }
1083        if this.is_terminated {
1084            panic!("polled ProviderRequestStream after completion");
1085        }
1086        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
1087            |bytes, handles| {
1088                match this.inner.channel().read_etc(cx, bytes, handles) {
1089                    std::task::Poll::Ready(Ok(())) => {}
1090                    std::task::Poll::Pending => return std::task::Poll::Pending,
1091                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
1092                        this.is_terminated = true;
1093                        return std::task::Poll::Ready(None);
1094                    }
1095                    std::task::Poll::Ready(Err(e)) => {
1096                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
1097                            e.into(),
1098                        ))));
1099                    }
1100                }
1101
1102                // A message has been received from the channel
1103                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
1104
1105                std::task::Poll::Ready(Some(match header.ordinal {
1106                    0x6daeaad83184076b => {
1107                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1108                        let mut req = fidl::new_empty!(
1109                            ProviderGetFontRequest,
1110                            fidl::encoding::DefaultFuchsiaResourceDialect
1111                        );
1112                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ProviderGetFontRequest>(&header, _body_bytes, handles, &mut req)?;
1113                        let control_handle = ProviderControlHandle { inner: this.inner.clone() };
1114                        Ok(ProviderRequest::GetFont {
1115                            request: req.request,
1116
1117                            responder: ProviderGetFontResponder {
1118                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1119                                tx_id: header.tx_id,
1120                            },
1121                        })
1122                    }
1123                    0x27aba13280090db3 => {
1124                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1125                        let mut req = fidl::new_empty!(
1126                            ProviderGetFamilyInfoRequest,
1127                            fidl::encoding::DefaultFuchsiaResourceDialect
1128                        );
1129                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ProviderGetFamilyInfoRequest>(&header, _body_bytes, handles, &mut req)?;
1130                        let control_handle = ProviderControlHandle { inner: this.inner.clone() };
1131                        Ok(ProviderRequest::GetFamilyInfo {
1132                            family: req.family,
1133
1134                            responder: ProviderGetFamilyInfoResponder {
1135                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1136                                tx_id: header.tx_id,
1137                            },
1138                        })
1139                    }
1140                    0x5481d24f1a4b0671 => {
1141                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1142                        let mut req = fidl::new_empty!(
1143                            ProviderGetTypefaceRequest,
1144                            fidl::encoding::DefaultFuchsiaResourceDialect
1145                        );
1146                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ProviderGetTypefaceRequest>(&header, _body_bytes, handles, &mut req)?;
1147                        let control_handle = ProviderControlHandle { inner: this.inner.clone() };
1148                        Ok(ProviderRequest::GetTypeface {
1149                            request: req.request,
1150
1151                            responder: ProviderGetTypefaceResponder {
1152                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1153                                tx_id: header.tx_id,
1154                            },
1155                        })
1156                    }
1157                    0x7520ee83bf25c9ca => {
1158                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1159                        let mut req = fidl::new_empty!(
1160                            ProviderGetFontFamilyInfoRequest,
1161                            fidl::encoding::DefaultFuchsiaResourceDialect
1162                        );
1163                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ProviderGetFontFamilyInfoRequest>(&header, _body_bytes, handles, &mut req)?;
1164                        let control_handle = ProviderControlHandle { inner: this.inner.clone() };
1165                        Ok(ProviderRequest::GetFontFamilyInfo {
1166                            family: req.family,
1167
1168                            responder: ProviderGetFontFamilyInfoResponder {
1169                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1170                                tx_id: header.tx_id,
1171                            },
1172                        })
1173                    }
1174                    0x196898fd17cb694c => {
1175                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
1176                        let mut req = fidl::new_empty!(
1177                            ProviderRegisterFontSetEventListenerRequest,
1178                            fidl::encoding::DefaultFuchsiaResourceDialect
1179                        );
1180                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ProviderRegisterFontSetEventListenerRequest>(&header, _body_bytes, handles, &mut req)?;
1181                        let control_handle = ProviderControlHandle { inner: this.inner.clone() };
1182                        Ok(ProviderRequest::RegisterFontSetEventListener {
1183                            listener: req.listener,
1184
1185                            responder: ProviderRegisterFontSetEventListenerResponder {
1186                                control_handle: std::mem::ManuallyDrop::new(control_handle),
1187                                tx_id: header.tx_id,
1188                            },
1189                        })
1190                    }
1191                    _ => Err(fidl::Error::UnknownOrdinal {
1192                        ordinal: header.ordinal,
1193                        protocol_name:
1194                            <ProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
1195                    }),
1196                }))
1197            },
1198        )
1199    }
1200}
1201
1202/// Provider of digital font files and metadata.
1203///
1204/// TODO(https://fxbug.dev/42170326): Remove deprecated methods and move to provider.fidl.
1205#[derive(Debug)]
1206pub enum ProviderRequest {
1207    /// Deprecated. See `GetTypeface`.
1208    ///
1209    /// Returns font that matches specified `request`.
1210    GetFont { request: Request, responder: ProviderGetFontResponder },
1211    /// Deprecated. See `GetFontFamilyInfo`.
1212    ///
1213    /// Returns information for the specified font family or null if there is
1214    /// no family with the specified name. This function respects family name
1215    /// aliases and ignores case, so request for "robotoSLAB" will return
1216    /// FamilyInfo for "Roboto Slab".
1217    GetFamilyInfo { family: String, responder: ProviderGetFamilyInfoResponder },
1218    /// Returns a typeface that matches the specified `request`, or an empty table if no matching
1219    /// face is found. (The latter is more likely to happen if `TypefaceRequestFlags.EXACT_FAMILY`
1220    /// is used to disable fallbacks.)
1221    GetTypeface { request: TypefaceRequest, responder: ProviderGetTypefaceResponder },
1222    /// Returns information for the specified font family, or an empty table if there is no family
1223    /// with the specified name.
1224    ///
1225    /// This function respects family name aliases and ignores case. For example, "RobotoSlab" is an
1226    /// alias for the canonical name "Roboto Slab". A request for "robotoSLAB" would return the
1227    /// `FontFamilyInfo` for "Roboto Slab" due to the case-insensitivity and alias resolution.
1228    GetFontFamilyInfo { family: FamilyName, responder: ProviderGetFontFamilyInfoResponder },
1229    /// Register a listener to be notified when the set of available fonts or mappings has changed.
1230    /// A client can register as many listeners as it wishes.
1231    ///
1232    /// To unregister, close the channel.
1233    RegisterFontSetEventListener {
1234        listener: fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
1235        responder: ProviderRegisterFontSetEventListenerResponder,
1236    },
1237}
1238
1239impl ProviderRequest {
1240    #[allow(irrefutable_let_patterns)]
1241    pub fn into_get_font(self) -> Option<(Request, ProviderGetFontResponder)> {
1242        if let ProviderRequest::GetFont { request, responder } = self {
1243            Some((request, responder))
1244        } else {
1245            None
1246        }
1247    }
1248
1249    #[allow(irrefutable_let_patterns)]
1250    pub fn into_get_family_info(self) -> Option<(String, ProviderGetFamilyInfoResponder)> {
1251        if let ProviderRequest::GetFamilyInfo { family, responder } = self {
1252            Some((family, responder))
1253        } else {
1254            None
1255        }
1256    }
1257
1258    #[allow(irrefutable_let_patterns)]
1259    pub fn into_get_typeface(self) -> Option<(TypefaceRequest, ProviderGetTypefaceResponder)> {
1260        if let ProviderRequest::GetTypeface { request, responder } = self {
1261            Some((request, responder))
1262        } else {
1263            None
1264        }
1265    }
1266
1267    #[allow(irrefutable_let_patterns)]
1268    pub fn into_get_font_family_info(
1269        self,
1270    ) -> Option<(FamilyName, ProviderGetFontFamilyInfoResponder)> {
1271        if let ProviderRequest::GetFontFamilyInfo { family, responder } = self {
1272            Some((family, responder))
1273        } else {
1274            None
1275        }
1276    }
1277
1278    #[allow(irrefutable_let_patterns)]
1279    pub fn into_register_font_set_event_listener(
1280        self,
1281    ) -> Option<(
1282        fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
1283        ProviderRegisterFontSetEventListenerResponder,
1284    )> {
1285        if let ProviderRequest::RegisterFontSetEventListener { listener, responder } = self {
1286            Some((listener, responder))
1287        } else {
1288            None
1289        }
1290    }
1291
1292    /// Name of the method defined in FIDL
1293    pub fn method_name(&self) -> &'static str {
1294        match *self {
1295            ProviderRequest::GetFont { .. } => "get_font",
1296            ProviderRequest::GetFamilyInfo { .. } => "get_family_info",
1297            ProviderRequest::GetTypeface { .. } => "get_typeface",
1298            ProviderRequest::GetFontFamilyInfo { .. } => "get_font_family_info",
1299            ProviderRequest::RegisterFontSetEventListener { .. } => {
1300                "register_font_set_event_listener"
1301            }
1302        }
1303    }
1304}
1305
1306#[derive(Debug, Clone)]
1307pub struct ProviderControlHandle {
1308    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
1309}
1310
1311impl ProviderControlHandle {
1312    pub fn shutdown_with_epitaph(&self, status: impl Into<fidl::Epitaph>) {
1313        self.inner.shutdown_with_epitaph(status.into())
1314    }
1315}
1316
1317impl fidl::endpoints::ControlHandle for ProviderControlHandle {
1318    fn shutdown(&self) {
1319        self.inner.shutdown()
1320    }
1321
1322    fn shutdown_with_epitaph(&self, status: fidl::Epitaph) {
1323        self.inner.shutdown_with_epitaph(status)
1324    }
1325
1326    fn is_closed(&self) -> bool {
1327        self.inner.channel().is_closed()
1328    }
1329    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
1330        self.inner.channel().on_closed()
1331    }
1332
1333    #[cfg(target_os = "fuchsia")]
1334    fn signal_peer(
1335        &self,
1336        clear_mask: zx::Signals,
1337        set_mask: zx::Signals,
1338    ) -> Result<(), zx_status::Status> {
1339        use fidl::Peered;
1340        self.inner.channel().signal_peer(clear_mask, set_mask)
1341    }
1342}
1343
1344impl ProviderControlHandle {}
1345
1346#[must_use = "FIDL methods require a response to be sent"]
1347#[derive(Debug)]
1348pub struct ProviderGetFontResponder {
1349    control_handle: std::mem::ManuallyDrop<ProviderControlHandle>,
1350    tx_id: u32,
1351}
1352
1353/// Set the the channel to be shutdown (see [`ProviderControlHandle::shutdown`])
1354/// if the responder is dropped without sending a response, so that the client
1355/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1356impl std::ops::Drop for ProviderGetFontResponder {
1357    fn drop(&mut self) {
1358        self.control_handle.shutdown();
1359        // Safety: drops once, never accessed again
1360        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1361    }
1362}
1363
1364impl fidl::endpoints::Responder for ProviderGetFontResponder {
1365    type ControlHandle = ProviderControlHandle;
1366
1367    fn control_handle(&self) -> &ProviderControlHandle {
1368        &self.control_handle
1369    }
1370
1371    fn drop_without_shutdown(mut self) {
1372        // Safety: drops once, never accessed again due to mem::forget
1373        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1374        // Prevent Drop from running (which would shut down the channel)
1375        std::mem::forget(self);
1376    }
1377}
1378
1379impl ProviderGetFontResponder {
1380    /// Sends a response to the FIDL transaction.
1381    ///
1382    /// Sets the channel to shutdown if an error occurs.
1383    pub fn send(self, mut response: Option<Response>) -> Result<(), fidl::Error> {
1384        let _result = self.send_raw(response);
1385        if _result.is_err() {
1386            self.control_handle.shutdown();
1387        }
1388        self.drop_without_shutdown();
1389        _result
1390    }
1391
1392    /// Similar to "send" but does not shutdown the channel if an error occurs.
1393    pub fn send_no_shutdown_on_err(
1394        self,
1395        mut response: Option<Response>,
1396    ) -> Result<(), fidl::Error> {
1397        let _result = self.send_raw(response);
1398        self.drop_without_shutdown();
1399        _result
1400    }
1401
1402    fn send_raw(&self, mut response: Option<Response>) -> Result<(), fidl::Error> {
1403        self.control_handle.inner.send::<ProviderGetFontResponse>(
1404            (response.as_mut(),),
1405            self.tx_id,
1406            0x6daeaad83184076b,
1407            fidl::encoding::DynamicFlags::empty(),
1408        )
1409    }
1410}
1411
1412#[must_use = "FIDL methods require a response to be sent"]
1413#[derive(Debug)]
1414pub struct ProviderGetFamilyInfoResponder {
1415    control_handle: std::mem::ManuallyDrop<ProviderControlHandle>,
1416    tx_id: u32,
1417}
1418
1419/// Set the the channel to be shutdown (see [`ProviderControlHandle::shutdown`])
1420/// if the responder is dropped without sending a response, so that the client
1421/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1422impl std::ops::Drop for ProviderGetFamilyInfoResponder {
1423    fn drop(&mut self) {
1424        self.control_handle.shutdown();
1425        // Safety: drops once, never accessed again
1426        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1427    }
1428}
1429
1430impl fidl::endpoints::Responder for ProviderGetFamilyInfoResponder {
1431    type ControlHandle = ProviderControlHandle;
1432
1433    fn control_handle(&self) -> &ProviderControlHandle {
1434        &self.control_handle
1435    }
1436
1437    fn drop_without_shutdown(mut self) {
1438        // Safety: drops once, never accessed again due to mem::forget
1439        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1440        // Prevent Drop from running (which would shut down the channel)
1441        std::mem::forget(self);
1442    }
1443}
1444
1445impl ProviderGetFamilyInfoResponder {
1446    /// Sends a response to the FIDL transaction.
1447    ///
1448    /// Sets the channel to shutdown if an error occurs.
1449    pub fn send(self, mut family_info: Option<&FamilyInfo>) -> Result<(), fidl::Error> {
1450        let _result = self.send_raw(family_info);
1451        if _result.is_err() {
1452            self.control_handle.shutdown();
1453        }
1454        self.drop_without_shutdown();
1455        _result
1456    }
1457
1458    /// Similar to "send" but does not shutdown the channel if an error occurs.
1459    pub fn send_no_shutdown_on_err(
1460        self,
1461        mut family_info: Option<&FamilyInfo>,
1462    ) -> Result<(), fidl::Error> {
1463        let _result = self.send_raw(family_info);
1464        self.drop_without_shutdown();
1465        _result
1466    }
1467
1468    fn send_raw(&self, mut family_info: Option<&FamilyInfo>) -> Result<(), fidl::Error> {
1469        self.control_handle.inner.send::<ProviderGetFamilyInfoResponse>(
1470            (family_info,),
1471            self.tx_id,
1472            0x27aba13280090db3,
1473            fidl::encoding::DynamicFlags::empty(),
1474        )
1475    }
1476}
1477
1478#[must_use = "FIDL methods require a response to be sent"]
1479#[derive(Debug)]
1480pub struct ProviderGetTypefaceResponder {
1481    control_handle: std::mem::ManuallyDrop<ProviderControlHandle>,
1482    tx_id: u32,
1483}
1484
1485/// Set the the channel to be shutdown (see [`ProviderControlHandle::shutdown`])
1486/// if the responder is dropped without sending a response, so that the client
1487/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1488impl std::ops::Drop for ProviderGetTypefaceResponder {
1489    fn drop(&mut self) {
1490        self.control_handle.shutdown();
1491        // Safety: drops once, never accessed again
1492        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1493    }
1494}
1495
1496impl fidl::endpoints::Responder for ProviderGetTypefaceResponder {
1497    type ControlHandle = ProviderControlHandle;
1498
1499    fn control_handle(&self) -> &ProviderControlHandle {
1500        &self.control_handle
1501    }
1502
1503    fn drop_without_shutdown(mut self) {
1504        // Safety: drops once, never accessed again due to mem::forget
1505        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1506        // Prevent Drop from running (which would shut down the channel)
1507        std::mem::forget(self);
1508    }
1509}
1510
1511impl ProviderGetTypefaceResponder {
1512    /// Sends a response to the FIDL transaction.
1513    ///
1514    /// Sets the channel to shutdown if an error occurs.
1515    pub fn send(self, mut response: TypefaceResponse) -> Result<(), fidl::Error> {
1516        let _result = self.send_raw(response);
1517        if _result.is_err() {
1518            self.control_handle.shutdown();
1519        }
1520        self.drop_without_shutdown();
1521        _result
1522    }
1523
1524    /// Similar to "send" but does not shutdown the channel if an error occurs.
1525    pub fn send_no_shutdown_on_err(
1526        self,
1527        mut response: TypefaceResponse,
1528    ) -> Result<(), fidl::Error> {
1529        let _result = self.send_raw(response);
1530        self.drop_without_shutdown();
1531        _result
1532    }
1533
1534    fn send_raw(&self, mut response: TypefaceResponse) -> Result<(), fidl::Error> {
1535        self.control_handle.inner.send::<ProviderGetTypefaceResponse>(
1536            (&mut response,),
1537            self.tx_id,
1538            0x5481d24f1a4b0671,
1539            fidl::encoding::DynamicFlags::empty(),
1540        )
1541    }
1542}
1543
1544#[must_use = "FIDL methods require a response to be sent"]
1545#[derive(Debug)]
1546pub struct ProviderGetFontFamilyInfoResponder {
1547    control_handle: std::mem::ManuallyDrop<ProviderControlHandle>,
1548    tx_id: u32,
1549}
1550
1551/// Set the the channel to be shutdown (see [`ProviderControlHandle::shutdown`])
1552/// if the responder is dropped without sending a response, so that the client
1553/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1554impl std::ops::Drop for ProviderGetFontFamilyInfoResponder {
1555    fn drop(&mut self) {
1556        self.control_handle.shutdown();
1557        // Safety: drops once, never accessed again
1558        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1559    }
1560}
1561
1562impl fidl::endpoints::Responder for ProviderGetFontFamilyInfoResponder {
1563    type ControlHandle = ProviderControlHandle;
1564
1565    fn control_handle(&self) -> &ProviderControlHandle {
1566        &self.control_handle
1567    }
1568
1569    fn drop_without_shutdown(mut self) {
1570        // Safety: drops once, never accessed again due to mem::forget
1571        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1572        // Prevent Drop from running (which would shut down the channel)
1573        std::mem::forget(self);
1574    }
1575}
1576
1577impl ProviderGetFontFamilyInfoResponder {
1578    /// Sends a response to the FIDL transaction.
1579    ///
1580    /// Sets the channel to shutdown if an error occurs.
1581    pub fn send(self, mut family_info: &FontFamilyInfo) -> Result<(), fidl::Error> {
1582        let _result = self.send_raw(family_info);
1583        if _result.is_err() {
1584            self.control_handle.shutdown();
1585        }
1586        self.drop_without_shutdown();
1587        _result
1588    }
1589
1590    /// Similar to "send" but does not shutdown the channel if an error occurs.
1591    pub fn send_no_shutdown_on_err(
1592        self,
1593        mut family_info: &FontFamilyInfo,
1594    ) -> Result<(), fidl::Error> {
1595        let _result = self.send_raw(family_info);
1596        self.drop_without_shutdown();
1597        _result
1598    }
1599
1600    fn send_raw(&self, mut family_info: &FontFamilyInfo) -> Result<(), fidl::Error> {
1601        self.control_handle.inner.send::<ProviderGetFontFamilyInfoResponse>(
1602            (family_info,),
1603            self.tx_id,
1604            0x7520ee83bf25c9ca,
1605            fidl::encoding::DynamicFlags::empty(),
1606        )
1607    }
1608}
1609
1610#[must_use = "FIDL methods require a response to be sent"]
1611#[derive(Debug)]
1612pub struct ProviderRegisterFontSetEventListenerResponder {
1613    control_handle: std::mem::ManuallyDrop<ProviderControlHandle>,
1614    tx_id: u32,
1615}
1616
1617/// Set the the channel to be shutdown (see [`ProviderControlHandle::shutdown`])
1618/// if the responder is dropped without sending a response, so that the client
1619/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1620impl std::ops::Drop for ProviderRegisterFontSetEventListenerResponder {
1621    fn drop(&mut self) {
1622        self.control_handle.shutdown();
1623        // Safety: drops once, never accessed again
1624        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1625    }
1626}
1627
1628impl fidl::endpoints::Responder for ProviderRegisterFontSetEventListenerResponder {
1629    type ControlHandle = ProviderControlHandle;
1630
1631    fn control_handle(&self) -> &ProviderControlHandle {
1632        &self.control_handle
1633    }
1634
1635    fn drop_without_shutdown(mut self) {
1636        // Safety: drops once, never accessed again due to mem::forget
1637        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1638        // Prevent Drop from running (which would shut down the channel)
1639        std::mem::forget(self);
1640    }
1641}
1642
1643impl ProviderRegisterFontSetEventListenerResponder {
1644    /// Sends a response to the FIDL transaction.
1645    ///
1646    /// Sets the channel to shutdown if an error occurs.
1647    pub fn send(self) -> Result<(), fidl::Error> {
1648        let _result = self.send_raw();
1649        if _result.is_err() {
1650            self.control_handle.shutdown();
1651        }
1652        self.drop_without_shutdown();
1653        _result
1654    }
1655
1656    /// Similar to "send" but does not shutdown the channel if an error occurs.
1657    pub fn send_no_shutdown_on_err(self) -> Result<(), fidl::Error> {
1658        let _result = self.send_raw();
1659        self.drop_without_shutdown();
1660        _result
1661    }
1662
1663    fn send_raw(&self) -> Result<(), fidl::Error> {
1664        self.control_handle.inner.send::<fidl::encoding::EmptyPayload>(
1665            (),
1666            self.tx_id,
1667            0x196898fd17cb694c,
1668            fidl::encoding::DynamicFlags::empty(),
1669        )
1670    }
1671}
1672
1673mod internal {
1674    use super::*;
1675
1676    impl fidl::encoding::ResourceTypeMarker for ProviderGetFontResponse {
1677        type Borrowed<'a> = &'a mut Self;
1678        fn take_or_borrow<'a>(
1679            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1680        ) -> Self::Borrowed<'a> {
1681            value
1682        }
1683    }
1684
1685    unsafe impl fidl::encoding::TypeMarker for ProviderGetFontResponse {
1686        type Owned = Self;
1687
1688        #[inline(always)]
1689        fn inline_align(_context: fidl::encoding::Context) -> usize {
1690            8
1691        }
1692
1693        #[inline(always)]
1694        fn inline_size(_context: fidl::encoding::Context) -> usize {
1695            8
1696        }
1697    }
1698
1699    unsafe impl
1700        fidl::encoding::Encode<
1701            ProviderGetFontResponse,
1702            fidl::encoding::DefaultFuchsiaResourceDialect,
1703        > for &mut ProviderGetFontResponse
1704    {
1705        #[inline]
1706        unsafe fn encode(
1707            self,
1708            encoder: &mut fidl::encoding::Encoder<
1709                '_,
1710                fidl::encoding::DefaultFuchsiaResourceDialect,
1711            >,
1712            offset: usize,
1713            _depth: fidl::encoding::Depth,
1714        ) -> fidl::Result<()> {
1715            encoder.debug_check_bounds::<ProviderGetFontResponse>(offset);
1716            // Delegate to tuple encoding.
1717            fidl::encoding::Encode::<ProviderGetFontResponse, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
1718                (
1719                    <fidl::encoding::Boxed<Response> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.response),
1720                ),
1721                encoder, offset, _depth
1722            )
1723        }
1724    }
1725    unsafe impl<
1726        T0: fidl::encoding::Encode<
1727                fidl::encoding::Boxed<Response>,
1728                fidl::encoding::DefaultFuchsiaResourceDialect,
1729            >,
1730    >
1731        fidl::encoding::Encode<
1732            ProviderGetFontResponse,
1733            fidl::encoding::DefaultFuchsiaResourceDialect,
1734        > for (T0,)
1735    {
1736        #[inline]
1737        unsafe fn encode(
1738            self,
1739            encoder: &mut fidl::encoding::Encoder<
1740                '_,
1741                fidl::encoding::DefaultFuchsiaResourceDialect,
1742            >,
1743            offset: usize,
1744            depth: fidl::encoding::Depth,
1745        ) -> fidl::Result<()> {
1746            encoder.debug_check_bounds::<ProviderGetFontResponse>(offset);
1747            // Zero out padding regions. There's no need to apply masks
1748            // because the unmasked parts will be overwritten by fields.
1749            // Write the fields.
1750            self.0.encode(encoder, offset + 0, depth)?;
1751            Ok(())
1752        }
1753    }
1754
1755    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1756        for ProviderGetFontResponse
1757    {
1758        #[inline(always)]
1759        fn new_empty() -> Self {
1760            Self {
1761                response: fidl::new_empty!(
1762                    fidl::encoding::Boxed<Response>,
1763                    fidl::encoding::DefaultFuchsiaResourceDialect
1764                ),
1765            }
1766        }
1767
1768        #[inline]
1769        unsafe fn decode(
1770            &mut self,
1771            decoder: &mut fidl::encoding::Decoder<
1772                '_,
1773                fidl::encoding::DefaultFuchsiaResourceDialect,
1774            >,
1775            offset: usize,
1776            _depth: fidl::encoding::Depth,
1777        ) -> fidl::Result<()> {
1778            decoder.debug_check_bounds::<Self>(offset);
1779            // Verify that padding bytes are zero.
1780            fidl::decode!(
1781                fidl::encoding::Boxed<Response>,
1782                fidl::encoding::DefaultFuchsiaResourceDialect,
1783                &mut self.response,
1784                decoder,
1785                offset + 0,
1786                _depth
1787            )?;
1788            Ok(())
1789        }
1790    }
1791
1792    impl fidl::encoding::ResourceTypeMarker for ProviderGetTypefaceResponse {
1793        type Borrowed<'a> = &'a mut Self;
1794        fn take_or_borrow<'a>(
1795            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1796        ) -> Self::Borrowed<'a> {
1797            value
1798        }
1799    }
1800
1801    unsafe impl fidl::encoding::TypeMarker for ProviderGetTypefaceResponse {
1802        type Owned = Self;
1803
1804        #[inline(always)]
1805        fn inline_align(_context: fidl::encoding::Context) -> usize {
1806            8
1807        }
1808
1809        #[inline(always)]
1810        fn inline_size(_context: fidl::encoding::Context) -> usize {
1811            16
1812        }
1813    }
1814
1815    unsafe impl
1816        fidl::encoding::Encode<
1817            ProviderGetTypefaceResponse,
1818            fidl::encoding::DefaultFuchsiaResourceDialect,
1819        > for &mut ProviderGetTypefaceResponse
1820    {
1821        #[inline]
1822        unsafe fn encode(
1823            self,
1824            encoder: &mut fidl::encoding::Encoder<
1825                '_,
1826                fidl::encoding::DefaultFuchsiaResourceDialect,
1827            >,
1828            offset: usize,
1829            _depth: fidl::encoding::Depth,
1830        ) -> fidl::Result<()> {
1831            encoder.debug_check_bounds::<ProviderGetTypefaceResponse>(offset);
1832            // Delegate to tuple encoding.
1833            fidl::encoding::Encode::<
1834                ProviderGetTypefaceResponse,
1835                fidl::encoding::DefaultFuchsiaResourceDialect,
1836            >::encode(
1837                (<TypefaceResponse as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
1838                    &mut self.response,
1839                ),),
1840                encoder,
1841                offset,
1842                _depth,
1843            )
1844        }
1845    }
1846    unsafe impl<
1847        T0: fidl::encoding::Encode<TypefaceResponse, fidl::encoding::DefaultFuchsiaResourceDialect>,
1848    >
1849        fidl::encoding::Encode<
1850            ProviderGetTypefaceResponse,
1851            fidl::encoding::DefaultFuchsiaResourceDialect,
1852        > for (T0,)
1853    {
1854        #[inline]
1855        unsafe fn encode(
1856            self,
1857            encoder: &mut fidl::encoding::Encoder<
1858                '_,
1859                fidl::encoding::DefaultFuchsiaResourceDialect,
1860            >,
1861            offset: usize,
1862            depth: fidl::encoding::Depth,
1863        ) -> fidl::Result<()> {
1864            encoder.debug_check_bounds::<ProviderGetTypefaceResponse>(offset);
1865            // Zero out padding regions. There's no need to apply masks
1866            // because the unmasked parts will be overwritten by fields.
1867            // Write the fields.
1868            self.0.encode(encoder, offset + 0, depth)?;
1869            Ok(())
1870        }
1871    }
1872
1873    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1874        for ProviderGetTypefaceResponse
1875    {
1876        #[inline(always)]
1877        fn new_empty() -> Self {
1878            Self {
1879                response: fidl::new_empty!(
1880                    TypefaceResponse,
1881                    fidl::encoding::DefaultFuchsiaResourceDialect
1882                ),
1883            }
1884        }
1885
1886        #[inline]
1887        unsafe fn decode(
1888            &mut self,
1889            decoder: &mut fidl::encoding::Decoder<
1890                '_,
1891                fidl::encoding::DefaultFuchsiaResourceDialect,
1892            >,
1893            offset: usize,
1894            _depth: fidl::encoding::Depth,
1895        ) -> fidl::Result<()> {
1896            decoder.debug_check_bounds::<Self>(offset);
1897            // Verify that padding bytes are zero.
1898            fidl::decode!(
1899                TypefaceResponse,
1900                fidl::encoding::DefaultFuchsiaResourceDialect,
1901                &mut self.response,
1902                decoder,
1903                offset + 0,
1904                _depth
1905            )?;
1906            Ok(())
1907        }
1908    }
1909
1910    impl fidl::encoding::ResourceTypeMarker for ProviderRegisterFontSetEventListenerRequest {
1911        type Borrowed<'a> = &'a mut Self;
1912        fn take_or_borrow<'a>(
1913            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1914        ) -> Self::Borrowed<'a> {
1915            value
1916        }
1917    }
1918
1919    unsafe impl fidl::encoding::TypeMarker for ProviderRegisterFontSetEventListenerRequest {
1920        type Owned = Self;
1921
1922        #[inline(always)]
1923        fn inline_align(_context: fidl::encoding::Context) -> usize {
1924            4
1925        }
1926
1927        #[inline(always)]
1928        fn inline_size(_context: fidl::encoding::Context) -> usize {
1929            4
1930        }
1931    }
1932
1933    unsafe impl
1934        fidl::encoding::Encode<
1935            ProviderRegisterFontSetEventListenerRequest,
1936            fidl::encoding::DefaultFuchsiaResourceDialect,
1937        > for &mut ProviderRegisterFontSetEventListenerRequest
1938    {
1939        #[inline]
1940        unsafe fn encode(
1941            self,
1942            encoder: &mut fidl::encoding::Encoder<
1943                '_,
1944                fidl::encoding::DefaultFuchsiaResourceDialect,
1945            >,
1946            offset: usize,
1947            _depth: fidl::encoding::Depth,
1948        ) -> fidl::Result<()> {
1949            encoder.debug_check_bounds::<ProviderRegisterFontSetEventListenerRequest>(offset);
1950            // Delegate to tuple encoding.
1951            fidl::encoding::Encode::<
1952                ProviderRegisterFontSetEventListenerRequest,
1953                fidl::encoding::DefaultFuchsiaResourceDialect,
1954            >::encode(
1955                (
1956                    <fidl::encoding::Endpoint<
1957                        fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
1958                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
1959                        &mut self.listener
1960                    ),
1961                ),
1962                encoder,
1963                offset,
1964                _depth,
1965            )
1966        }
1967    }
1968    unsafe impl<
1969        T0: fidl::encoding::Encode<
1970                fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<FontSetEventListenerMarker>>,
1971                fidl::encoding::DefaultFuchsiaResourceDialect,
1972            >,
1973    >
1974        fidl::encoding::Encode<
1975            ProviderRegisterFontSetEventListenerRequest,
1976            fidl::encoding::DefaultFuchsiaResourceDialect,
1977        > for (T0,)
1978    {
1979        #[inline]
1980        unsafe fn encode(
1981            self,
1982            encoder: &mut fidl::encoding::Encoder<
1983                '_,
1984                fidl::encoding::DefaultFuchsiaResourceDialect,
1985            >,
1986            offset: usize,
1987            depth: fidl::encoding::Depth,
1988        ) -> fidl::Result<()> {
1989            encoder.debug_check_bounds::<ProviderRegisterFontSetEventListenerRequest>(offset);
1990            // Zero out padding regions. There's no need to apply masks
1991            // because the unmasked parts will be overwritten by fields.
1992            // Write the fields.
1993            self.0.encode(encoder, offset + 0, depth)?;
1994            Ok(())
1995        }
1996    }
1997
1998    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1999        for ProviderRegisterFontSetEventListenerRequest
2000    {
2001        #[inline(always)]
2002        fn new_empty() -> Self {
2003            Self {
2004                listener: fidl::new_empty!(
2005                    fidl::encoding::Endpoint<
2006                        fidl::endpoints::ClientEnd<FontSetEventListenerMarker>,
2007                    >,
2008                    fidl::encoding::DefaultFuchsiaResourceDialect
2009                ),
2010            }
2011        }
2012
2013        #[inline]
2014        unsafe fn decode(
2015            &mut self,
2016            decoder: &mut fidl::encoding::Decoder<
2017                '_,
2018                fidl::encoding::DefaultFuchsiaResourceDialect,
2019            >,
2020            offset: usize,
2021            _depth: fidl::encoding::Depth,
2022        ) -> fidl::Result<()> {
2023            decoder.debug_check_bounds::<Self>(offset);
2024            // Verify that padding bytes are zero.
2025            fidl::decode!(
2026                fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<FontSetEventListenerMarker>>,
2027                fidl::encoding::DefaultFuchsiaResourceDialect,
2028                &mut self.listener,
2029                decoder,
2030                offset + 0,
2031                _depth
2032            )?;
2033            Ok(())
2034        }
2035    }
2036
2037    impl fidl::encoding::ResourceTypeMarker for Response {
2038        type Borrowed<'a> = &'a mut Self;
2039        fn take_or_borrow<'a>(
2040            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2041        ) -> Self::Borrowed<'a> {
2042            value
2043        }
2044    }
2045
2046    unsafe impl fidl::encoding::TypeMarker for Response {
2047        type Owned = Self;
2048
2049        #[inline(always)]
2050        fn inline_align(_context: fidl::encoding::Context) -> usize {
2051            8
2052        }
2053
2054        #[inline(always)]
2055        fn inline_size(_context: fidl::encoding::Context) -> usize {
2056            24
2057        }
2058    }
2059
2060    unsafe impl fidl::encoding::Encode<Response, fidl::encoding::DefaultFuchsiaResourceDialect>
2061        for &mut Response
2062    {
2063        #[inline]
2064        unsafe fn encode(
2065            self,
2066            encoder: &mut fidl::encoding::Encoder<
2067                '_,
2068                fidl::encoding::DefaultFuchsiaResourceDialect,
2069            >,
2070            offset: usize,
2071            _depth: fidl::encoding::Depth,
2072        ) -> fidl::Result<()> {
2073            encoder.debug_check_bounds::<Response>(offset);
2074            // Delegate to tuple encoding.
2075            fidl::encoding::Encode::<Response, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
2076                (
2077                    <fidl_fuchsia_mem::Buffer as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.buffer),
2078                    <u32 as fidl::encoding::ValueTypeMarker>::borrow(&self.buffer_id),
2079                    <u32 as fidl::encoding::ValueTypeMarker>::borrow(&self.font_index),
2080                ),
2081                encoder, offset, _depth
2082            )
2083        }
2084    }
2085    unsafe impl<
2086        T0: fidl::encoding::Encode<
2087                fidl_fuchsia_mem::Buffer,
2088                fidl::encoding::DefaultFuchsiaResourceDialect,
2089            >,
2090        T1: fidl::encoding::Encode<u32, fidl::encoding::DefaultFuchsiaResourceDialect>,
2091        T2: fidl::encoding::Encode<u32, fidl::encoding::DefaultFuchsiaResourceDialect>,
2092    > fidl::encoding::Encode<Response, fidl::encoding::DefaultFuchsiaResourceDialect>
2093        for (T0, T1, T2)
2094    {
2095        #[inline]
2096        unsafe fn encode(
2097            self,
2098            encoder: &mut fidl::encoding::Encoder<
2099                '_,
2100                fidl::encoding::DefaultFuchsiaResourceDialect,
2101            >,
2102            offset: usize,
2103            depth: fidl::encoding::Depth,
2104        ) -> fidl::Result<()> {
2105            encoder.debug_check_bounds::<Response>(offset);
2106            // Zero out padding regions. There's no need to apply masks
2107            // because the unmasked parts will be overwritten by fields.
2108            // Write the fields.
2109            self.0.encode(encoder, offset + 0, depth)?;
2110            self.1.encode(encoder, offset + 16, depth)?;
2111            self.2.encode(encoder, offset + 20, depth)?;
2112            Ok(())
2113        }
2114    }
2115
2116    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Response {
2117        #[inline(always)]
2118        fn new_empty() -> Self {
2119            Self {
2120                buffer: fidl::new_empty!(
2121                    fidl_fuchsia_mem::Buffer,
2122                    fidl::encoding::DefaultFuchsiaResourceDialect
2123                ),
2124                buffer_id: fidl::new_empty!(u32, fidl::encoding::DefaultFuchsiaResourceDialect),
2125                font_index: fidl::new_empty!(u32, fidl::encoding::DefaultFuchsiaResourceDialect),
2126            }
2127        }
2128
2129        #[inline]
2130        unsafe fn decode(
2131            &mut self,
2132            decoder: &mut fidl::encoding::Decoder<
2133                '_,
2134                fidl::encoding::DefaultFuchsiaResourceDialect,
2135            >,
2136            offset: usize,
2137            _depth: fidl::encoding::Depth,
2138        ) -> fidl::Result<()> {
2139            decoder.debug_check_bounds::<Self>(offset);
2140            // Verify that padding bytes are zero.
2141            fidl::decode!(
2142                fidl_fuchsia_mem::Buffer,
2143                fidl::encoding::DefaultFuchsiaResourceDialect,
2144                &mut self.buffer,
2145                decoder,
2146                offset + 0,
2147                _depth
2148            )?;
2149            fidl::decode!(
2150                u32,
2151                fidl::encoding::DefaultFuchsiaResourceDialect,
2152                &mut self.buffer_id,
2153                decoder,
2154                offset + 16,
2155                _depth
2156            )?;
2157            fidl::decode!(
2158                u32,
2159                fidl::encoding::DefaultFuchsiaResourceDialect,
2160                &mut self.font_index,
2161                decoder,
2162                offset + 20,
2163                _depth
2164            )?;
2165            Ok(())
2166        }
2167    }
2168
2169    impl TypefaceResponse {
2170        #[inline(always)]
2171        fn max_ordinal_present(&self) -> u64 {
2172            if let Some(_) = self.font_index {
2173                return 3;
2174            }
2175            if let Some(_) = self.buffer_id {
2176                return 2;
2177            }
2178            if let Some(_) = self.buffer {
2179                return 1;
2180            }
2181            0
2182        }
2183    }
2184
2185    impl fidl::encoding::ResourceTypeMarker for TypefaceResponse {
2186        type Borrowed<'a> = &'a mut Self;
2187        fn take_or_borrow<'a>(
2188            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2189        ) -> Self::Borrowed<'a> {
2190            value
2191        }
2192    }
2193
2194    unsafe impl fidl::encoding::TypeMarker for TypefaceResponse {
2195        type Owned = Self;
2196
2197        #[inline(always)]
2198        fn inline_align(_context: fidl::encoding::Context) -> usize {
2199            8
2200        }
2201
2202        #[inline(always)]
2203        fn inline_size(_context: fidl::encoding::Context) -> usize {
2204            16
2205        }
2206    }
2207
2208    unsafe impl
2209        fidl::encoding::Encode<TypefaceResponse, fidl::encoding::DefaultFuchsiaResourceDialect>
2210        for &mut TypefaceResponse
2211    {
2212        unsafe fn encode(
2213            self,
2214            encoder: &mut fidl::encoding::Encoder<
2215                '_,
2216                fidl::encoding::DefaultFuchsiaResourceDialect,
2217            >,
2218            offset: usize,
2219            mut depth: fidl::encoding::Depth,
2220        ) -> fidl::Result<()> {
2221            encoder.debug_check_bounds::<TypefaceResponse>(offset);
2222            // Vector header
2223            let max_ordinal: u64 = self.max_ordinal_present();
2224            encoder.write_num(max_ordinal, offset);
2225            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2226            // Calling encoder.out_of_line_offset(0) is not allowed.
2227            if max_ordinal == 0 {
2228                return Ok(());
2229            }
2230            depth.increment()?;
2231            let envelope_size = 8;
2232            let bytes_len = max_ordinal as usize * envelope_size;
2233            #[allow(unused_variables)]
2234            let offset = encoder.out_of_line_offset(bytes_len);
2235            let mut _prev_end_offset: usize = 0;
2236            if 1 > max_ordinal {
2237                return Ok(());
2238            }
2239
2240            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2241            // are envelope_size bytes.
2242            let cur_offset: usize = (1 - 1) * envelope_size;
2243
2244            // Zero reserved fields.
2245            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2246
2247            // Safety:
2248            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2249            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2250            //   envelope_size bytes, there is always sufficient room.
2251            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_mem::Buffer, fidl::encoding::DefaultFuchsiaResourceDialect>(
2252            self.buffer.as_mut().map(<fidl_fuchsia_mem::Buffer as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
2253            encoder, offset + cur_offset, depth
2254        )?;
2255
2256            _prev_end_offset = cur_offset + envelope_size;
2257            if 2 > max_ordinal {
2258                return Ok(());
2259            }
2260
2261            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2262            // are envelope_size bytes.
2263            let cur_offset: usize = (2 - 1) * envelope_size;
2264
2265            // Zero reserved fields.
2266            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2267
2268            // Safety:
2269            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2270            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2271            //   envelope_size bytes, there is always sufficient room.
2272            fidl::encoding::encode_in_envelope_optional::<
2273                u32,
2274                fidl::encoding::DefaultFuchsiaResourceDialect,
2275            >(
2276                self.buffer_id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2277                encoder,
2278                offset + cur_offset,
2279                depth,
2280            )?;
2281
2282            _prev_end_offset = cur_offset + envelope_size;
2283            if 3 > max_ordinal {
2284                return Ok(());
2285            }
2286
2287            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2288            // are envelope_size bytes.
2289            let cur_offset: usize = (3 - 1) * envelope_size;
2290
2291            // Zero reserved fields.
2292            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2293
2294            // Safety:
2295            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2296            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2297            //   envelope_size bytes, there is always sufficient room.
2298            fidl::encoding::encode_in_envelope_optional::<
2299                u32,
2300                fidl::encoding::DefaultFuchsiaResourceDialect,
2301            >(
2302                self.font_index.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
2303                encoder,
2304                offset + cur_offset,
2305                depth,
2306            )?;
2307
2308            _prev_end_offset = cur_offset + envelope_size;
2309
2310            Ok(())
2311        }
2312    }
2313
2314    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
2315        for TypefaceResponse
2316    {
2317        #[inline(always)]
2318        fn new_empty() -> Self {
2319            Self::default()
2320        }
2321
2322        unsafe fn decode(
2323            &mut self,
2324            decoder: &mut fidl::encoding::Decoder<
2325                '_,
2326                fidl::encoding::DefaultFuchsiaResourceDialect,
2327            >,
2328            offset: usize,
2329            mut depth: fidl::encoding::Depth,
2330        ) -> fidl::Result<()> {
2331            decoder.debug_check_bounds::<Self>(offset);
2332            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2333                None => return Err(fidl::Error::NotNullable),
2334                Some(len) => len,
2335            };
2336            // Calling decoder.out_of_line_offset(0) is not allowed.
2337            if len == 0 {
2338                return Ok(());
2339            };
2340            depth.increment()?;
2341            let envelope_size = 8;
2342            let bytes_len = len * envelope_size;
2343            let offset = decoder.out_of_line_offset(bytes_len)?;
2344            // Decode the envelope for each type.
2345            let mut _next_ordinal_to_read = 0;
2346            let mut next_offset = offset;
2347            let end_offset = offset + bytes_len;
2348            _next_ordinal_to_read += 1;
2349            if next_offset >= end_offset {
2350                return Ok(());
2351            }
2352
2353            // Decode unknown envelopes for gaps in ordinals.
2354            while _next_ordinal_to_read < 1 {
2355                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2356                _next_ordinal_to_read += 1;
2357                next_offset += envelope_size;
2358            }
2359
2360            let next_out_of_line = decoder.next_out_of_line();
2361            let handles_before = decoder.remaining_handles();
2362            if let Some((inlined, num_bytes, num_handles)) =
2363                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2364            {
2365                let member_inline_size =
2366                    <fidl_fuchsia_mem::Buffer as fidl::encoding::TypeMarker>::inline_size(
2367                        decoder.context,
2368                    );
2369                if inlined != (member_inline_size <= 4) {
2370                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2371                }
2372                let inner_offset;
2373                let mut inner_depth = depth.clone();
2374                if inlined {
2375                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2376                    inner_offset = next_offset;
2377                } else {
2378                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2379                    inner_depth.increment()?;
2380                }
2381                let val_ref = self.buffer.get_or_insert_with(|| {
2382                    fidl::new_empty!(
2383                        fidl_fuchsia_mem::Buffer,
2384                        fidl::encoding::DefaultFuchsiaResourceDialect
2385                    )
2386                });
2387                fidl::decode!(
2388                    fidl_fuchsia_mem::Buffer,
2389                    fidl::encoding::DefaultFuchsiaResourceDialect,
2390                    val_ref,
2391                    decoder,
2392                    inner_offset,
2393                    inner_depth
2394                )?;
2395                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2396                {
2397                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2398                }
2399                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2400                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2401                }
2402            }
2403
2404            next_offset += envelope_size;
2405            _next_ordinal_to_read += 1;
2406            if next_offset >= end_offset {
2407                return Ok(());
2408            }
2409
2410            // Decode unknown envelopes for gaps in ordinals.
2411            while _next_ordinal_to_read < 2 {
2412                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2413                _next_ordinal_to_read += 1;
2414                next_offset += envelope_size;
2415            }
2416
2417            let next_out_of_line = decoder.next_out_of_line();
2418            let handles_before = decoder.remaining_handles();
2419            if let Some((inlined, num_bytes, num_handles)) =
2420                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2421            {
2422                let member_inline_size =
2423                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2424                if inlined != (member_inline_size <= 4) {
2425                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2426                }
2427                let inner_offset;
2428                let mut inner_depth = depth.clone();
2429                if inlined {
2430                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2431                    inner_offset = next_offset;
2432                } else {
2433                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2434                    inner_depth.increment()?;
2435                }
2436                let val_ref = self.buffer_id.get_or_insert_with(|| {
2437                    fidl::new_empty!(u32, fidl::encoding::DefaultFuchsiaResourceDialect)
2438                });
2439                fidl::decode!(
2440                    u32,
2441                    fidl::encoding::DefaultFuchsiaResourceDialect,
2442                    val_ref,
2443                    decoder,
2444                    inner_offset,
2445                    inner_depth
2446                )?;
2447                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2448                {
2449                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2450                }
2451                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2452                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2453                }
2454            }
2455
2456            next_offset += envelope_size;
2457            _next_ordinal_to_read += 1;
2458            if next_offset >= end_offset {
2459                return Ok(());
2460            }
2461
2462            // Decode unknown envelopes for gaps in ordinals.
2463            while _next_ordinal_to_read < 3 {
2464                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2465                _next_ordinal_to_read += 1;
2466                next_offset += envelope_size;
2467            }
2468
2469            let next_out_of_line = decoder.next_out_of_line();
2470            let handles_before = decoder.remaining_handles();
2471            if let Some((inlined, num_bytes, num_handles)) =
2472                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2473            {
2474                let member_inline_size =
2475                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2476                if inlined != (member_inline_size <= 4) {
2477                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2478                }
2479                let inner_offset;
2480                let mut inner_depth = depth.clone();
2481                if inlined {
2482                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2483                    inner_offset = next_offset;
2484                } else {
2485                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2486                    inner_depth.increment()?;
2487                }
2488                let val_ref = self.font_index.get_or_insert_with(|| {
2489                    fidl::new_empty!(u32, fidl::encoding::DefaultFuchsiaResourceDialect)
2490                });
2491                fidl::decode!(
2492                    u32,
2493                    fidl::encoding::DefaultFuchsiaResourceDialect,
2494                    val_ref,
2495                    decoder,
2496                    inner_offset,
2497                    inner_depth
2498                )?;
2499                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2500                {
2501                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2502                }
2503                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2504                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2505                }
2506            }
2507
2508            next_offset += envelope_size;
2509
2510            // Decode the remaining unknown envelopes.
2511            while next_offset < end_offset {
2512                _next_ordinal_to_read += 1;
2513                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2514                next_offset += envelope_size;
2515            }
2516
2517            Ok(())
2518        }
2519    }
2520}