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::Handle {
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    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
484        self.inner.shutdown_with_epitaph(status)
485    }
486
487    fn is_closed(&self) -> bool {
488        self.inner.channel().is_closed()
489    }
490    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
491        self.inner.channel().on_closed()
492    }
493
494    #[cfg(target_os = "fuchsia")]
495    fn signal_peer(
496        &self,
497        clear_mask: zx::Signals,
498        set_mask: zx::Signals,
499    ) -> Result<(), zx_status::Status> {
500        use fidl::Peered;
501        self.inner.channel().signal_peer(clear_mask, set_mask)
502    }
503}
504
505impl ControlControlHandle {}
506
507#[must_use = "FIDL methods require a response to be sent"]
508#[derive(Debug)]
509pub struct ControlStartResponder {
510    control_handle: std::mem::ManuallyDrop<ControlControlHandle>,
511    tx_id: u32,
512}
513
514/// Set the the channel to be shutdown (see [`ControlControlHandle::shutdown`])
515/// if the responder is dropped without sending a response, so that the client
516/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
517impl std::ops::Drop for ControlStartResponder {
518    fn drop(&mut self) {
519        self.control_handle.shutdown();
520        // Safety: drops once, never accessed again
521        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
522    }
523}
524
525impl fidl::endpoints::Responder for ControlStartResponder {
526    type ControlHandle = ControlControlHandle;
527
528    fn control_handle(&self) -> &ControlControlHandle {
529        &self.control_handle
530    }
531
532    fn drop_without_shutdown(mut self) {
533        // Safety: drops once, never accessed again due to mem::forget
534        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
535        // Prevent Drop from running (which would shut down the channel)
536        std::mem::forget(self);
537    }
538}
539
540impl ControlStartResponder {
541    /// Sends a response to the FIDL transaction.
542    ///
543    /// Sets the channel to shutdown if an error occurs.
544    pub fn send(self, mut result: Result<(), StartPowerElementError>) -> Result<(), fidl::Error> {
545        let _result = self.send_raw(result);
546        if _result.is_err() {
547            self.control_handle.shutdown();
548        }
549        self.drop_without_shutdown();
550        _result
551    }
552
553    /// Similar to "send" but does not shutdown the channel if an error occurs.
554    pub fn send_no_shutdown_on_err(
555        self,
556        mut result: Result<(), StartPowerElementError>,
557    ) -> Result<(), fidl::Error> {
558        let _result = self.send_raw(result);
559        self.drop_without_shutdown();
560        _result
561    }
562
563    fn send_raw(&self, mut result: Result<(), StartPowerElementError>) -> Result<(), fidl::Error> {
564        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
565            fidl::encoding::EmptyStruct,
566            StartPowerElementError,
567        >>(
568            fidl::encoding::FlexibleResult::new(result),
569            self.tx_id,
570            0x3e14e93b8fd19ea6,
571            fidl::encoding::DynamicFlags::FLEXIBLE,
572        )
573    }
574}
575
576mod internal {
577    use super::*;
578
579    impl fidl::encoding::ResourceTypeMarker for ControlStartRequest {
580        type Borrowed<'a> = &'a mut Self;
581        fn take_or_borrow<'a>(
582            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
583        ) -> Self::Borrowed<'a> {
584            value
585        }
586    }
587
588    unsafe impl fidl::encoding::TypeMarker for ControlStartRequest {
589        type Owned = Self;
590
591        #[inline(always)]
592        fn inline_align(_context: fidl::encoding::Context) -> usize {
593            8
594        }
595
596        #[inline(always)]
597        fn inline_size(_context: fidl::encoding::Context) -> usize {
598            24
599        }
600    }
601
602    unsafe impl
603        fidl::encoding::Encode<ControlStartRequest, fidl::encoding::DefaultFuchsiaResourceDialect>
604        for &mut ControlStartRequest
605    {
606        #[inline]
607        unsafe fn encode(
608            self,
609            encoder: &mut fidl::encoding::Encoder<
610                '_,
611                fidl::encoding::DefaultFuchsiaResourceDialect,
612            >,
613            offset: usize,
614            _depth: fidl::encoding::Depth,
615        ) -> fidl::Result<()> {
616            encoder.debug_check_bounds::<ControlStartRequest>(offset);
617            // Delegate to tuple encoding.
618            fidl::encoding::Encode::<
619                ControlStartRequest,
620                fidl::encoding::DefaultFuchsiaResourceDialect,
621            >::encode(
622                (
623                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow(
624                        &self.element_name,
625                    ),
626                    <u8 as fidl::encoding::ValueTypeMarker>::borrow(&self.initial_current_level),
627                    <fidl::encoding::Endpoint<
628                        fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
629                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
630                        &mut self.element_runner,
631                    ),
632                ),
633                encoder,
634                offset,
635                _depth,
636            )
637        }
638    }
639    unsafe impl<
640        T0: fidl::encoding::Encode<
641                fidl::encoding::BoundedString<64>,
642                fidl::encoding::DefaultFuchsiaResourceDialect,
643            >,
644        T1: fidl::encoding::Encode<u8, fidl::encoding::DefaultFuchsiaResourceDialect>,
645        T2: fidl::encoding::Encode<
646                fidl::encoding::Endpoint<
647                    fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
648                >,
649                fidl::encoding::DefaultFuchsiaResourceDialect,
650            >,
651    > fidl::encoding::Encode<ControlStartRequest, fidl::encoding::DefaultFuchsiaResourceDialect>
652        for (T0, T1, T2)
653    {
654        #[inline]
655        unsafe fn encode(
656            self,
657            encoder: &mut fidl::encoding::Encoder<
658                '_,
659                fidl::encoding::DefaultFuchsiaResourceDialect,
660            >,
661            offset: usize,
662            depth: fidl::encoding::Depth,
663        ) -> fidl::Result<()> {
664            encoder.debug_check_bounds::<ControlStartRequest>(offset);
665            // Zero out padding regions. There's no need to apply masks
666            // because the unmasked parts will be overwritten by fields.
667            unsafe {
668                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
669                (ptr as *mut u64).write_unaligned(0);
670            }
671            // Write the fields.
672            self.0.encode(encoder, offset + 0, depth)?;
673            self.1.encode(encoder, offset + 16, depth)?;
674            self.2.encode(encoder, offset + 20, depth)?;
675            Ok(())
676        }
677    }
678
679    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
680        for ControlStartRequest
681    {
682        #[inline(always)]
683        fn new_empty() -> Self {
684            Self {
685                element_name: fidl::new_empty!(
686                    fidl::encoding::BoundedString<64>,
687                    fidl::encoding::DefaultFuchsiaResourceDialect
688                ),
689                initial_current_level: fidl::new_empty!(
690                    u8,
691                    fidl::encoding::DefaultFuchsiaResourceDialect
692                ),
693                element_runner: fidl::new_empty!(
694                    fidl::encoding::Endpoint<
695                        fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
696                    >,
697                    fidl::encoding::DefaultFuchsiaResourceDialect
698                ),
699            }
700        }
701
702        #[inline]
703        unsafe fn decode(
704            &mut self,
705            decoder: &mut fidl::encoding::Decoder<
706                '_,
707                fidl::encoding::DefaultFuchsiaResourceDialect,
708            >,
709            offset: usize,
710            _depth: fidl::encoding::Depth,
711        ) -> fidl::Result<()> {
712            decoder.debug_check_bounds::<Self>(offset);
713            // Verify that padding bytes are zero.
714            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
715            let padval = unsafe { (ptr as *const u64).read_unaligned() };
716            let mask = 0xffffff00u64;
717            let maskedval = padval & mask;
718            if maskedval != 0 {
719                return Err(fidl::Error::NonZeroPadding {
720                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
721                });
722            }
723            fidl::decode!(
724                fidl::encoding::BoundedString<64>,
725                fidl::encoding::DefaultFuchsiaResourceDialect,
726                &mut self.element_name,
727                decoder,
728                offset + 0,
729                _depth
730            )?;
731            fidl::decode!(
732                u8,
733                fidl::encoding::DefaultFuchsiaResourceDialect,
734                &mut self.initial_current_level,
735                decoder,
736                offset + 16,
737                _depth
738            )?;
739            fidl::decode!(
740                fidl::encoding::Endpoint<
741                    fidl::endpoints::ServerEnd<fidl_fuchsia_power_broker::ElementRunnerMarker>,
742                >,
743                fidl::encoding::DefaultFuchsiaResourceDialect,
744                &mut self.element_runner,
745                decoder,
746                offset + 20,
747                _depth
748            )?;
749            Ok(())
750        }
751    }
752}