Skip to main content

fidl_fuchsia_net_power/
fidl_fuchsia_net_power.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_net_power_common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct CreateWakeGroupRequest {
16    pub options: WakeGroupOptions,
17    /// Used by the client to signal its current power state.
18    ///
19    /// [`WAITER_AWAKE_SIGNAL`] or [`WAITER_ASLEEP_SIGNAL`], but never both,
20    /// should be asserted continuously to ensure the netstack stays
21    /// up-to-date on the current state of the client. The netstack closes
22    /// the wake group if both are asserted simultaneously or if the
23    /// eventpair is closed.
24    ///
25    /// Note that this corresponds to the behavior of
26    /// [`fuchsia.starnix.runner/Manager.RegisterWakeWatcher`].
27    pub wake_watcher: fidl::EventPair,
28}
29
30impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for CreateWakeGroupRequest {}
31
32#[derive(Debug, Default, PartialEq)]
33pub struct CreateWakeGroupResponse {
34    /// A token that is used both to identify this wake group when adding
35    /// networking resources (such as sockets) to the group, and for wake
36    /// signaling.
37    ///
38    /// A signal of [`GROUP_WAKEUP_SIGNAL`] is raised to indicate that the
39    /// client should wake up due to incoming data. For efficiency, the
40    /// netstack only newly asserts this when the client is asleep. How long
41    /// it remains asserted after wakeup is unspecified.
42    ///
43    /// Always present.
44    pub token: Option<fidl_fuchsia_net_resources::WakeGroupToken>,
45    #[doc(hidden)]
46    pub __source_breaking: fidl::marker::SourceBreaking,
47}
48
49impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for CreateWakeGroupResponse {}
50
51#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
52pub struct WakeGroupProviderMarker;
53
54impl fidl::endpoints::ProtocolMarker for WakeGroupProviderMarker {
55    type Proxy = WakeGroupProviderProxy;
56    type RequestStream = WakeGroupProviderRequestStream;
57    #[cfg(target_os = "fuchsia")]
58    type SynchronousProxy = WakeGroupProviderSynchronousProxy;
59
60    const DEBUG_NAME: &'static str = "fuchsia.net.power.WakeGroupProvider";
61}
62impl fidl::endpoints::DiscoverableProtocolMarker for WakeGroupProviderMarker {}
63
64pub trait WakeGroupProviderProxyInterface: Send + Sync {
65    type CreateWakeGroupResponseFut: std::future::Future<Output = Result<CreateWakeGroupResponse, fidl::Error>>
66        + Send;
67    fn r#create_wake_group(
68        &self,
69        options: &WakeGroupOptions,
70        wake_watcher: fidl::EventPair,
71    ) -> Self::CreateWakeGroupResponseFut;
72}
73#[derive(Debug)]
74#[cfg(target_os = "fuchsia")]
75pub struct WakeGroupProviderSynchronousProxy {
76    client: fidl::client::sync::Client,
77}
78
79#[cfg(target_os = "fuchsia")]
80impl fidl::endpoints::SynchronousProxy for WakeGroupProviderSynchronousProxy {
81    type Proxy = WakeGroupProviderProxy;
82    type Protocol = WakeGroupProviderMarker;
83
84    fn from_channel(inner: fidl::Channel) -> Self {
85        Self::new(inner)
86    }
87
88    fn into_channel(self) -> fidl::Channel {
89        self.client.into_channel()
90    }
91
92    fn as_channel(&self) -> &fidl::Channel {
93        self.client.as_channel()
94    }
95}
96
97#[cfg(target_os = "fuchsia")]
98impl WakeGroupProviderSynchronousProxy {
99    pub fn new(channel: fidl::Channel) -> Self {
100        Self { client: fidl::client::sync::Client::new(channel) }
101    }
102
103    pub fn into_channel(self) -> fidl::Channel {
104        self.client.into_channel()
105    }
106
107    /// Waits until an event arrives and returns it. It is safe for other
108    /// threads to make concurrent requests while waiting for an event.
109    pub fn wait_for_event(
110        &self,
111        deadline: zx::MonotonicInstant,
112    ) -> Result<WakeGroupProviderEvent, fidl::Error> {
113        WakeGroupProviderEvent::decode(
114            self.client.wait_for_event::<WakeGroupProviderMarker>(deadline)?,
115        )
116    }
117
118    /// Creates a new wake group with the provided options.
119    pub fn r#create_wake_group(
120        &self,
121        mut options: &WakeGroupOptions,
122        mut wake_watcher: fidl::EventPair,
123        ___deadline: zx::MonotonicInstant,
124    ) -> Result<CreateWakeGroupResponse, fidl::Error> {
125        let _response = self
126            .client
127            .send_query::<CreateWakeGroupRequest, CreateWakeGroupResponse, WakeGroupProviderMarker>(
128                (options, wake_watcher),
129                0x3c6a15f6c6b1447f,
130                fidl::encoding::DynamicFlags::empty(),
131                ___deadline,
132            )?;
133        Ok(_response)
134    }
135}
136
137#[cfg(target_os = "fuchsia")]
138impl From<WakeGroupProviderSynchronousProxy> for zx::NullableHandle {
139    fn from(value: WakeGroupProviderSynchronousProxy) -> Self {
140        value.into_channel().into()
141    }
142}
143
144#[cfg(target_os = "fuchsia")]
145impl From<fidl::Channel> for WakeGroupProviderSynchronousProxy {
146    fn from(value: fidl::Channel) -> Self {
147        Self::new(value)
148    }
149}
150
151#[cfg(target_os = "fuchsia")]
152impl fidl::endpoints::FromClient for WakeGroupProviderSynchronousProxy {
153    type Protocol = WakeGroupProviderMarker;
154
155    fn from_client(value: fidl::endpoints::ClientEnd<WakeGroupProviderMarker>) -> Self {
156        Self::new(value.into_channel())
157    }
158}
159
160#[derive(Debug, Clone)]
161pub struct WakeGroupProviderProxy {
162    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
163}
164
165impl fidl::endpoints::Proxy for WakeGroupProviderProxy {
166    type Protocol = WakeGroupProviderMarker;
167
168    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
169        Self::new(inner)
170    }
171
172    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
173        self.client.into_channel().map_err(|client| Self { client })
174    }
175
176    fn as_channel(&self) -> &::fidl::AsyncChannel {
177        self.client.as_channel()
178    }
179}
180
181impl WakeGroupProviderProxy {
182    /// Create a new Proxy for fuchsia.net.power/WakeGroupProvider.
183    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
184        let protocol_name =
185            <WakeGroupProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
186        Self { client: fidl::client::Client::new(channel, protocol_name) }
187    }
188
189    /// Get a Stream of events from the remote end of the protocol.
190    ///
191    /// # Panics
192    ///
193    /// Panics if the event stream was already taken.
194    pub fn take_event_stream(&self) -> WakeGroupProviderEventStream {
195        WakeGroupProviderEventStream { event_receiver: self.client.take_event_receiver() }
196    }
197
198    /// Creates a new wake group with the provided options.
199    pub fn r#create_wake_group(
200        &self,
201        mut options: &WakeGroupOptions,
202        mut wake_watcher: fidl::EventPair,
203    ) -> fidl::client::QueryResponseFut<
204        CreateWakeGroupResponse,
205        fidl::encoding::DefaultFuchsiaResourceDialect,
206    > {
207        WakeGroupProviderProxyInterface::r#create_wake_group(self, options, wake_watcher)
208    }
209}
210
211impl WakeGroupProviderProxyInterface for WakeGroupProviderProxy {
212    type CreateWakeGroupResponseFut = fidl::client::QueryResponseFut<
213        CreateWakeGroupResponse,
214        fidl::encoding::DefaultFuchsiaResourceDialect,
215    >;
216    fn r#create_wake_group(
217        &self,
218        mut options: &WakeGroupOptions,
219        mut wake_watcher: fidl::EventPair,
220    ) -> Self::CreateWakeGroupResponseFut {
221        fn _decode(
222            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
223        ) -> Result<CreateWakeGroupResponse, fidl::Error> {
224            let _response = fidl::client::decode_transaction_body::<
225                CreateWakeGroupResponse,
226                fidl::encoding::DefaultFuchsiaResourceDialect,
227                0x3c6a15f6c6b1447f,
228            >(_buf?)?;
229            Ok(_response)
230        }
231        self.client.send_query_and_decode::<CreateWakeGroupRequest, CreateWakeGroupResponse>(
232            (options, wake_watcher),
233            0x3c6a15f6c6b1447f,
234            fidl::encoding::DynamicFlags::empty(),
235            _decode,
236        )
237    }
238}
239
240pub struct WakeGroupProviderEventStream {
241    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
242}
243
244impl std::marker::Unpin for WakeGroupProviderEventStream {}
245
246impl futures::stream::FusedStream for WakeGroupProviderEventStream {
247    fn is_terminated(&self) -> bool {
248        self.event_receiver.is_terminated()
249    }
250}
251
252impl futures::Stream for WakeGroupProviderEventStream {
253    type Item = Result<WakeGroupProviderEvent, fidl::Error>;
254
255    fn poll_next(
256        mut self: std::pin::Pin<&mut Self>,
257        cx: &mut std::task::Context<'_>,
258    ) -> std::task::Poll<Option<Self::Item>> {
259        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
260            &mut self.event_receiver,
261            cx
262        )?) {
263            Some(buf) => std::task::Poll::Ready(Some(WakeGroupProviderEvent::decode(buf))),
264            None => std::task::Poll::Ready(None),
265        }
266    }
267}
268
269#[derive(Debug)]
270pub enum WakeGroupProviderEvent {}
271
272impl WakeGroupProviderEvent {
273    /// Decodes a message buffer as a [`WakeGroupProviderEvent`].
274    fn decode(
275        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
276    ) -> Result<WakeGroupProviderEvent, fidl::Error> {
277        let (bytes, _handles) = buf.split_mut();
278        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
279        debug_assert_eq!(tx_header.tx_id, 0);
280        match tx_header.ordinal {
281            _ => Err(fidl::Error::UnknownOrdinal {
282                ordinal: tx_header.ordinal,
283                protocol_name:
284                    <WakeGroupProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
285            }),
286        }
287    }
288}
289
290/// A Stream of incoming requests for fuchsia.net.power/WakeGroupProvider.
291pub struct WakeGroupProviderRequestStream {
292    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
293    is_terminated: bool,
294}
295
296impl std::marker::Unpin for WakeGroupProviderRequestStream {}
297
298impl futures::stream::FusedStream for WakeGroupProviderRequestStream {
299    fn is_terminated(&self) -> bool {
300        self.is_terminated
301    }
302}
303
304impl fidl::endpoints::RequestStream for WakeGroupProviderRequestStream {
305    type Protocol = WakeGroupProviderMarker;
306    type ControlHandle = WakeGroupProviderControlHandle;
307
308    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
309        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
310    }
311
312    fn control_handle(&self) -> Self::ControlHandle {
313        WakeGroupProviderControlHandle { inner: self.inner.clone() }
314    }
315
316    fn into_inner(
317        self,
318    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
319    {
320        (self.inner, self.is_terminated)
321    }
322
323    fn from_inner(
324        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
325        is_terminated: bool,
326    ) -> Self {
327        Self { inner, is_terminated }
328    }
329}
330
331impl futures::Stream for WakeGroupProviderRequestStream {
332    type Item = Result<WakeGroupProviderRequest, fidl::Error>;
333
334    fn poll_next(
335        mut self: std::pin::Pin<&mut Self>,
336        cx: &mut std::task::Context<'_>,
337    ) -> std::task::Poll<Option<Self::Item>> {
338        let this = &mut *self;
339        if this.inner.check_shutdown(cx) {
340            this.is_terminated = true;
341            return std::task::Poll::Ready(None);
342        }
343        if this.is_terminated {
344            panic!("polled WakeGroupProviderRequestStream after completion");
345        }
346        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
347            |bytes, handles| {
348                match this.inner.channel().read_etc(cx, bytes, handles) {
349                    std::task::Poll::Ready(Ok(())) => {}
350                    std::task::Poll::Pending => return std::task::Poll::Pending,
351                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
352                        this.is_terminated = true;
353                        return std::task::Poll::Ready(None);
354                    }
355                    std::task::Poll::Ready(Err(e)) => {
356                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
357                            e.into(),
358                        ))));
359                    }
360                }
361
362                // A message has been received from the channel
363                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
364
365                std::task::Poll::Ready(Some(match header.ordinal {
366                    0x3c6a15f6c6b1447f => {
367                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
368                        let mut req = fidl::new_empty!(
369                            CreateWakeGroupRequest,
370                            fidl::encoding::DefaultFuchsiaResourceDialect
371                        );
372                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<CreateWakeGroupRequest>(&header, _body_bytes, handles, &mut req)?;
373                        let control_handle =
374                            WakeGroupProviderControlHandle { inner: this.inner.clone() };
375                        Ok(WakeGroupProviderRequest::CreateWakeGroup {
376                            options: req.options,
377                            wake_watcher: req.wake_watcher,
378
379                            responder: WakeGroupProviderCreateWakeGroupResponder {
380                                control_handle: std::mem::ManuallyDrop::new(control_handle),
381                                tx_id: header.tx_id,
382                            },
383                        })
384                    }
385                    _ => Err(fidl::Error::UnknownOrdinal {
386                        ordinal: header.ordinal,
387                        protocol_name:
388                            <WakeGroupProviderMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
389                    }),
390                }))
391            },
392        )
393    }
394}
395
396/// A provider of wake groups.
397///
398/// A wake group represents a set of sockets that should wake up a client when
399/// data arrives on any of them. Each `WakeGroupToken` represents a distinct
400/// wake group.
401///
402/// A socket can only be registered with a wake group on creation. To do so,
403/// pass the `WakeGroupToken` to the appropriate `fuchsia.posix.socket` method.
404#[derive(Debug)]
405pub enum WakeGroupProviderRequest {
406    /// Creates a new wake group with the provided options.
407    CreateWakeGroup {
408        options: WakeGroupOptions,
409        wake_watcher: fidl::EventPair,
410        responder: WakeGroupProviderCreateWakeGroupResponder,
411    },
412}
413
414impl WakeGroupProviderRequest {
415    #[allow(irrefutable_let_patterns)]
416    pub fn into_create_wake_group(
417        self,
418    ) -> Option<(WakeGroupOptions, fidl::EventPair, WakeGroupProviderCreateWakeGroupResponder)>
419    {
420        if let WakeGroupProviderRequest::CreateWakeGroup { options, wake_watcher, responder } = self
421        {
422            Some((options, wake_watcher, responder))
423        } else {
424            None
425        }
426    }
427
428    /// Name of the method defined in FIDL
429    pub fn method_name(&self) -> &'static str {
430        match *self {
431            WakeGroupProviderRequest::CreateWakeGroup { .. } => "create_wake_group",
432        }
433    }
434}
435
436#[derive(Debug, Clone)]
437pub struct WakeGroupProviderControlHandle {
438    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
439}
440
441impl WakeGroupProviderControlHandle {
442    pub fn shutdown_with_epitaph(&self, status: impl Into<fidl::Epitaph>) {
443        self.inner.shutdown_with_epitaph(status.into())
444    }
445}
446
447impl fidl::endpoints::ControlHandle for WakeGroupProviderControlHandle {
448    fn shutdown(&self) {
449        self.inner.shutdown()
450    }
451
452    fn shutdown_with_epitaph(&self, status: fidl::Epitaph) {
453        self.inner.shutdown_with_epitaph(status)
454    }
455
456    fn is_closed(&self) -> bool {
457        self.inner.channel().is_closed()
458    }
459    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
460        self.inner.channel().on_closed()
461    }
462
463    #[cfg(target_os = "fuchsia")]
464    fn signal_peer(
465        &self,
466        clear_mask: zx::Signals,
467        set_mask: zx::Signals,
468    ) -> Result<(), zx_status::Status> {
469        use fidl::Peered;
470        self.inner.channel().signal_peer(clear_mask, set_mask)
471    }
472}
473
474impl WakeGroupProviderControlHandle {}
475
476#[must_use = "FIDL methods require a response to be sent"]
477#[derive(Debug)]
478pub struct WakeGroupProviderCreateWakeGroupResponder {
479    control_handle: std::mem::ManuallyDrop<WakeGroupProviderControlHandle>,
480    tx_id: u32,
481}
482
483/// Set the the channel to be shutdown (see [`WakeGroupProviderControlHandle::shutdown`])
484/// if the responder is dropped without sending a response, so that the client
485/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
486impl std::ops::Drop for WakeGroupProviderCreateWakeGroupResponder {
487    fn drop(&mut self) {
488        self.control_handle.shutdown();
489        // Safety: drops once, never accessed again
490        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
491    }
492}
493
494impl fidl::endpoints::Responder for WakeGroupProviderCreateWakeGroupResponder {
495    type ControlHandle = WakeGroupProviderControlHandle;
496
497    fn control_handle(&self) -> &WakeGroupProviderControlHandle {
498        &self.control_handle
499    }
500
501    fn drop_without_shutdown(mut self) {
502        // Safety: drops once, never accessed again due to mem::forget
503        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
504        // Prevent Drop from running (which would shut down the channel)
505        std::mem::forget(self);
506    }
507}
508
509impl WakeGroupProviderCreateWakeGroupResponder {
510    /// Sends a response to the FIDL transaction.
511    ///
512    /// Sets the channel to shutdown if an error occurs.
513    pub fn send(self, mut payload: CreateWakeGroupResponse) -> Result<(), fidl::Error> {
514        let _result = self.send_raw(payload);
515        if _result.is_err() {
516            self.control_handle.shutdown();
517        }
518        self.drop_without_shutdown();
519        _result
520    }
521
522    /// Similar to "send" but does not shutdown the channel if an error occurs.
523    pub fn send_no_shutdown_on_err(
524        self,
525        mut payload: CreateWakeGroupResponse,
526    ) -> Result<(), fidl::Error> {
527        let _result = self.send_raw(payload);
528        self.drop_without_shutdown();
529        _result
530    }
531
532    fn send_raw(&self, mut payload: CreateWakeGroupResponse) -> Result<(), fidl::Error> {
533        self.control_handle.inner.send::<CreateWakeGroupResponse>(
534            &mut payload,
535            self.tx_id,
536            0x3c6a15f6c6b1447f,
537            fidl::encoding::DynamicFlags::empty(),
538        )
539    }
540}
541
542mod internal {
543    use super::*;
544
545    impl fidl::encoding::ResourceTypeMarker for CreateWakeGroupRequest {
546        type Borrowed<'a> = &'a mut Self;
547        fn take_or_borrow<'a>(
548            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
549        ) -> Self::Borrowed<'a> {
550            value
551        }
552    }
553
554    unsafe impl fidl::encoding::TypeMarker for CreateWakeGroupRequest {
555        type Owned = Self;
556
557        #[inline(always)]
558        fn inline_align(_context: fidl::encoding::Context) -> usize {
559            8
560        }
561
562        #[inline(always)]
563        fn inline_size(_context: fidl::encoding::Context) -> usize {
564            24
565        }
566    }
567
568    unsafe impl
569        fidl::encoding::Encode<
570            CreateWakeGroupRequest,
571            fidl::encoding::DefaultFuchsiaResourceDialect,
572        > for &mut CreateWakeGroupRequest
573    {
574        #[inline]
575        unsafe fn encode(
576            self,
577            encoder: &mut fidl::encoding::Encoder<
578                '_,
579                fidl::encoding::DefaultFuchsiaResourceDialect,
580            >,
581            offset: usize,
582            _depth: fidl::encoding::Depth,
583        ) -> fidl::Result<()> {
584            encoder.debug_check_bounds::<CreateWakeGroupRequest>(offset);
585            // Delegate to tuple encoding.
586            fidl::encoding::Encode::<
587                CreateWakeGroupRequest,
588                fidl::encoding::DefaultFuchsiaResourceDialect,
589            >::encode(
590                (
591                    <WakeGroupOptions as fidl::encoding::ValueTypeMarker>::borrow(&self.options),
592                    <fidl::encoding::HandleType<
593                        fidl::EventPair,
594                        { fidl::ObjectType::EVENTPAIR.into_raw() },
595                        16386,
596                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
597                        &mut self.wake_watcher,
598                    ),
599                ),
600                encoder,
601                offset,
602                _depth,
603            )
604        }
605    }
606    unsafe impl<
607        T0: fidl::encoding::Encode<WakeGroupOptions, fidl::encoding::DefaultFuchsiaResourceDialect>,
608        T1: fidl::encoding::Encode<
609                fidl::encoding::HandleType<
610                    fidl::EventPair,
611                    { fidl::ObjectType::EVENTPAIR.into_raw() },
612                    16386,
613                >,
614                fidl::encoding::DefaultFuchsiaResourceDialect,
615            >,
616    >
617        fidl::encoding::Encode<
618            CreateWakeGroupRequest,
619            fidl::encoding::DefaultFuchsiaResourceDialect,
620        > for (T0, T1)
621    {
622        #[inline]
623        unsafe fn encode(
624            self,
625            encoder: &mut fidl::encoding::Encoder<
626                '_,
627                fidl::encoding::DefaultFuchsiaResourceDialect,
628            >,
629            offset: usize,
630            depth: fidl::encoding::Depth,
631        ) -> fidl::Result<()> {
632            encoder.debug_check_bounds::<CreateWakeGroupRequest>(offset);
633            // Zero out padding regions. There's no need to apply masks
634            // because the unmasked parts will be overwritten by fields.
635            unsafe {
636                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
637                (ptr as *mut u64).write_unaligned(0);
638            }
639            // Write the fields.
640            self.0.encode(encoder, offset + 0, depth)?;
641            self.1.encode(encoder, offset + 16, depth)?;
642            Ok(())
643        }
644    }
645
646    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
647        for CreateWakeGroupRequest
648    {
649        #[inline(always)]
650        fn new_empty() -> Self {
651            Self {
652                options: fidl::new_empty!(
653                    WakeGroupOptions,
654                    fidl::encoding::DefaultFuchsiaResourceDialect
655                ),
656                wake_watcher: fidl::new_empty!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 16386>, fidl::encoding::DefaultFuchsiaResourceDialect),
657            }
658        }
659
660        #[inline]
661        unsafe fn decode(
662            &mut self,
663            decoder: &mut fidl::encoding::Decoder<
664                '_,
665                fidl::encoding::DefaultFuchsiaResourceDialect,
666            >,
667            offset: usize,
668            _depth: fidl::encoding::Depth,
669        ) -> fidl::Result<()> {
670            decoder.debug_check_bounds::<Self>(offset);
671            // Verify that padding bytes are zero.
672            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
673            let padval = unsafe { (ptr as *const u64).read_unaligned() };
674            let mask = 0xffffffff00000000u64;
675            let maskedval = padval & mask;
676            if maskedval != 0 {
677                return Err(fidl::Error::NonZeroPadding {
678                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
679                });
680            }
681            fidl::decode!(
682                WakeGroupOptions,
683                fidl::encoding::DefaultFuchsiaResourceDialect,
684                &mut self.options,
685                decoder,
686                offset + 0,
687                _depth
688            )?;
689            fidl::decode!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 16386>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.wake_watcher, decoder, offset + 16, _depth)?;
690            Ok(())
691        }
692    }
693
694    impl CreateWakeGroupResponse {
695        #[inline(always)]
696        fn max_ordinal_present(&self) -> u64 {
697            if let Some(_) = self.token {
698                return 1;
699            }
700            0
701        }
702    }
703
704    impl fidl::encoding::ResourceTypeMarker for CreateWakeGroupResponse {
705        type Borrowed<'a> = &'a mut Self;
706        fn take_or_borrow<'a>(
707            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
708        ) -> Self::Borrowed<'a> {
709            value
710        }
711    }
712
713    unsafe impl fidl::encoding::TypeMarker for CreateWakeGroupResponse {
714        type Owned = Self;
715
716        #[inline(always)]
717        fn inline_align(_context: fidl::encoding::Context) -> usize {
718            8
719        }
720
721        #[inline(always)]
722        fn inline_size(_context: fidl::encoding::Context) -> usize {
723            16
724        }
725    }
726
727    unsafe impl
728        fidl::encoding::Encode<
729            CreateWakeGroupResponse,
730            fidl::encoding::DefaultFuchsiaResourceDialect,
731        > for &mut CreateWakeGroupResponse
732    {
733        unsafe fn encode(
734            self,
735            encoder: &mut fidl::encoding::Encoder<
736                '_,
737                fidl::encoding::DefaultFuchsiaResourceDialect,
738            >,
739            offset: usize,
740            mut depth: fidl::encoding::Depth,
741        ) -> fidl::Result<()> {
742            encoder.debug_check_bounds::<CreateWakeGroupResponse>(offset);
743            // Vector header
744            let max_ordinal: u64 = self.max_ordinal_present();
745            encoder.write_num(max_ordinal, offset);
746            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
747            // Calling encoder.out_of_line_offset(0) is not allowed.
748            if max_ordinal == 0 {
749                return Ok(());
750            }
751            depth.increment()?;
752            let envelope_size = 8;
753            let bytes_len = max_ordinal as usize * envelope_size;
754            #[allow(unused_variables)]
755            let offset = encoder.out_of_line_offset(bytes_len);
756            let mut _prev_end_offset: usize = 0;
757            if 1 > max_ordinal {
758                return Ok(());
759            }
760
761            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
762            // are envelope_size bytes.
763            let cur_offset: usize = (1 - 1) * envelope_size;
764
765            // Zero reserved fields.
766            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
767
768            // Safety:
769            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
770            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
771            //   envelope_size bytes, there is always sufficient room.
772            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_net_resources::WakeGroupToken, fidl::encoding::DefaultFuchsiaResourceDialect>(
773            self.token.as_mut().map(<fidl_fuchsia_net_resources::WakeGroupToken as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
774            encoder, offset + cur_offset, depth
775        )?;
776
777            _prev_end_offset = cur_offset + envelope_size;
778
779            Ok(())
780        }
781    }
782
783    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
784        for CreateWakeGroupResponse
785    {
786        #[inline(always)]
787        fn new_empty() -> Self {
788            Self::default()
789        }
790
791        unsafe fn decode(
792            &mut self,
793            decoder: &mut fidl::encoding::Decoder<
794                '_,
795                fidl::encoding::DefaultFuchsiaResourceDialect,
796            >,
797            offset: usize,
798            mut depth: fidl::encoding::Depth,
799        ) -> fidl::Result<()> {
800            decoder.debug_check_bounds::<Self>(offset);
801            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
802                None => return Err(fidl::Error::NotNullable),
803                Some(len) => len,
804            };
805            // Calling decoder.out_of_line_offset(0) is not allowed.
806            if len == 0 {
807                return Ok(());
808            };
809            depth.increment()?;
810            let envelope_size = 8;
811            let bytes_len = len * envelope_size;
812            let offset = decoder.out_of_line_offset(bytes_len)?;
813            // Decode the envelope for each type.
814            let mut _next_ordinal_to_read = 0;
815            let mut next_offset = offset;
816            let end_offset = offset + bytes_len;
817            _next_ordinal_to_read += 1;
818            if next_offset >= end_offset {
819                return Ok(());
820            }
821
822            // Decode unknown envelopes for gaps in ordinals.
823            while _next_ordinal_to_read < 1 {
824                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
825                _next_ordinal_to_read += 1;
826                next_offset += envelope_size;
827            }
828
829            let next_out_of_line = decoder.next_out_of_line();
830            let handles_before = decoder.remaining_handles();
831            if let Some((inlined, num_bytes, num_handles)) =
832                fidl::encoding::decode_envelope_header(decoder, next_offset)?
833            {
834                let member_inline_size = <fidl_fuchsia_net_resources::WakeGroupToken as fidl::encoding::TypeMarker>::inline_size(decoder.context);
835                if inlined != (member_inline_size <= 4) {
836                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
837                }
838                let inner_offset;
839                let mut inner_depth = depth.clone();
840                if inlined {
841                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
842                    inner_offset = next_offset;
843                } else {
844                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
845                    inner_depth.increment()?;
846                }
847                let val_ref = self.token.get_or_insert_with(|| {
848                    fidl::new_empty!(
849                        fidl_fuchsia_net_resources::WakeGroupToken,
850                        fidl::encoding::DefaultFuchsiaResourceDialect
851                    )
852                });
853                fidl::decode!(
854                    fidl_fuchsia_net_resources::WakeGroupToken,
855                    fidl::encoding::DefaultFuchsiaResourceDialect,
856                    val_ref,
857                    decoder,
858                    inner_offset,
859                    inner_depth
860                )?;
861                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
862                {
863                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
864                }
865                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
866                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
867                }
868            }
869
870            next_offset += envelope_size;
871
872            // Decode the remaining unknown envelopes.
873            while next_offset < end_offset {
874                _next_ordinal_to_read += 1;
875                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
876                next_offset += envelope_size;
877            }
878
879            Ok(())
880        }
881    }
882}