fidl_test_powerelementrunner/
fidl_test_powerelementrunner.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_test_powerelementrunner__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
15pub struct ControlStartRequest {
16    pub element_name: String,
17    pub initial_current_level: u8,
18    pub element_runner: fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
19}
20
21impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ControlStartRequest {}
22
23#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
24pub struct ControlMarker;
25
26impl fidl::endpoints::ProtocolMarker for ControlMarker {
27    type Proxy = ControlProxy;
28    type RequestStream = ControlRequestStream;
29    #[cfg(target_os = "fuchsia")]
30    type SynchronousProxy = ControlSynchronousProxy;
31
32    const DEBUG_NAME: &'static str = "test.powerelementrunner.Control";
33}
34impl fidl::endpoints::DiscoverableProtocolMarker for ControlMarker {}
35pub type ControlStartResult = Result<(), StartPowerElementError>;
36
37pub trait ControlProxyInterface: Send + Sync {
38    type StartResponseFut: std::future::Future<Output = Result<ControlStartResult, fidl::Error>>
39        + Send;
40    fn r#start(
41        &self,
42        element_name: &str,
43        initial_current_level: u8,
44        element_runner: fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
45    ) -> Self::StartResponseFut;
46}
47#[derive(Debug)]
48#[cfg(target_os = "fuchsia")]
49pub struct ControlSynchronousProxy {
50    client: fidl::client::sync::Client,
51}
52
53#[cfg(target_os = "fuchsia")]
54impl fidl::endpoints::SynchronousProxy for ControlSynchronousProxy {
55    type Proxy = ControlProxy;
56    type Protocol = ControlMarker;
57
58    fn from_channel(inner: fidl::Channel) -> Self {
59        Self::new(inner)
60    }
61
62    fn into_channel(self) -> fidl::Channel {
63        self.client.into_channel()
64    }
65
66    fn as_channel(&self) -> &fidl::Channel {
67        self.client.as_channel()
68    }
69}
70
71#[cfg(target_os = "fuchsia")]
72impl ControlSynchronousProxy {
73    pub fn new(channel: fidl::Channel) -> Self {
74        let protocol_name = <ControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
75        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
76    }
77
78    pub fn into_channel(self) -> fidl::Channel {
79        self.client.into_channel()
80    }
81
82    /// Waits until an event arrives and returns it. It is safe for other
83    /// threads to make concurrent requests while waiting for an event.
84    pub fn wait_for_event(
85        &self,
86        deadline: zx::MonotonicInstant,
87    ) -> Result<ControlEvent, fidl::Error> {
88        ControlEvent::decode(self.client.wait_for_event(deadline)?)
89    }
90
91    pub fn r#start(
92        &self,
93        mut element_name: &str,
94        mut initial_current_level: u8,
95        mut element_runner: fidl::endpoints::ServerEnd<
96            fidl_fuchsia_power_broker::ElementRunnerMarker,
97        >,
98        ___deadline: zx::MonotonicInstant,
99    ) -> Result<ControlStartResult, fidl::Error> {
100        let _response =
101            self.client
102                .send_query::<ControlStartRequest, fidl::encoding::FlexibleResultType<
103                    fidl::encoding::EmptyStruct,
104                    StartPowerElementError,
105                >>(
106                    (element_name, initial_current_level, element_runner),
107                    0x3e14e93b8fd19ea6,
108                    fidl::encoding::DynamicFlags::FLEXIBLE,
109                    ___deadline,
110                )?
111                .into_result::<ControlMarker>("start")?;
112        Ok(_response.map(|x| x))
113    }
114}
115
116#[cfg(target_os = "fuchsia")]
117impl From<ControlSynchronousProxy> for zx::NullableHandle {
118    fn from(value: ControlSynchronousProxy) -> Self {
119        value.into_channel().into()
120    }
121}
122
123#[cfg(target_os = "fuchsia")]
124impl From<fidl::Channel> for ControlSynchronousProxy {
125    fn from(value: fidl::Channel) -> Self {
126        Self::new(value)
127    }
128}
129
130#[cfg(target_os = "fuchsia")]
131impl fidl::endpoints::FromClient for ControlSynchronousProxy {
132    type Protocol = ControlMarker;
133
134    fn from_client(value: fidl::endpoints::ClientEnd<ControlMarker>) -> Self {
135        Self::new(value.into_channel())
136    }
137}
138
139#[derive(Debug, Clone)]
140pub struct ControlProxy {
141    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
142}
143
144impl fidl::endpoints::Proxy for ControlProxy {
145    type Protocol = ControlMarker;
146
147    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
148        Self::new(inner)
149    }
150
151    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
152        self.client.into_channel().map_err(|client| Self { client })
153    }
154
155    fn as_channel(&self) -> &::fidl::AsyncChannel {
156        self.client.as_channel()
157    }
158}
159
160impl ControlProxy {
161    /// Create a new Proxy for test.powerelementrunner/Control.
162    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
163        let protocol_name = <ControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
164        Self { client: fidl::client::Client::new(channel, protocol_name) }
165    }
166
167    /// Get a Stream of events from the remote end of the protocol.
168    ///
169    /// # Panics
170    ///
171    /// Panics if the event stream was already taken.
172    pub fn take_event_stream(&self) -> ControlEventStream {
173        ControlEventStream { event_receiver: self.client.take_event_receiver() }
174    }
175
176    pub fn r#start(
177        &self,
178        mut element_name: &str,
179        mut initial_current_level: u8,
180        mut element_runner: fidl::endpoints::ServerEnd<
181            fidl_fuchsia_power_broker::ElementRunnerMarker,
182        >,
183    ) -> fidl::client::QueryResponseFut<
184        ControlStartResult,
185        fidl::encoding::DefaultFuchsiaResourceDialect,
186    > {
187        ControlProxyInterface::r#start(self, element_name, initial_current_level, element_runner)
188    }
189}
190
191impl ControlProxyInterface for ControlProxy {
192    type StartResponseFut = fidl::client::QueryResponseFut<
193        ControlStartResult,
194        fidl::encoding::DefaultFuchsiaResourceDialect,
195    >;
196    fn r#start(
197        &self,
198        mut element_name: &str,
199        mut initial_current_level: u8,
200        mut element_runner: fidl::endpoints::ServerEnd<
201            fidl_fuchsia_power_broker::ElementRunnerMarker,
202        >,
203    ) -> Self::StartResponseFut {
204        fn _decode(
205            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
206        ) -> Result<ControlStartResult, fidl::Error> {
207            let _response = fidl::client::decode_transaction_body::<
208                fidl::encoding::FlexibleResultType<
209                    fidl::encoding::EmptyStruct,
210                    StartPowerElementError,
211                >,
212                fidl::encoding::DefaultFuchsiaResourceDialect,
213                0x3e14e93b8fd19ea6,
214            >(_buf?)?
215            .into_result::<ControlMarker>("start")?;
216            Ok(_response.map(|x| x))
217        }
218        self.client.send_query_and_decode::<ControlStartRequest, ControlStartResult>(
219            (element_name, initial_current_level, element_runner),
220            0x3e14e93b8fd19ea6,
221            fidl::encoding::DynamicFlags::FLEXIBLE,
222            _decode,
223        )
224    }
225}
226
227pub struct ControlEventStream {
228    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
229}
230
231impl std::marker::Unpin for ControlEventStream {}
232
233impl futures::stream::FusedStream for ControlEventStream {
234    fn is_terminated(&self) -> bool {
235        self.event_receiver.is_terminated()
236    }
237}
238
239impl futures::Stream for ControlEventStream {
240    type Item = Result<ControlEvent, fidl::Error>;
241
242    fn poll_next(
243        mut self: std::pin::Pin<&mut Self>,
244        cx: &mut std::task::Context<'_>,
245    ) -> std::task::Poll<Option<Self::Item>> {
246        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
247            &mut self.event_receiver,
248            cx
249        )?) {
250            Some(buf) => std::task::Poll::Ready(Some(ControlEvent::decode(buf))),
251            None => std::task::Poll::Ready(None),
252        }
253    }
254}
255
256#[derive(Debug)]
257pub enum ControlEvent {
258    #[non_exhaustive]
259    _UnknownEvent {
260        /// Ordinal of the event that was sent.
261        ordinal: u64,
262    },
263}
264
265impl ControlEvent {
266    /// Decodes a message buffer as a [`ControlEvent`].
267    fn decode(
268        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
269    ) -> Result<ControlEvent, fidl::Error> {
270        let (bytes, _handles) = buf.split_mut();
271        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
272        debug_assert_eq!(tx_header.tx_id, 0);
273        match tx_header.ordinal {
274            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
275                Ok(ControlEvent::_UnknownEvent { ordinal: tx_header.ordinal })
276            }
277            _ => Err(fidl::Error::UnknownOrdinal {
278                ordinal: tx_header.ordinal,
279                protocol_name: <ControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
280            }),
281        }
282    }
283}
284
285/// A Stream of incoming requests for test.powerelementrunner/Control.
286pub struct ControlRequestStream {
287    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
288    is_terminated: bool,
289}
290
291impl std::marker::Unpin for ControlRequestStream {}
292
293impl futures::stream::FusedStream for ControlRequestStream {
294    fn is_terminated(&self) -> bool {
295        self.is_terminated
296    }
297}
298
299impl fidl::endpoints::RequestStream for ControlRequestStream {
300    type Protocol = ControlMarker;
301    type ControlHandle = ControlControlHandle;
302
303    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
304        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
305    }
306
307    fn control_handle(&self) -> Self::ControlHandle {
308        ControlControlHandle { inner: self.inner.clone() }
309    }
310
311    fn into_inner(
312        self,
313    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
314    {
315        (self.inner, self.is_terminated)
316    }
317
318    fn from_inner(
319        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
320        is_terminated: bool,
321    ) -> Self {
322        Self { inner, is_terminated }
323    }
324}
325
326impl futures::Stream for ControlRequestStream {
327    type Item = Result<ControlRequest, fidl::Error>;
328
329    fn poll_next(
330        mut self: std::pin::Pin<&mut Self>,
331        cx: &mut std::task::Context<'_>,
332    ) -> std::task::Poll<Option<Self::Item>> {
333        let this = &mut *self;
334        if this.inner.check_shutdown(cx) {
335            this.is_terminated = true;
336            return std::task::Poll::Ready(None);
337        }
338        if this.is_terminated {
339            panic!("polled ControlRequestStream after completion");
340        }
341        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
342            |bytes, handles| {
343                match this.inner.channel().read_etc(cx, bytes, handles) {
344                    std::task::Poll::Ready(Ok(())) => {}
345                    std::task::Poll::Pending => return std::task::Poll::Pending,
346                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
347                        this.is_terminated = true;
348                        return std::task::Poll::Ready(None);
349                    }
350                    std::task::Poll::Ready(Err(e)) => {
351                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
352                            e.into(),
353                        ))));
354                    }
355                }
356
357                // A message has been received from the channel
358                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
359
360                std::task::Poll::Ready(Some(match header.ordinal {
361                    0x3e14e93b8fd19ea6 => {
362                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
363                        let mut req = fidl::new_empty!(
364                            ControlStartRequest,
365                            fidl::encoding::DefaultFuchsiaResourceDialect
366                        );
367                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<ControlStartRequest>(&header, _body_bytes, handles, &mut req)?;
368                        let control_handle = ControlControlHandle { inner: this.inner.clone() };
369                        Ok(ControlRequest::Start {
370                            element_name: req.element_name,
371                            initial_current_level: req.initial_current_level,
372                            element_runner: req.element_runner,
373
374                            responder: ControlStartResponder {
375                                control_handle: std::mem::ManuallyDrop::new(control_handle),
376                                tx_id: header.tx_id,
377                            },
378                        })
379                    }
380                    _ if header.tx_id == 0
381                        && header
382                            .dynamic_flags()
383                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
384                    {
385                        Ok(ControlRequest::_UnknownMethod {
386                            ordinal: header.ordinal,
387                            control_handle: ControlControlHandle { inner: this.inner.clone() },
388                            method_type: fidl::MethodType::OneWay,
389                        })
390                    }
391                    _ if header
392                        .dynamic_flags()
393                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
394                    {
395                        this.inner.send_framework_err(
396                            fidl::encoding::FrameworkErr::UnknownMethod,
397                            header.tx_id,
398                            header.ordinal,
399                            header.dynamic_flags(),
400                            (bytes, handles),
401                        )?;
402                        Ok(ControlRequest::_UnknownMethod {
403                            ordinal: header.ordinal,
404                            control_handle: ControlControlHandle { inner: this.inner.clone() },
405                            method_type: fidl::MethodType::TwoWay,
406                        })
407                    }
408                    _ => Err(fidl::Error::UnknownOrdinal {
409                        ordinal: header.ordinal,
410                        protocol_name:
411                            <ControlMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
412                    }),
413                }))
414            },
415        )
416    }
417}
418
419#[derive(Debug)]
420pub enum ControlRequest {
421    Start {
422        element_name: String,
423        initial_current_level: u8,
424        element_runner: fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
425        responder: ControlStartResponder,
426    },
427    /// An interaction was received which does not match any known method.
428    #[non_exhaustive]
429    _UnknownMethod {
430        /// Ordinal of the method that was called.
431        ordinal: u64,
432        control_handle: ControlControlHandle,
433        method_type: fidl::MethodType,
434    },
435}
436
437impl ControlRequest {
438    #[allow(irrefutable_let_patterns)]
439    pub fn into_start(
440        self,
441    ) -> Option<(
442        String,
443        u8,
444        fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
445        ControlStartResponder,
446    )> {
447        if let ControlRequest::Start {
448            element_name,
449            initial_current_level,
450            element_runner,
451            responder,
452        } = self
453        {
454            Some((element_name, initial_current_level, element_runner, responder))
455        } else {
456            None
457        }
458    }
459
460    /// Name of the method defined in FIDL
461    pub fn method_name(&self) -> &'static str {
462        match *self {
463            ControlRequest::Start { .. } => "start",
464            ControlRequest::_UnknownMethod { method_type: fidl::MethodType::OneWay, .. } => {
465                "unknown one-way method"
466            }
467            ControlRequest::_UnknownMethod { method_type: fidl::MethodType::TwoWay, .. } => {
468                "unknown two-way method"
469            }
470        }
471    }
472}
473
474#[derive(Debug, Clone)]
475pub struct ControlControlHandle {
476    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
477}
478
479impl fidl::endpoints::ControlHandle for ControlControlHandle {
480    fn shutdown(&self) {
481        self.inner.shutdown()
482    }
483
484    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
485        self.inner.shutdown_with_epitaph(status)
486    }
487
488    fn is_closed(&self) -> bool {
489        self.inner.channel().is_closed()
490    }
491    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
492        self.inner.channel().on_closed()
493    }
494
495    #[cfg(target_os = "fuchsia")]
496    fn signal_peer(
497        &self,
498        clear_mask: zx::Signals,
499        set_mask: zx::Signals,
500    ) -> Result<(), zx_status::Status> {
501        use fidl::Peered;
502        self.inner.channel().signal_peer(clear_mask, set_mask)
503    }
504}
505
506impl ControlControlHandle {}
507
508#[must_use = "FIDL methods require a response to be sent"]
509#[derive(Debug)]
510pub struct ControlStartResponder {
511    control_handle: std::mem::ManuallyDrop<ControlControlHandle>,
512    tx_id: u32,
513}
514
515/// Set the the channel to be shutdown (see [`ControlControlHandle::shutdown`])
516/// if the responder is dropped without sending a response, so that the client
517/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
518impl std::ops::Drop for ControlStartResponder {
519    fn drop(&mut self) {
520        self.control_handle.shutdown();
521        // Safety: drops once, never accessed again
522        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
523    }
524}
525
526impl fidl::endpoints::Responder for ControlStartResponder {
527    type ControlHandle = ControlControlHandle;
528
529    fn control_handle(&self) -> &ControlControlHandle {
530        &self.control_handle
531    }
532
533    fn drop_without_shutdown(mut self) {
534        // Safety: drops once, never accessed again due to mem::forget
535        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
536        // Prevent Drop from running (which would shut down the channel)
537        std::mem::forget(self);
538    }
539}
540
541impl ControlStartResponder {
542    /// Sends a response to the FIDL transaction.
543    ///
544    /// Sets the channel to shutdown if an error occurs.
545    pub fn send(self, mut result: Result<(), StartPowerElementError>) -> Result<(), fidl::Error> {
546        let _result = self.send_raw(result);
547        if _result.is_err() {
548            self.control_handle.shutdown();
549        }
550        self.drop_without_shutdown();
551        _result
552    }
553
554    /// Similar to "send" but does not shutdown the channel if an error occurs.
555    pub fn send_no_shutdown_on_err(
556        self,
557        mut result: Result<(), StartPowerElementError>,
558    ) -> Result<(), fidl::Error> {
559        let _result = self.send_raw(result);
560        self.drop_without_shutdown();
561        _result
562    }
563
564    fn send_raw(&self, mut result: Result<(), StartPowerElementError>) -> Result<(), fidl::Error> {
565        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
566            fidl::encoding::EmptyStruct,
567            StartPowerElementError,
568        >>(
569            fidl::encoding::FlexibleResult::new(result),
570            self.tx_id,
571            0x3e14e93b8fd19ea6,
572            fidl::encoding::DynamicFlags::FLEXIBLE,
573        )
574    }
575}
576
577mod internal {
578    use super::*;
579
580    impl fidl::encoding::ResourceTypeMarker for ControlStartRequest {
581        type Borrowed<'a> = &'a mut Self;
582        fn take_or_borrow<'a>(
583            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
584        ) -> Self::Borrowed<'a> {
585            value
586        }
587    }
588
589    unsafe impl fidl::encoding::TypeMarker for ControlStartRequest {
590        type Owned = Self;
591
592        #[inline(always)]
593        fn inline_align(_context: fidl::encoding::Context) -> usize {
594            8
595        }
596
597        #[inline(always)]
598        fn inline_size(_context: fidl::encoding::Context) -> usize {
599            24
600        }
601    }
602
603    unsafe impl
604        fidl::encoding::Encode<ControlStartRequest, fidl::encoding::DefaultFuchsiaResourceDialect>
605        for &mut ControlStartRequest
606    {
607        #[inline]
608        unsafe fn encode(
609            self,
610            encoder: &mut fidl::encoding::Encoder<
611                '_,
612                fidl::encoding::DefaultFuchsiaResourceDialect,
613            >,
614            offset: usize,
615            _depth: fidl::encoding::Depth,
616        ) -> fidl::Result<()> {
617            encoder.debug_check_bounds::<ControlStartRequest>(offset);
618            // Delegate to tuple encoding.
619            fidl::encoding::Encode::<
620                ControlStartRequest,
621                fidl::encoding::DefaultFuchsiaResourceDialect,
622            >::encode(
623                (
624                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow(
625                        &self.element_name,
626                    ),
627                    <u8 as fidl::encoding::ValueTypeMarker>::borrow(&self.initial_current_level),
628                    <fidl::encoding::Endpoint<
629                        fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
630                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
631                        &mut self.element_runner,
632                    ),
633                ),
634                encoder,
635                offset,
636                _depth,
637            )
638        }
639    }
640    unsafe impl<
641        T0: fidl::encoding::Encode<
642                fidl::encoding::BoundedString<64>,
643                fidl::encoding::DefaultFuchsiaResourceDialect,
644            >,
645        T1: fidl::encoding::Encode<u8, fidl::encoding::DefaultFuchsiaResourceDialect>,
646        T2: fidl::encoding::Encode<
647                fidl::encoding::Endpoint<
648                    fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
649                >,
650                fidl::encoding::DefaultFuchsiaResourceDialect,
651            >,
652    > fidl::encoding::Encode<ControlStartRequest, fidl::encoding::DefaultFuchsiaResourceDialect>
653        for (T0, T1, T2)
654    {
655        #[inline]
656        unsafe fn encode(
657            self,
658            encoder: &mut fidl::encoding::Encoder<
659                '_,
660                fidl::encoding::DefaultFuchsiaResourceDialect,
661            >,
662            offset: usize,
663            depth: fidl::encoding::Depth,
664        ) -> fidl::Result<()> {
665            encoder.debug_check_bounds::<ControlStartRequest>(offset);
666            // Zero out padding regions. There's no need to apply masks
667            // because the unmasked parts will be overwritten by fields.
668            unsafe {
669                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
670                (ptr as *mut u64).write_unaligned(0);
671            }
672            // Write the fields.
673            self.0.encode(encoder, offset + 0, depth)?;
674            self.1.encode(encoder, offset + 16, depth)?;
675            self.2.encode(encoder, offset + 20, depth)?;
676            Ok(())
677        }
678    }
679
680    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
681        for ControlStartRequest
682    {
683        #[inline(always)]
684        fn new_empty() -> Self {
685            Self {
686                element_name: fidl::new_empty!(
687                    fidl::encoding::BoundedString<64>,
688                    fidl::encoding::DefaultFuchsiaResourceDialect
689                ),
690                initial_current_level: fidl::new_empty!(
691                    u8,
692                    fidl::encoding::DefaultFuchsiaResourceDialect
693                ),
694                element_runner: fidl::new_empty!(
695                    fidl::encoding::Endpoint<
696                        fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
697                    >,
698                    fidl::encoding::DefaultFuchsiaResourceDialect
699                ),
700            }
701        }
702
703        #[inline]
704        unsafe fn decode(
705            &mut self,
706            decoder: &mut fidl::encoding::Decoder<
707                '_,
708                fidl::encoding::DefaultFuchsiaResourceDialect,
709            >,
710            offset: usize,
711            _depth: fidl::encoding::Depth,
712        ) -> fidl::Result<()> {
713            decoder.debug_check_bounds::<Self>(offset);
714            // Verify that padding bytes are zero.
715            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
716            let padval = unsafe { (ptr as *const u64).read_unaligned() };
717            let mask = 0xffffff00u64;
718            let maskedval = padval & mask;
719            if maskedval != 0 {
720                return Err(fidl::Error::NonZeroPadding {
721                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
722                });
723            }
724            fidl::decode!(
725                fidl::encoding::BoundedString<64>,
726                fidl::encoding::DefaultFuchsiaResourceDialect,
727                &mut self.element_name,
728                decoder,
729                offset + 0,
730                _depth
731            )?;
732            fidl::decode!(
733                u8,
734                fidl::encoding::DefaultFuchsiaResourceDialect,
735                &mut self.initial_current_level,
736                decoder,
737                offset + 16,
738                _depth
739            )?;
740            fidl::decode!(
741                fidl::encoding::Endpoint<
742                    fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
743                >,
744                fidl::encoding::DefaultFuchsiaResourceDialect,
745                &mut self.element_runner,
746                decoder,
747                offset + 20,
748                _depth
749            )?;
750            Ok(())
751        }
752    }
753}