Skip to main content

fidl_fuchsia_fonts/
fidl_fuchsia_fonts.rs

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