fidl_fuchsia_ui_app/
fidl_fuchsia_ui_app.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_ui_app__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct ViewProviderCreateView2Request {
16    pub args: CreateView2Args,
17}
18
19impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
20    for ViewProviderCreateView2Request
21{
22}
23
24#[derive(Debug, PartialEq)]
25pub struct ViewProviderCreateViewWithViewRefRequest {
26    pub token: fidl::EventPair,
27    pub view_ref_control: fidl_fuchsia_ui_views::ViewRefControl,
28    pub view_ref: fidl_fuchsia_ui_views::ViewRef,
29}
30
31impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
32    for ViewProviderCreateViewWithViewRefRequest
33{
34}
35
36#[derive(Debug, Default, PartialEq)]
37pub struct CreateView2Args {
38    /// Non-optional.  This token can be provided to Flatland to attach the client's child view
39    /// to the parent's viewport.
40    pub view_creation_token: Option<fidl_fuchsia_ui_views::ViewCreationToken>,
41    #[doc(hidden)]
42    pub __source_breaking: fidl::marker::SourceBreaking,
43}
44
45impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for CreateView2Args {}
46
47#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
48pub struct ViewProviderMarker;
49
50impl fidl::endpoints::ProtocolMarker for ViewProviderMarker {
51    type Proxy = ViewProviderProxy;
52    type RequestStream = ViewProviderRequestStream;
53    #[cfg(target_os = "fuchsia")]
54    type SynchronousProxy = ViewProviderSynchronousProxy;
55
56    const DEBUG_NAME: &'static str = "fuchsia.ui.app.ViewProvider";
57}
58impl fidl::endpoints::DiscoverableProtocolMarker for ViewProviderMarker {}
59
60pub trait ViewProviderProxyInterface: Send + Sync {
61    fn r#create_view_with_view_ref(
62        &self,
63        token: fidl::EventPair,
64        view_ref_control: fidl_fuchsia_ui_views::ViewRefControl,
65        view_ref: fidl_fuchsia_ui_views::ViewRef,
66    ) -> Result<(), fidl::Error>;
67    fn r#create_view2(&self, args: CreateView2Args) -> Result<(), fidl::Error>;
68}
69#[derive(Debug)]
70#[cfg(target_os = "fuchsia")]
71pub struct ViewProviderSynchronousProxy {
72    client: fidl::client::sync::Client,
73}
74
75#[cfg(target_os = "fuchsia")]
76impl fidl::endpoints::SynchronousProxy for ViewProviderSynchronousProxy {
77    type Proxy = ViewProviderProxy;
78    type Protocol = ViewProviderMarker;
79
80    fn from_channel(inner: fidl::Channel) -> Self {
81        Self::new(inner)
82    }
83
84    fn into_channel(self) -> fidl::Channel {
85        self.client.into_channel()
86    }
87
88    fn as_channel(&self) -> &fidl::Channel {
89        self.client.as_channel()
90    }
91}
92
93#[cfg(target_os = "fuchsia")]
94impl ViewProviderSynchronousProxy {
95    pub fn new(channel: fidl::Channel) -> Self {
96        let protocol_name = <ViewProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
97        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
98    }
99
100    pub fn into_channel(self) -> fidl::Channel {
101        self.client.into_channel()
102    }
103
104    /// Waits until an event arrives and returns it. It is safe for other
105    /// threads to make concurrent requests while waiting for an event.
106    pub fn wait_for_event(
107        &self,
108        deadline: zx::MonotonicInstant,
109    ) -> Result<ViewProviderEvent, fidl::Error> {
110        ViewProviderEvent::decode(self.client.wait_for_event(deadline)?)
111    }
112
113    /// Creates a new View under the control of the ViewProvider.
114    ///
115    /// `token` is one half of the shared eventpair which will bind the new View
116    /// to its associated ViewHolder.  The ViewProvider will use `token` to
117    /// create its internal View representation.  The caller is expected to use
118    /// its half to create corresponding ViewHolder object.
119    ///
120    /// `view_ref_control` and `view_ref` are two typed handles to each half of the
121    /// same event pair. The `view_ref` can be cloned before passing it to this method,
122    /// which will allow clients to track the view (e.g., in a focus chain update).
123    ///
124    /// `view_ref_control` must not have the ZX_RIGHT_DUPLICATE set, or view creation
125    /// will fail.
126    pub fn r#create_view_with_view_ref(
127        &self,
128        mut token: fidl::EventPair,
129        mut view_ref_control: fidl_fuchsia_ui_views::ViewRefControl,
130        mut view_ref: fidl_fuchsia_ui_views::ViewRef,
131    ) -> Result<(), fidl::Error> {
132        self.client.send::<ViewProviderCreateViewWithViewRefRequest>(
133            (token, &mut view_ref_control, &mut view_ref),
134            0x586d23a5e4f69a86,
135            fidl::encoding::DynamicFlags::empty(),
136        )
137    }
138
139    /// Creates a new View under the control of the ViewProvider.
140    ///
141    /// The args are provided as a table, for forward compatibility.  See documentation on the
142    /// individual table fields.
143    pub fn r#create_view2(&self, mut args: CreateView2Args) -> Result<(), fidl::Error> {
144        self.client.send::<ViewProviderCreateView2Request>(
145            (&mut args,),
146            0x78b4a51b5e630482,
147            fidl::encoding::DynamicFlags::empty(),
148        )
149    }
150}
151
152#[cfg(target_os = "fuchsia")]
153impl From<ViewProviderSynchronousProxy> for zx::NullableHandle {
154    fn from(value: ViewProviderSynchronousProxy) -> Self {
155        value.into_channel().into()
156    }
157}
158
159#[cfg(target_os = "fuchsia")]
160impl From<fidl::Channel> for ViewProviderSynchronousProxy {
161    fn from(value: fidl::Channel) -> Self {
162        Self::new(value)
163    }
164}
165
166#[cfg(target_os = "fuchsia")]
167impl fidl::endpoints::FromClient for ViewProviderSynchronousProxy {
168    type Protocol = ViewProviderMarker;
169
170    fn from_client(value: fidl::endpoints::ClientEnd<ViewProviderMarker>) -> Self {
171        Self::new(value.into_channel())
172    }
173}
174
175#[derive(Debug, Clone)]
176pub struct ViewProviderProxy {
177    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
178}
179
180impl fidl::endpoints::Proxy for ViewProviderProxy {
181    type Protocol = ViewProviderMarker;
182
183    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
184        Self::new(inner)
185    }
186
187    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
188        self.client.into_channel().map_err(|client| Self { client })
189    }
190
191    fn as_channel(&self) -> &::fidl::AsyncChannel {
192        self.client.as_channel()
193    }
194}
195
196impl ViewProviderProxy {
197    /// Create a new Proxy for fuchsia.ui.app/ViewProvider.
198    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
199        let protocol_name = <ViewProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
200        Self { client: fidl::client::Client::new(channel, protocol_name) }
201    }
202
203    /// Get a Stream of events from the remote end of the protocol.
204    ///
205    /// # Panics
206    ///
207    /// Panics if the event stream was already taken.
208    pub fn take_event_stream(&self) -> ViewProviderEventStream {
209        ViewProviderEventStream { event_receiver: self.client.take_event_receiver() }
210    }
211
212    /// Creates a new View under the control of the ViewProvider.
213    ///
214    /// `token` is one half of the shared eventpair which will bind the new View
215    /// to its associated ViewHolder.  The ViewProvider will use `token` to
216    /// create its internal View representation.  The caller is expected to use
217    /// its half to create corresponding ViewHolder object.
218    ///
219    /// `view_ref_control` and `view_ref` are two typed handles to each half of the
220    /// same event pair. The `view_ref` can be cloned before passing it to this method,
221    /// which will allow clients to track the view (e.g., in a focus chain update).
222    ///
223    /// `view_ref_control` must not have the ZX_RIGHT_DUPLICATE set, or view creation
224    /// will fail.
225    pub fn r#create_view_with_view_ref(
226        &self,
227        mut token: fidl::EventPair,
228        mut view_ref_control: fidl_fuchsia_ui_views::ViewRefControl,
229        mut view_ref: fidl_fuchsia_ui_views::ViewRef,
230    ) -> Result<(), fidl::Error> {
231        ViewProviderProxyInterface::r#create_view_with_view_ref(
232            self,
233            token,
234            view_ref_control,
235            view_ref,
236        )
237    }
238
239    /// Creates a new View under the control of the ViewProvider.
240    ///
241    /// The args are provided as a table, for forward compatibility.  See documentation on the
242    /// individual table fields.
243    pub fn r#create_view2(&self, mut args: CreateView2Args) -> Result<(), fidl::Error> {
244        ViewProviderProxyInterface::r#create_view2(self, args)
245    }
246}
247
248impl ViewProviderProxyInterface for ViewProviderProxy {
249    fn r#create_view_with_view_ref(
250        &self,
251        mut token: fidl::EventPair,
252        mut view_ref_control: fidl_fuchsia_ui_views::ViewRefControl,
253        mut view_ref: fidl_fuchsia_ui_views::ViewRef,
254    ) -> Result<(), fidl::Error> {
255        self.client.send::<ViewProviderCreateViewWithViewRefRequest>(
256            (token, &mut view_ref_control, &mut view_ref),
257            0x586d23a5e4f69a86,
258            fidl::encoding::DynamicFlags::empty(),
259        )
260    }
261
262    fn r#create_view2(&self, mut args: CreateView2Args) -> Result<(), fidl::Error> {
263        self.client.send::<ViewProviderCreateView2Request>(
264            (&mut args,),
265            0x78b4a51b5e630482,
266            fidl::encoding::DynamicFlags::empty(),
267        )
268    }
269}
270
271pub struct ViewProviderEventStream {
272    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
273}
274
275impl std::marker::Unpin for ViewProviderEventStream {}
276
277impl futures::stream::FusedStream for ViewProviderEventStream {
278    fn is_terminated(&self) -> bool {
279        self.event_receiver.is_terminated()
280    }
281}
282
283impl futures::Stream for ViewProviderEventStream {
284    type Item = Result<ViewProviderEvent, fidl::Error>;
285
286    fn poll_next(
287        mut self: std::pin::Pin<&mut Self>,
288        cx: &mut std::task::Context<'_>,
289    ) -> std::task::Poll<Option<Self::Item>> {
290        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
291            &mut self.event_receiver,
292            cx
293        )?) {
294            Some(buf) => std::task::Poll::Ready(Some(ViewProviderEvent::decode(buf))),
295            None => std::task::Poll::Ready(None),
296        }
297    }
298}
299
300#[derive(Debug)]
301pub enum ViewProviderEvent {}
302
303impl ViewProviderEvent {
304    /// Decodes a message buffer as a [`ViewProviderEvent`].
305    fn decode(
306        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
307    ) -> Result<ViewProviderEvent, fidl::Error> {
308        let (bytes, _handles) = buf.split_mut();
309        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
310        debug_assert_eq!(tx_header.tx_id, 0);
311        match tx_header.ordinal {
312            _ => Err(fidl::Error::UnknownOrdinal {
313                ordinal: tx_header.ordinal,
314                protocol_name: <ViewProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
315            }),
316        }
317    }
318}
319
320/// A Stream of incoming requests for fuchsia.ui.app/ViewProvider.
321pub struct ViewProviderRequestStream {
322    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
323    is_terminated: bool,
324}
325
326impl std::marker::Unpin for ViewProviderRequestStream {}
327
328impl futures::stream::FusedStream for ViewProviderRequestStream {
329    fn is_terminated(&self) -> bool {
330        self.is_terminated
331    }
332}
333
334impl fidl::endpoints::RequestStream for ViewProviderRequestStream {
335    type Protocol = ViewProviderMarker;
336    type ControlHandle = ViewProviderControlHandle;
337
338    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
339        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
340    }
341
342    fn control_handle(&self) -> Self::ControlHandle {
343        ViewProviderControlHandle { inner: self.inner.clone() }
344    }
345
346    fn into_inner(
347        self,
348    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
349    {
350        (self.inner, self.is_terminated)
351    }
352
353    fn from_inner(
354        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
355        is_terminated: bool,
356    ) -> Self {
357        Self { inner, is_terminated }
358    }
359}
360
361impl futures::Stream for ViewProviderRequestStream {
362    type Item = Result<ViewProviderRequest, fidl::Error>;
363
364    fn poll_next(
365        mut self: std::pin::Pin<&mut Self>,
366        cx: &mut std::task::Context<'_>,
367    ) -> std::task::Poll<Option<Self::Item>> {
368        let this = &mut *self;
369        if this.inner.check_shutdown(cx) {
370            this.is_terminated = true;
371            return std::task::Poll::Ready(None);
372        }
373        if this.is_terminated {
374            panic!("polled ViewProviderRequestStream after completion");
375        }
376        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
377            |bytes, handles| {
378                match this.inner.channel().read_etc(cx, bytes, handles) {
379                    std::task::Poll::Ready(Ok(())) => {}
380                    std::task::Poll::Pending => return std::task::Poll::Pending,
381                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
382                        this.is_terminated = true;
383                        return std::task::Poll::Ready(None);
384                    }
385                    std::task::Poll::Ready(Err(e)) => {
386                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
387                            e.into(),
388                        ))));
389                    }
390                }
391
392                // A message has been received from the channel
393                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
394
395                std::task::Poll::Ready(Some(match header.ordinal {
396                    0x586d23a5e4f69a86 => {
397                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
398                        let mut req = fidl::new_empty!(
399                            ViewProviderCreateViewWithViewRefRequest,
400                            fidl::encoding::DefaultFuchsiaResourceDialect
401                        );
402                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ViewProviderCreateViewWithViewRefRequest>(&header, _body_bytes, handles, &mut req)?;
403                        let control_handle =
404                            ViewProviderControlHandle { inner: this.inner.clone() };
405                        Ok(ViewProviderRequest::CreateViewWithViewRef {
406                            token: req.token,
407                            view_ref_control: req.view_ref_control,
408                            view_ref: req.view_ref,
409
410                            control_handle,
411                        })
412                    }
413                    0x78b4a51b5e630482 => {
414                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
415                        let mut req = fidl::new_empty!(
416                            ViewProviderCreateView2Request,
417                            fidl::encoding::DefaultFuchsiaResourceDialect
418                        );
419                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ViewProviderCreateView2Request>(&header, _body_bytes, handles, &mut req)?;
420                        let control_handle =
421                            ViewProviderControlHandle { inner: this.inner.clone() };
422                        Ok(ViewProviderRequest::CreateView2 { args: req.args, control_handle })
423                    }
424                    _ => Err(fidl::Error::UnknownOrdinal {
425                        ordinal: header.ordinal,
426                        protocol_name:
427                            <ViewProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
428                    }),
429                }))
430            },
431        )
432    }
433}
434
435/// ViewProvider is the standard mechanism for two modules to each obtain half
436/// of a shared eventpair token.  The shared token is a capability allowing the
437/// modules to ask Scenic to create a ViewHolder/View pair.  The resulting
438/// View and ViewHolder are linked together until either one is destroyed.
439///
440/// Modules are free to use any other mechanism to agree upon the shared
441/// eventpair token, and use this to create the linked ViewHolder/View.
442/// ViewProvider is given for the convenience of clients that don't require
443/// a more complex implementation.
444#[derive(Debug)]
445pub enum ViewProviderRequest {
446    /// Creates a new View under the control of the ViewProvider.
447    ///
448    /// `token` is one half of the shared eventpair which will bind the new View
449    /// to its associated ViewHolder.  The ViewProvider will use `token` to
450    /// create its internal View representation.  The caller is expected to use
451    /// its half to create corresponding ViewHolder object.
452    ///
453    /// `view_ref_control` and `view_ref` are two typed handles to each half of the
454    /// same event pair. The `view_ref` can be cloned before passing it to this method,
455    /// which will allow clients to track the view (e.g., in a focus chain update).
456    ///
457    /// `view_ref_control` must not have the ZX_RIGHT_DUPLICATE set, or view creation
458    /// will fail.
459    CreateViewWithViewRef {
460        token: fidl::EventPair,
461        view_ref_control: fidl_fuchsia_ui_views::ViewRefControl,
462        view_ref: fidl_fuchsia_ui_views::ViewRef,
463        control_handle: ViewProviderControlHandle,
464    },
465    /// Creates a new View under the control of the ViewProvider.
466    ///
467    /// The args are provided as a table, for forward compatibility.  See documentation on the
468    /// individual table fields.
469    CreateView2 { args: CreateView2Args, control_handle: ViewProviderControlHandle },
470}
471
472impl ViewProviderRequest {
473    #[allow(irrefutable_let_patterns)]
474    pub fn into_create_view_with_view_ref(
475        self,
476    ) -> Option<(
477        fidl::EventPair,
478        fidl_fuchsia_ui_views::ViewRefControl,
479        fidl_fuchsia_ui_views::ViewRef,
480        ViewProviderControlHandle,
481    )> {
482        if let ViewProviderRequest::CreateViewWithViewRef {
483            token,
484            view_ref_control,
485            view_ref,
486            control_handle,
487        } = self
488        {
489            Some((token, view_ref_control, view_ref, control_handle))
490        } else {
491            None
492        }
493    }
494
495    #[allow(irrefutable_let_patterns)]
496    pub fn into_create_view2(self) -> Option<(CreateView2Args, ViewProviderControlHandle)> {
497        if let ViewProviderRequest::CreateView2 { args, control_handle } = self {
498            Some((args, control_handle))
499        } else {
500            None
501        }
502    }
503
504    /// Name of the method defined in FIDL
505    pub fn method_name(&self) -> &'static str {
506        match *self {
507            ViewProviderRequest::CreateViewWithViewRef { .. } => "create_view_with_view_ref",
508            ViewProviderRequest::CreateView2 { .. } => "create_view2",
509        }
510    }
511}
512
513#[derive(Debug, Clone)]
514pub struct ViewProviderControlHandle {
515    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
516}
517
518impl fidl::endpoints::ControlHandle for ViewProviderControlHandle {
519    fn shutdown(&self) {
520        self.inner.shutdown()
521    }
522
523    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
524        self.inner.shutdown_with_epitaph(status)
525    }
526
527    fn is_closed(&self) -> bool {
528        self.inner.channel().is_closed()
529    }
530    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
531        self.inner.channel().on_closed()
532    }
533
534    #[cfg(target_os = "fuchsia")]
535    fn signal_peer(
536        &self,
537        clear_mask: zx::Signals,
538        set_mask: zx::Signals,
539    ) -> Result<(), zx_status::Status> {
540        use fidl::Peered;
541        self.inner.channel().signal_peer(clear_mask, set_mask)
542    }
543}
544
545impl ViewProviderControlHandle {}
546
547mod internal {
548    use super::*;
549
550    impl fidl::encoding::ResourceTypeMarker for ViewProviderCreateView2Request {
551        type Borrowed<'a> = &'a mut Self;
552        fn take_or_borrow<'a>(
553            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
554        ) -> Self::Borrowed<'a> {
555            value
556        }
557    }
558
559    unsafe impl fidl::encoding::TypeMarker for ViewProviderCreateView2Request {
560        type Owned = Self;
561
562        #[inline(always)]
563        fn inline_align(_context: fidl::encoding::Context) -> usize {
564            8
565        }
566
567        #[inline(always)]
568        fn inline_size(_context: fidl::encoding::Context) -> usize {
569            16
570        }
571    }
572
573    unsafe impl
574        fidl::encoding::Encode<
575            ViewProviderCreateView2Request,
576            fidl::encoding::DefaultFuchsiaResourceDialect,
577        > for &mut ViewProviderCreateView2Request
578    {
579        #[inline]
580        unsafe fn encode(
581            self,
582            encoder: &mut fidl::encoding::Encoder<
583                '_,
584                fidl::encoding::DefaultFuchsiaResourceDialect,
585            >,
586            offset: usize,
587            _depth: fidl::encoding::Depth,
588        ) -> fidl::Result<()> {
589            encoder.debug_check_bounds::<ViewProviderCreateView2Request>(offset);
590            // Delegate to tuple encoding.
591            fidl::encoding::Encode::<
592                ViewProviderCreateView2Request,
593                fidl::encoding::DefaultFuchsiaResourceDialect,
594            >::encode(
595                (<CreateView2Args as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
596                    &mut self.args,
597                ),),
598                encoder,
599                offset,
600                _depth,
601            )
602        }
603    }
604    unsafe impl<
605        T0: fidl::encoding::Encode<CreateView2Args, fidl::encoding::DefaultFuchsiaResourceDialect>,
606    >
607        fidl::encoding::Encode<
608            ViewProviderCreateView2Request,
609            fidl::encoding::DefaultFuchsiaResourceDialect,
610        > for (T0,)
611    {
612        #[inline]
613        unsafe fn encode(
614            self,
615            encoder: &mut fidl::encoding::Encoder<
616                '_,
617                fidl::encoding::DefaultFuchsiaResourceDialect,
618            >,
619            offset: usize,
620            depth: fidl::encoding::Depth,
621        ) -> fidl::Result<()> {
622            encoder.debug_check_bounds::<ViewProviderCreateView2Request>(offset);
623            // Zero out padding regions. There's no need to apply masks
624            // because the unmasked parts will be overwritten by fields.
625            // Write the fields.
626            self.0.encode(encoder, offset + 0, depth)?;
627            Ok(())
628        }
629    }
630
631    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
632        for ViewProviderCreateView2Request
633    {
634        #[inline(always)]
635        fn new_empty() -> Self {
636            Self {
637                args: fidl::new_empty!(
638                    CreateView2Args,
639                    fidl::encoding::DefaultFuchsiaResourceDialect
640                ),
641            }
642        }
643
644        #[inline]
645        unsafe fn decode(
646            &mut self,
647            decoder: &mut fidl::encoding::Decoder<
648                '_,
649                fidl::encoding::DefaultFuchsiaResourceDialect,
650            >,
651            offset: usize,
652            _depth: fidl::encoding::Depth,
653        ) -> fidl::Result<()> {
654            decoder.debug_check_bounds::<Self>(offset);
655            // Verify that padding bytes are zero.
656            fidl::decode!(
657                CreateView2Args,
658                fidl::encoding::DefaultFuchsiaResourceDialect,
659                &mut self.args,
660                decoder,
661                offset + 0,
662                _depth
663            )?;
664            Ok(())
665        }
666    }
667
668    impl fidl::encoding::ResourceTypeMarker for ViewProviderCreateViewWithViewRefRequest {
669        type Borrowed<'a> = &'a mut Self;
670        fn take_or_borrow<'a>(
671            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
672        ) -> Self::Borrowed<'a> {
673            value
674        }
675    }
676
677    unsafe impl fidl::encoding::TypeMarker for ViewProviderCreateViewWithViewRefRequest {
678        type Owned = Self;
679
680        #[inline(always)]
681        fn inline_align(_context: fidl::encoding::Context) -> usize {
682            4
683        }
684
685        #[inline(always)]
686        fn inline_size(_context: fidl::encoding::Context) -> usize {
687            12
688        }
689    }
690
691    unsafe impl
692        fidl::encoding::Encode<
693            ViewProviderCreateViewWithViewRefRequest,
694            fidl::encoding::DefaultFuchsiaResourceDialect,
695        > for &mut ViewProviderCreateViewWithViewRefRequest
696    {
697        #[inline]
698        unsafe fn encode(
699            self,
700            encoder: &mut fidl::encoding::Encoder<
701                '_,
702                fidl::encoding::DefaultFuchsiaResourceDialect,
703            >,
704            offset: usize,
705            _depth: fidl::encoding::Depth,
706        ) -> fidl::Result<()> {
707            encoder.debug_check_bounds::<ViewProviderCreateViewWithViewRefRequest>(offset);
708            // Delegate to tuple encoding.
709            fidl::encoding::Encode::<ViewProviderCreateViewWithViewRefRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
710                (
711                    <fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 2147483648> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.token),
712                    <fidl_fuchsia_ui_views::ViewRefControl as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.view_ref_control),
713                    <fidl_fuchsia_ui_views::ViewRef as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.view_ref),
714                ),
715                encoder, offset, _depth
716            )
717        }
718    }
719    unsafe impl<
720        T0: fidl::encoding::Encode<
721                fidl::encoding::HandleType<
722                    fidl::EventPair,
723                    { fidl::ObjectType::EVENTPAIR.into_raw() },
724                    2147483648,
725                >,
726                fidl::encoding::DefaultFuchsiaResourceDialect,
727            >,
728        T1: fidl::encoding::Encode<
729                fidl_fuchsia_ui_views::ViewRefControl,
730                fidl::encoding::DefaultFuchsiaResourceDialect,
731            >,
732        T2: fidl::encoding::Encode<
733                fidl_fuchsia_ui_views::ViewRef,
734                fidl::encoding::DefaultFuchsiaResourceDialect,
735            >,
736    >
737        fidl::encoding::Encode<
738            ViewProviderCreateViewWithViewRefRequest,
739            fidl::encoding::DefaultFuchsiaResourceDialect,
740        > for (T0, T1, T2)
741    {
742        #[inline]
743        unsafe fn encode(
744            self,
745            encoder: &mut fidl::encoding::Encoder<
746                '_,
747                fidl::encoding::DefaultFuchsiaResourceDialect,
748            >,
749            offset: usize,
750            depth: fidl::encoding::Depth,
751        ) -> fidl::Result<()> {
752            encoder.debug_check_bounds::<ViewProviderCreateViewWithViewRefRequest>(offset);
753            // Zero out padding regions. There's no need to apply masks
754            // because the unmasked parts will be overwritten by fields.
755            // Write the fields.
756            self.0.encode(encoder, offset + 0, depth)?;
757            self.1.encode(encoder, offset + 4, depth)?;
758            self.2.encode(encoder, offset + 8, depth)?;
759            Ok(())
760        }
761    }
762
763    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
764        for ViewProviderCreateViewWithViewRefRequest
765    {
766        #[inline(always)]
767        fn new_empty() -> Self {
768            Self {
769                token: fidl::new_empty!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
770                view_ref_control: fidl::new_empty!(
771                    fidl_fuchsia_ui_views::ViewRefControl,
772                    fidl::encoding::DefaultFuchsiaResourceDialect
773                ),
774                view_ref: fidl::new_empty!(
775                    fidl_fuchsia_ui_views::ViewRef,
776                    fidl::encoding::DefaultFuchsiaResourceDialect
777                ),
778            }
779        }
780
781        #[inline]
782        unsafe fn decode(
783            &mut self,
784            decoder: &mut fidl::encoding::Decoder<
785                '_,
786                fidl::encoding::DefaultFuchsiaResourceDialect,
787            >,
788            offset: usize,
789            _depth: fidl::encoding::Depth,
790        ) -> fidl::Result<()> {
791            decoder.debug_check_bounds::<Self>(offset);
792            // Verify that padding bytes are zero.
793            fidl::decode!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.token, decoder, offset + 0, _depth)?;
794            fidl::decode!(
795                fidl_fuchsia_ui_views::ViewRefControl,
796                fidl::encoding::DefaultFuchsiaResourceDialect,
797                &mut self.view_ref_control,
798                decoder,
799                offset + 4,
800                _depth
801            )?;
802            fidl::decode!(
803                fidl_fuchsia_ui_views::ViewRef,
804                fidl::encoding::DefaultFuchsiaResourceDialect,
805                &mut self.view_ref,
806                decoder,
807                offset + 8,
808                _depth
809            )?;
810            Ok(())
811        }
812    }
813
814    impl CreateView2Args {
815        #[inline(always)]
816        fn max_ordinal_present(&self) -> u64 {
817            if let Some(_) = self.view_creation_token {
818                return 1;
819            }
820            0
821        }
822    }
823
824    impl fidl::encoding::ResourceTypeMarker for CreateView2Args {
825        type Borrowed<'a> = &'a mut Self;
826        fn take_or_borrow<'a>(
827            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
828        ) -> Self::Borrowed<'a> {
829            value
830        }
831    }
832
833    unsafe impl fidl::encoding::TypeMarker for CreateView2Args {
834        type Owned = Self;
835
836        #[inline(always)]
837        fn inline_align(_context: fidl::encoding::Context) -> usize {
838            8
839        }
840
841        #[inline(always)]
842        fn inline_size(_context: fidl::encoding::Context) -> usize {
843            16
844        }
845    }
846
847    unsafe impl
848        fidl::encoding::Encode<CreateView2Args, fidl::encoding::DefaultFuchsiaResourceDialect>
849        for &mut CreateView2Args
850    {
851        unsafe fn encode(
852            self,
853            encoder: &mut fidl::encoding::Encoder<
854                '_,
855                fidl::encoding::DefaultFuchsiaResourceDialect,
856            >,
857            offset: usize,
858            mut depth: fidl::encoding::Depth,
859        ) -> fidl::Result<()> {
860            encoder.debug_check_bounds::<CreateView2Args>(offset);
861            // Vector header
862            let max_ordinal: u64 = self.max_ordinal_present();
863            encoder.write_num(max_ordinal, offset);
864            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
865            // Calling encoder.out_of_line_offset(0) is not allowed.
866            if max_ordinal == 0 {
867                return Ok(());
868            }
869            depth.increment()?;
870            let envelope_size = 8;
871            let bytes_len = max_ordinal as usize * envelope_size;
872            #[allow(unused_variables)]
873            let offset = encoder.out_of_line_offset(bytes_len);
874            let mut _prev_end_offset: usize = 0;
875            if 1 > max_ordinal {
876                return Ok(());
877            }
878
879            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
880            // are envelope_size bytes.
881            let cur_offset: usize = (1 - 1) * envelope_size;
882
883            // Zero reserved fields.
884            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
885
886            // Safety:
887            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
888            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
889            //   envelope_size bytes, there is always sufficient room.
890            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_ui_views::ViewCreationToken, fidl::encoding::DefaultFuchsiaResourceDialect>(
891            self.view_creation_token.as_mut().map(<fidl_fuchsia_ui_views::ViewCreationToken as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
892            encoder, offset + cur_offset, depth
893        )?;
894
895            _prev_end_offset = cur_offset + envelope_size;
896
897            Ok(())
898        }
899    }
900
901    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
902        for CreateView2Args
903    {
904        #[inline(always)]
905        fn new_empty() -> Self {
906            Self::default()
907        }
908
909        unsafe fn decode(
910            &mut self,
911            decoder: &mut fidl::encoding::Decoder<
912                '_,
913                fidl::encoding::DefaultFuchsiaResourceDialect,
914            >,
915            offset: usize,
916            mut depth: fidl::encoding::Depth,
917        ) -> fidl::Result<()> {
918            decoder.debug_check_bounds::<Self>(offset);
919            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
920                None => return Err(fidl::Error::NotNullable),
921                Some(len) => len,
922            };
923            // Calling decoder.out_of_line_offset(0) is not allowed.
924            if len == 0 {
925                return Ok(());
926            };
927            depth.increment()?;
928            let envelope_size = 8;
929            let bytes_len = len * envelope_size;
930            let offset = decoder.out_of_line_offset(bytes_len)?;
931            // Decode the envelope for each type.
932            let mut _next_ordinal_to_read = 0;
933            let mut next_offset = offset;
934            let end_offset = offset + bytes_len;
935            _next_ordinal_to_read += 1;
936            if next_offset >= end_offset {
937                return Ok(());
938            }
939
940            // Decode unknown envelopes for gaps in ordinals.
941            while _next_ordinal_to_read < 1 {
942                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
943                _next_ordinal_to_read += 1;
944                next_offset += envelope_size;
945            }
946
947            let next_out_of_line = decoder.next_out_of_line();
948            let handles_before = decoder.remaining_handles();
949            if let Some((inlined, num_bytes, num_handles)) =
950                fidl::encoding::decode_envelope_header(decoder, next_offset)?
951            {
952                let member_inline_size = <fidl_fuchsia_ui_views::ViewCreationToken as fidl::encoding::TypeMarker>::inline_size(decoder.context);
953                if inlined != (member_inline_size <= 4) {
954                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
955                }
956                let inner_offset;
957                let mut inner_depth = depth.clone();
958                if inlined {
959                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
960                    inner_offset = next_offset;
961                } else {
962                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
963                    inner_depth.increment()?;
964                }
965                let val_ref = self.view_creation_token.get_or_insert_with(|| {
966                    fidl::new_empty!(
967                        fidl_fuchsia_ui_views::ViewCreationToken,
968                        fidl::encoding::DefaultFuchsiaResourceDialect
969                    )
970                });
971                fidl::decode!(
972                    fidl_fuchsia_ui_views::ViewCreationToken,
973                    fidl::encoding::DefaultFuchsiaResourceDialect,
974                    val_ref,
975                    decoder,
976                    inner_offset,
977                    inner_depth
978                )?;
979                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
980                {
981                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
982                }
983                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
984                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
985                }
986            }
987
988            next_offset += envelope_size;
989
990            // Decode the remaining unknown envelopes.
991            while next_offset < end_offset {
992                _next_ordinal_to_read += 1;
993                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
994                next_offset += envelope_size;
995            }
996
997            Ok(())
998        }
999    }
1000}