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