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