fidl_fuchsia_lowpan_driver/
fidl_fuchsia_lowpan_driver.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_lowpan_driver_common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct DriverGetProtocolsRequest {
16    pub protocols: Protocols,
17}
18
19impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for DriverGetProtocolsRequest {}
20
21#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
22pub struct RegisterRegisterDeviceRequest {
23    pub name: String,
24    pub driver: fidl::endpoints::ClientEnd<DriverMarker>,
25}
26
27impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
28    for RegisterRegisterDeviceRequest
29{
30}
31
32/// Table of protocol requests that is passed into `Driver.GetProtocols()`.
33#[derive(Debug, Default, PartialEq)]
34pub struct Protocols {
35    pub device: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>>,
36    pub device_extra:
37        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>>,
38    pub device_test: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>>,
39    pub device_route:
40        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceRouteMarker>>,
41    pub device_route_extra: Option<
42        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker>,
43    >,
44    pub counters: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>>,
45    pub thread_legacy_joining:
46        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker>>,
47    pub thread_dataset:
48        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>>,
49    pub energy_scan:
50        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>>,
51    pub experimental_device:
52        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>>,
53    pub experimental_device_extra:
54        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceExtraMarker>>,
55    pub meshcop: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>>,
56    pub telemetry_provider: Option<
57        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker>,
58    >,
59    pub thread_feature:
60        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>>,
61    pub capabilities:
62        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker>>,
63    #[doc(hidden)]
64    pub __source_breaking: fidl::marker::SourceBreaking,
65}
66
67impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Protocols {}
68
69#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
70pub struct DriverMarker;
71
72impl fidl::endpoints::ProtocolMarker for DriverMarker {
73    type Proxy = DriverProxy;
74    type RequestStream = DriverRequestStream;
75    #[cfg(target_os = "fuchsia")]
76    type SynchronousProxy = DriverSynchronousProxy;
77
78    const DEBUG_NAME: &'static str = "(anonymous) Driver";
79}
80
81pub trait DriverProxyInterface: Send + Sync {
82    fn r#get_protocols(&self, protocols: Protocols) -> Result<(), fidl::Error>;
83}
84#[derive(Debug)]
85#[cfg(target_os = "fuchsia")]
86pub struct DriverSynchronousProxy {
87    client: fidl::client::sync::Client,
88}
89
90#[cfg(target_os = "fuchsia")]
91impl fidl::endpoints::SynchronousProxy for DriverSynchronousProxy {
92    type Proxy = DriverProxy;
93    type Protocol = DriverMarker;
94
95    fn from_channel(inner: fidl::Channel) -> Self {
96        Self::new(inner)
97    }
98
99    fn into_channel(self) -> fidl::Channel {
100        self.client.into_channel()
101    }
102
103    fn as_channel(&self) -> &fidl::Channel {
104        self.client.as_channel()
105    }
106}
107
108#[cfg(target_os = "fuchsia")]
109impl DriverSynchronousProxy {
110    pub fn new(channel: fidl::Channel) -> Self {
111        let protocol_name = <DriverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
112        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
113    }
114
115    pub fn into_channel(self) -> fidl::Channel {
116        self.client.into_channel()
117    }
118
119    /// Waits until an event arrives and returns it. It is safe for other
120    /// threads to make concurrent requests while waiting for an event.
121    pub fn wait_for_event(
122        &self,
123        deadline: zx::MonotonicInstant,
124    ) -> Result<DriverEvent, fidl::Error> {
125        DriverEvent::decode(self.client.wait_for_event(deadline)?)
126    }
127
128    /// Request protocols to control this device.
129    /// Unsupported protocols are closed.
130    pub fn r#get_protocols(&self, mut protocols: Protocols) -> Result<(), fidl::Error> {
131        self.client.send::<DriverGetProtocolsRequest>(
132            (&mut protocols,),
133            0x165f5b09fcc7bc85,
134            fidl::encoding::DynamicFlags::empty(),
135        )
136    }
137}
138
139#[derive(Debug, Clone)]
140pub struct DriverProxy {
141    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
142}
143
144impl fidl::endpoints::Proxy for DriverProxy {
145    type Protocol = DriverMarker;
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 DriverProxy {
161    /// Create a new Proxy for fuchsia.lowpan.driver/Driver.
162    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
163        let protocol_name = <DriverMarker 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) -> DriverEventStream {
173        DriverEventStream { event_receiver: self.client.take_event_receiver() }
174    }
175
176    /// Request protocols to control this device.
177    /// Unsupported protocols are closed.
178    pub fn r#get_protocols(&self, mut protocols: Protocols) -> Result<(), fidl::Error> {
179        DriverProxyInterface::r#get_protocols(self, protocols)
180    }
181}
182
183impl DriverProxyInterface for DriverProxy {
184    fn r#get_protocols(&self, mut protocols: Protocols) -> Result<(), fidl::Error> {
185        self.client.send::<DriverGetProtocolsRequest>(
186            (&mut protocols,),
187            0x165f5b09fcc7bc85,
188            fidl::encoding::DynamicFlags::empty(),
189        )
190    }
191}
192
193pub struct DriverEventStream {
194    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
195}
196
197impl std::marker::Unpin for DriverEventStream {}
198
199impl futures::stream::FusedStream for DriverEventStream {
200    fn is_terminated(&self) -> bool {
201        self.event_receiver.is_terminated()
202    }
203}
204
205impl futures::Stream for DriverEventStream {
206    type Item = Result<DriverEvent, fidl::Error>;
207
208    fn poll_next(
209        mut self: std::pin::Pin<&mut Self>,
210        cx: &mut std::task::Context<'_>,
211    ) -> std::task::Poll<Option<Self::Item>> {
212        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
213            &mut self.event_receiver,
214            cx
215        )?) {
216            Some(buf) => std::task::Poll::Ready(Some(DriverEvent::decode(buf))),
217            None => std::task::Poll::Ready(None),
218        }
219    }
220}
221
222#[derive(Debug)]
223pub enum DriverEvent {}
224
225impl DriverEvent {
226    /// Decodes a message buffer as a [`DriverEvent`].
227    fn decode(
228        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
229    ) -> Result<DriverEvent, fidl::Error> {
230        let (bytes, _handles) = buf.split_mut();
231        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
232        debug_assert_eq!(tx_header.tx_id, 0);
233        match tx_header.ordinal {
234            _ => Err(fidl::Error::UnknownOrdinal {
235                ordinal: tx_header.ordinal,
236                protocol_name: <DriverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
237            }),
238        }
239    }
240}
241
242/// A Stream of incoming requests for fuchsia.lowpan.driver/Driver.
243pub struct DriverRequestStream {
244    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
245    is_terminated: bool,
246}
247
248impl std::marker::Unpin for DriverRequestStream {}
249
250impl futures::stream::FusedStream for DriverRequestStream {
251    fn is_terminated(&self) -> bool {
252        self.is_terminated
253    }
254}
255
256impl fidl::endpoints::RequestStream for DriverRequestStream {
257    type Protocol = DriverMarker;
258    type ControlHandle = DriverControlHandle;
259
260    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
261        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
262    }
263
264    fn control_handle(&self) -> Self::ControlHandle {
265        DriverControlHandle { inner: self.inner.clone() }
266    }
267
268    fn into_inner(
269        self,
270    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
271    {
272        (self.inner, self.is_terminated)
273    }
274
275    fn from_inner(
276        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
277        is_terminated: bool,
278    ) -> Self {
279        Self { inner, is_terminated }
280    }
281}
282
283impl futures::Stream for DriverRequestStream {
284    type Item = Result<DriverRequest, fidl::Error>;
285
286    fn poll_next(
287        mut self: std::pin::Pin<&mut Self>,
288        cx: &mut std::task::Context<'_>,
289    ) -> std::task::Poll<Option<Self::Item>> {
290        let this = &mut *self;
291        if this.inner.check_shutdown(cx) {
292            this.is_terminated = true;
293            return std::task::Poll::Ready(None);
294        }
295        if this.is_terminated {
296            panic!("polled DriverRequestStream after completion");
297        }
298        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
299            |bytes, handles| {
300                match this.inner.channel().read_etc(cx, bytes, handles) {
301                    std::task::Poll::Ready(Ok(())) => {}
302                    std::task::Poll::Pending => return std::task::Poll::Pending,
303                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
304                        this.is_terminated = true;
305                        return std::task::Poll::Ready(None);
306                    }
307                    std::task::Poll::Ready(Err(e)) => {
308                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
309                            e.into(),
310                        ))))
311                    }
312                }
313
314                // A message has been received from the channel
315                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
316
317                std::task::Poll::Ready(Some(match header.ordinal {
318                    0x165f5b09fcc7bc85 => {
319                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
320                        let mut req = fidl::new_empty!(
321                            DriverGetProtocolsRequest,
322                            fidl::encoding::DefaultFuchsiaResourceDialect
323                        );
324                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<DriverGetProtocolsRequest>(&header, _body_bytes, handles, &mut req)?;
325                        let control_handle = DriverControlHandle { inner: this.inner.clone() };
326                        Ok(DriverRequest::GetProtocols { protocols: req.protocols, control_handle })
327                    }
328                    _ => Err(fidl::Error::UnknownOrdinal {
329                        ordinal: header.ordinal,
330                        protocol_name:
331                            <DriverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
332                    }),
333                }))
334            },
335        )
336    }
337}
338
339/// Protocol representing a LoWPAN driver instance.
340#[derive(Debug)]
341pub enum DriverRequest {
342    /// Request protocols to control this device.
343    /// Unsupported protocols are closed.
344    GetProtocols { protocols: Protocols, control_handle: DriverControlHandle },
345}
346
347impl DriverRequest {
348    #[allow(irrefutable_let_patterns)]
349    pub fn into_get_protocols(self) -> Option<(Protocols, DriverControlHandle)> {
350        if let DriverRequest::GetProtocols { protocols, control_handle } = self {
351            Some((protocols, control_handle))
352        } else {
353            None
354        }
355    }
356
357    /// Name of the method defined in FIDL
358    pub fn method_name(&self) -> &'static str {
359        match *self {
360            DriverRequest::GetProtocols { .. } => "get_protocols",
361        }
362    }
363}
364
365#[derive(Debug, Clone)]
366pub struct DriverControlHandle {
367    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
368}
369
370impl fidl::endpoints::ControlHandle for DriverControlHandle {
371    fn shutdown(&self) {
372        self.inner.shutdown()
373    }
374    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
375        self.inner.shutdown_with_epitaph(status)
376    }
377
378    fn is_closed(&self) -> bool {
379        self.inner.channel().is_closed()
380    }
381    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
382        self.inner.channel().on_closed()
383    }
384
385    #[cfg(target_os = "fuchsia")]
386    fn signal_peer(
387        &self,
388        clear_mask: zx::Signals,
389        set_mask: zx::Signals,
390    ) -> Result<(), zx_status::Status> {
391        use fidl::Peered;
392        self.inner.channel().signal_peer(clear_mask, set_mask)
393    }
394}
395
396impl DriverControlHandle {}
397
398#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
399pub struct RegisterMarker;
400
401impl fidl::endpoints::ProtocolMarker for RegisterMarker {
402    type Proxy = RegisterProxy;
403    type RequestStream = RegisterRequestStream;
404    #[cfg(target_os = "fuchsia")]
405    type SynchronousProxy = RegisterSynchronousProxy;
406
407    const DEBUG_NAME: &'static str = "fuchsia.lowpan.driver.Register";
408}
409impl fidl::endpoints::DiscoverableProtocolMarker for RegisterMarker {}
410
411pub trait RegisterProxyInterface: Send + Sync {
412    fn r#register_device(
413        &self,
414        name: &str,
415        driver: fidl::endpoints::ClientEnd<DriverMarker>,
416    ) -> Result<(), fidl::Error>;
417}
418#[derive(Debug)]
419#[cfg(target_os = "fuchsia")]
420pub struct RegisterSynchronousProxy {
421    client: fidl::client::sync::Client,
422}
423
424#[cfg(target_os = "fuchsia")]
425impl fidl::endpoints::SynchronousProxy for RegisterSynchronousProxy {
426    type Proxy = RegisterProxy;
427    type Protocol = RegisterMarker;
428
429    fn from_channel(inner: fidl::Channel) -> Self {
430        Self::new(inner)
431    }
432
433    fn into_channel(self) -> fidl::Channel {
434        self.client.into_channel()
435    }
436
437    fn as_channel(&self) -> &fidl::Channel {
438        self.client.as_channel()
439    }
440}
441
442#[cfg(target_os = "fuchsia")]
443impl RegisterSynchronousProxy {
444    pub fn new(channel: fidl::Channel) -> Self {
445        let protocol_name = <RegisterMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
446        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
447    }
448
449    pub fn into_channel(self) -> fidl::Channel {
450        self.client.into_channel()
451    }
452
453    /// Waits until an event arrives and returns it. It is safe for other
454    /// threads to make concurrent requests while waiting for an event.
455    pub fn wait_for_event(
456        &self,
457        deadline: zx::MonotonicInstant,
458    ) -> Result<RegisterEvent, fidl::Error> {
459        RegisterEvent::decode(self.client.wait_for_event(deadline)?)
460    }
461
462    /// Registers the given LoWPAN device with the LoWPAN Service
463    /// using the given interface name.
464    pub fn r#register_device(
465        &self,
466        mut name: &str,
467        mut driver: fidl::endpoints::ClientEnd<DriverMarker>,
468    ) -> Result<(), fidl::Error> {
469        self.client.send::<RegisterRegisterDeviceRequest>(
470            (name, driver),
471            0x19280d20cfdd62e6,
472            fidl::encoding::DynamicFlags::empty(),
473        )
474    }
475}
476
477#[derive(Debug, Clone)]
478pub struct RegisterProxy {
479    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
480}
481
482impl fidl::endpoints::Proxy for RegisterProxy {
483    type Protocol = RegisterMarker;
484
485    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
486        Self::new(inner)
487    }
488
489    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
490        self.client.into_channel().map_err(|client| Self { client })
491    }
492
493    fn as_channel(&self) -> &::fidl::AsyncChannel {
494        self.client.as_channel()
495    }
496}
497
498impl RegisterProxy {
499    /// Create a new Proxy for fuchsia.lowpan.driver/Register.
500    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
501        let protocol_name = <RegisterMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
502        Self { client: fidl::client::Client::new(channel, protocol_name) }
503    }
504
505    /// Get a Stream of events from the remote end of the protocol.
506    ///
507    /// # Panics
508    ///
509    /// Panics if the event stream was already taken.
510    pub fn take_event_stream(&self) -> RegisterEventStream {
511        RegisterEventStream { event_receiver: self.client.take_event_receiver() }
512    }
513
514    /// Registers the given LoWPAN device with the LoWPAN Service
515    /// using the given interface name.
516    pub fn r#register_device(
517        &self,
518        mut name: &str,
519        mut driver: fidl::endpoints::ClientEnd<DriverMarker>,
520    ) -> Result<(), fidl::Error> {
521        RegisterProxyInterface::r#register_device(self, name, driver)
522    }
523}
524
525impl RegisterProxyInterface for RegisterProxy {
526    fn r#register_device(
527        &self,
528        mut name: &str,
529        mut driver: fidl::endpoints::ClientEnd<DriverMarker>,
530    ) -> Result<(), fidl::Error> {
531        self.client.send::<RegisterRegisterDeviceRequest>(
532            (name, driver),
533            0x19280d20cfdd62e6,
534            fidl::encoding::DynamicFlags::empty(),
535        )
536    }
537}
538
539pub struct RegisterEventStream {
540    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
541}
542
543impl std::marker::Unpin for RegisterEventStream {}
544
545impl futures::stream::FusedStream for RegisterEventStream {
546    fn is_terminated(&self) -> bool {
547        self.event_receiver.is_terminated()
548    }
549}
550
551impl futures::Stream for RegisterEventStream {
552    type Item = Result<RegisterEvent, fidl::Error>;
553
554    fn poll_next(
555        mut self: std::pin::Pin<&mut Self>,
556        cx: &mut std::task::Context<'_>,
557    ) -> std::task::Poll<Option<Self::Item>> {
558        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
559            &mut self.event_receiver,
560            cx
561        )?) {
562            Some(buf) => std::task::Poll::Ready(Some(RegisterEvent::decode(buf))),
563            None => std::task::Poll::Ready(None),
564        }
565    }
566}
567
568#[derive(Debug)]
569pub enum RegisterEvent {}
570
571impl RegisterEvent {
572    /// Decodes a message buffer as a [`RegisterEvent`].
573    fn decode(
574        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
575    ) -> Result<RegisterEvent, fidl::Error> {
576        let (bytes, _handles) = buf.split_mut();
577        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
578        debug_assert_eq!(tx_header.tx_id, 0);
579        match tx_header.ordinal {
580            _ => Err(fidl::Error::UnknownOrdinal {
581                ordinal: tx_header.ordinal,
582                protocol_name: <RegisterMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
583            }),
584        }
585    }
586}
587
588/// A Stream of incoming requests for fuchsia.lowpan.driver/Register.
589pub struct RegisterRequestStream {
590    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
591    is_terminated: bool,
592}
593
594impl std::marker::Unpin for RegisterRequestStream {}
595
596impl futures::stream::FusedStream for RegisterRequestStream {
597    fn is_terminated(&self) -> bool {
598        self.is_terminated
599    }
600}
601
602impl fidl::endpoints::RequestStream for RegisterRequestStream {
603    type Protocol = RegisterMarker;
604    type ControlHandle = RegisterControlHandle;
605
606    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
607        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
608    }
609
610    fn control_handle(&self) -> Self::ControlHandle {
611        RegisterControlHandle { inner: self.inner.clone() }
612    }
613
614    fn into_inner(
615        self,
616    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
617    {
618        (self.inner, self.is_terminated)
619    }
620
621    fn from_inner(
622        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
623        is_terminated: bool,
624    ) -> Self {
625        Self { inner, is_terminated }
626    }
627}
628
629impl futures::Stream for RegisterRequestStream {
630    type Item = Result<RegisterRequest, fidl::Error>;
631
632    fn poll_next(
633        mut self: std::pin::Pin<&mut Self>,
634        cx: &mut std::task::Context<'_>,
635    ) -> std::task::Poll<Option<Self::Item>> {
636        let this = &mut *self;
637        if this.inner.check_shutdown(cx) {
638            this.is_terminated = true;
639            return std::task::Poll::Ready(None);
640        }
641        if this.is_terminated {
642            panic!("polled RegisterRequestStream after completion");
643        }
644        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
645            |bytes, handles| {
646                match this.inner.channel().read_etc(cx, bytes, handles) {
647                    std::task::Poll::Ready(Ok(())) => {}
648                    std::task::Poll::Pending => return std::task::Poll::Pending,
649                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
650                        this.is_terminated = true;
651                        return std::task::Poll::Ready(None);
652                    }
653                    std::task::Poll::Ready(Err(e)) => {
654                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
655                            e.into(),
656                        ))))
657                    }
658                }
659
660                // A message has been received from the channel
661                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
662
663                std::task::Poll::Ready(Some(match header.ordinal {
664                    0x19280d20cfdd62e6 => {
665                        header.validate_request_tx_id(fidl::MethodType::OneWay)?;
666                        let mut req = fidl::new_empty!(
667                            RegisterRegisterDeviceRequest,
668                            fidl::encoding::DefaultFuchsiaResourceDialect
669                        );
670                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<RegisterRegisterDeviceRequest>(&header, _body_bytes, handles, &mut req)?;
671                        let control_handle = RegisterControlHandle { inner: this.inner.clone() };
672                        Ok(RegisterRequest::RegisterDevice {
673                            name: req.name,
674                            driver: req.driver,
675
676                            control_handle,
677                        })
678                    }
679                    _ => Err(fidl::Error::UnknownOrdinal {
680                        ordinal: header.ordinal,
681                        protocol_name:
682                            <RegisterMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
683                    }),
684                }))
685            },
686        )
687    }
688}
689
690/// Protocol for registering LoWPAN interfaces and their
691/// associated control protocols with the LoWPAN service.
692#[derive(Debug)]
693pub enum RegisterRequest {
694    /// Registers the given LoWPAN device with the LoWPAN Service
695    /// using the given interface name.
696    RegisterDevice {
697        name: String,
698        driver: fidl::endpoints::ClientEnd<DriverMarker>,
699        control_handle: RegisterControlHandle,
700    },
701}
702
703impl RegisterRequest {
704    #[allow(irrefutable_let_patterns)]
705    pub fn into_register_device(
706        self,
707    ) -> Option<(String, fidl::endpoints::ClientEnd<DriverMarker>, RegisterControlHandle)> {
708        if let RegisterRequest::RegisterDevice { name, driver, control_handle } = self {
709            Some((name, driver, control_handle))
710        } else {
711            None
712        }
713    }
714
715    /// Name of the method defined in FIDL
716    pub fn method_name(&self) -> &'static str {
717        match *self {
718            RegisterRequest::RegisterDevice { .. } => "register_device",
719        }
720    }
721}
722
723#[derive(Debug, Clone)]
724pub struct RegisterControlHandle {
725    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
726}
727
728impl fidl::endpoints::ControlHandle for RegisterControlHandle {
729    fn shutdown(&self) {
730        self.inner.shutdown()
731    }
732    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
733        self.inner.shutdown_with_epitaph(status)
734    }
735
736    fn is_closed(&self) -> bool {
737        self.inner.channel().is_closed()
738    }
739    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
740        self.inner.channel().on_closed()
741    }
742
743    #[cfg(target_os = "fuchsia")]
744    fn signal_peer(
745        &self,
746        clear_mask: zx::Signals,
747        set_mask: zx::Signals,
748    ) -> Result<(), zx_status::Status> {
749        use fidl::Peered;
750        self.inner.channel().signal_peer(clear_mask, set_mask)
751    }
752}
753
754impl RegisterControlHandle {}
755
756mod internal {
757    use super::*;
758
759    impl fidl::encoding::ResourceTypeMarker for DriverGetProtocolsRequest {
760        type Borrowed<'a> = &'a mut Self;
761        fn take_or_borrow<'a>(
762            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
763        ) -> Self::Borrowed<'a> {
764            value
765        }
766    }
767
768    unsafe impl fidl::encoding::TypeMarker for DriverGetProtocolsRequest {
769        type Owned = Self;
770
771        #[inline(always)]
772        fn inline_align(_context: fidl::encoding::Context) -> usize {
773            8
774        }
775
776        #[inline(always)]
777        fn inline_size(_context: fidl::encoding::Context) -> usize {
778            16
779        }
780    }
781
782    unsafe impl
783        fidl::encoding::Encode<
784            DriverGetProtocolsRequest,
785            fidl::encoding::DefaultFuchsiaResourceDialect,
786        > for &mut DriverGetProtocolsRequest
787    {
788        #[inline]
789        unsafe fn encode(
790            self,
791            encoder: &mut fidl::encoding::Encoder<
792                '_,
793                fidl::encoding::DefaultFuchsiaResourceDialect,
794            >,
795            offset: usize,
796            _depth: fidl::encoding::Depth,
797        ) -> fidl::Result<()> {
798            encoder.debug_check_bounds::<DriverGetProtocolsRequest>(offset);
799            // Delegate to tuple encoding.
800            fidl::encoding::Encode::<
801                DriverGetProtocolsRequest,
802                fidl::encoding::DefaultFuchsiaResourceDialect,
803            >::encode(
804                (<Protocols as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
805                    &mut self.protocols,
806                ),),
807                encoder,
808                offset,
809                _depth,
810            )
811        }
812    }
813    unsafe impl<T0: fidl::encoding::Encode<Protocols, fidl::encoding::DefaultFuchsiaResourceDialect>>
814        fidl::encoding::Encode<
815            DriverGetProtocolsRequest,
816            fidl::encoding::DefaultFuchsiaResourceDialect,
817        > for (T0,)
818    {
819        #[inline]
820        unsafe fn encode(
821            self,
822            encoder: &mut fidl::encoding::Encoder<
823                '_,
824                fidl::encoding::DefaultFuchsiaResourceDialect,
825            >,
826            offset: usize,
827            depth: fidl::encoding::Depth,
828        ) -> fidl::Result<()> {
829            encoder.debug_check_bounds::<DriverGetProtocolsRequest>(offset);
830            // Zero out padding regions. There's no need to apply masks
831            // because the unmasked parts will be overwritten by fields.
832            // Write the fields.
833            self.0.encode(encoder, offset + 0, depth)?;
834            Ok(())
835        }
836    }
837
838    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
839        for DriverGetProtocolsRequest
840    {
841        #[inline(always)]
842        fn new_empty() -> Self {
843            Self {
844                protocols: fidl::new_empty!(
845                    Protocols,
846                    fidl::encoding::DefaultFuchsiaResourceDialect
847                ),
848            }
849        }
850
851        #[inline]
852        unsafe fn decode(
853            &mut self,
854            decoder: &mut fidl::encoding::Decoder<
855                '_,
856                fidl::encoding::DefaultFuchsiaResourceDialect,
857            >,
858            offset: usize,
859            _depth: fidl::encoding::Depth,
860        ) -> fidl::Result<()> {
861            decoder.debug_check_bounds::<Self>(offset);
862            // Verify that padding bytes are zero.
863            fidl::decode!(
864                Protocols,
865                fidl::encoding::DefaultFuchsiaResourceDialect,
866                &mut self.protocols,
867                decoder,
868                offset + 0,
869                _depth
870            )?;
871            Ok(())
872        }
873    }
874
875    impl fidl::encoding::ResourceTypeMarker for RegisterRegisterDeviceRequest {
876        type Borrowed<'a> = &'a mut Self;
877        fn take_or_borrow<'a>(
878            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
879        ) -> Self::Borrowed<'a> {
880            value
881        }
882    }
883
884    unsafe impl fidl::encoding::TypeMarker for RegisterRegisterDeviceRequest {
885        type Owned = Self;
886
887        #[inline(always)]
888        fn inline_align(_context: fidl::encoding::Context) -> usize {
889            8
890        }
891
892        #[inline(always)]
893        fn inline_size(_context: fidl::encoding::Context) -> usize {
894            24
895        }
896    }
897
898    unsafe impl
899        fidl::encoding::Encode<
900            RegisterRegisterDeviceRequest,
901            fidl::encoding::DefaultFuchsiaResourceDialect,
902        > for &mut RegisterRegisterDeviceRequest
903    {
904        #[inline]
905        unsafe fn encode(
906            self,
907            encoder: &mut fidl::encoding::Encoder<
908                '_,
909                fidl::encoding::DefaultFuchsiaResourceDialect,
910            >,
911            offset: usize,
912            _depth: fidl::encoding::Depth,
913        ) -> fidl::Result<()> {
914            encoder.debug_check_bounds::<RegisterRegisterDeviceRequest>(offset);
915            // Delegate to tuple encoding.
916            fidl::encoding::Encode::<RegisterRegisterDeviceRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
917                (
918                    <fidl::encoding::BoundedString<32> as fidl::encoding::ValueTypeMarker>::borrow(&self.name),
919                    <fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<DriverMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.driver),
920                ),
921                encoder, offset, _depth
922            )
923        }
924    }
925    unsafe impl<
926            T0: fidl::encoding::Encode<
927                fidl::encoding::BoundedString<32>,
928                fidl::encoding::DefaultFuchsiaResourceDialect,
929            >,
930            T1: fidl::encoding::Encode<
931                fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<DriverMarker>>,
932                fidl::encoding::DefaultFuchsiaResourceDialect,
933            >,
934        >
935        fidl::encoding::Encode<
936            RegisterRegisterDeviceRequest,
937            fidl::encoding::DefaultFuchsiaResourceDialect,
938        > for (T0, T1)
939    {
940        #[inline]
941        unsafe fn encode(
942            self,
943            encoder: &mut fidl::encoding::Encoder<
944                '_,
945                fidl::encoding::DefaultFuchsiaResourceDialect,
946            >,
947            offset: usize,
948            depth: fidl::encoding::Depth,
949        ) -> fidl::Result<()> {
950            encoder.debug_check_bounds::<RegisterRegisterDeviceRequest>(offset);
951            // Zero out padding regions. There's no need to apply masks
952            // because the unmasked parts will be overwritten by fields.
953            unsafe {
954                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
955                (ptr as *mut u64).write_unaligned(0);
956            }
957            // Write the fields.
958            self.0.encode(encoder, offset + 0, depth)?;
959            self.1.encode(encoder, offset + 16, depth)?;
960            Ok(())
961        }
962    }
963
964    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
965        for RegisterRegisterDeviceRequest
966    {
967        #[inline(always)]
968        fn new_empty() -> Self {
969            Self {
970                name: fidl::new_empty!(
971                    fidl::encoding::BoundedString<32>,
972                    fidl::encoding::DefaultFuchsiaResourceDialect
973                ),
974                driver: fidl::new_empty!(
975                    fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<DriverMarker>>,
976                    fidl::encoding::DefaultFuchsiaResourceDialect
977                ),
978            }
979        }
980
981        #[inline]
982        unsafe fn decode(
983            &mut self,
984            decoder: &mut fidl::encoding::Decoder<
985                '_,
986                fidl::encoding::DefaultFuchsiaResourceDialect,
987            >,
988            offset: usize,
989            _depth: fidl::encoding::Depth,
990        ) -> fidl::Result<()> {
991            decoder.debug_check_bounds::<Self>(offset);
992            // Verify that padding bytes are zero.
993            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
994            let padval = unsafe { (ptr as *const u64).read_unaligned() };
995            let mask = 0xffffffff00000000u64;
996            let maskedval = padval & mask;
997            if maskedval != 0 {
998                return Err(fidl::Error::NonZeroPadding {
999                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
1000                });
1001            }
1002            fidl::decode!(
1003                fidl::encoding::BoundedString<32>,
1004                fidl::encoding::DefaultFuchsiaResourceDialect,
1005                &mut self.name,
1006                decoder,
1007                offset + 0,
1008                _depth
1009            )?;
1010            fidl::decode!(
1011                fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<DriverMarker>>,
1012                fidl::encoding::DefaultFuchsiaResourceDialect,
1013                &mut self.driver,
1014                decoder,
1015                offset + 16,
1016                _depth
1017            )?;
1018            Ok(())
1019        }
1020    }
1021
1022    impl Protocols {
1023        #[inline(always)]
1024        fn max_ordinal_present(&self) -> u64 {
1025            if let Some(_) = self.capabilities {
1026                return 15;
1027            }
1028            if let Some(_) = self.thread_feature {
1029                return 14;
1030            }
1031            if let Some(_) = self.telemetry_provider {
1032                return 13;
1033            }
1034            if let Some(_) = self.meshcop {
1035                return 12;
1036            }
1037            if let Some(_) = self.experimental_device_extra {
1038                return 11;
1039            }
1040            if let Some(_) = self.experimental_device {
1041                return 10;
1042            }
1043            if let Some(_) = self.energy_scan {
1044                return 9;
1045            }
1046            if let Some(_) = self.thread_dataset {
1047                return 8;
1048            }
1049            if let Some(_) = self.thread_legacy_joining {
1050                return 7;
1051            }
1052            if let Some(_) = self.counters {
1053                return 6;
1054            }
1055            if let Some(_) = self.device_route_extra {
1056                return 5;
1057            }
1058            if let Some(_) = self.device_route {
1059                return 4;
1060            }
1061            if let Some(_) = self.device_test {
1062                return 3;
1063            }
1064            if let Some(_) = self.device_extra {
1065                return 2;
1066            }
1067            if let Some(_) = self.device {
1068                return 1;
1069            }
1070            0
1071        }
1072    }
1073
1074    impl fidl::encoding::ResourceTypeMarker for Protocols {
1075        type Borrowed<'a> = &'a mut Self;
1076        fn take_or_borrow<'a>(
1077            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1078        ) -> Self::Borrowed<'a> {
1079            value
1080        }
1081    }
1082
1083    unsafe impl fidl::encoding::TypeMarker for Protocols {
1084        type Owned = Self;
1085
1086        #[inline(always)]
1087        fn inline_align(_context: fidl::encoding::Context) -> usize {
1088            8
1089        }
1090
1091        #[inline(always)]
1092        fn inline_size(_context: fidl::encoding::Context) -> usize {
1093            16
1094        }
1095    }
1096
1097    unsafe impl fidl::encoding::Encode<Protocols, fidl::encoding::DefaultFuchsiaResourceDialect>
1098        for &mut Protocols
1099    {
1100        unsafe fn encode(
1101            self,
1102            encoder: &mut fidl::encoding::Encoder<
1103                '_,
1104                fidl::encoding::DefaultFuchsiaResourceDialect,
1105            >,
1106            offset: usize,
1107            mut depth: fidl::encoding::Depth,
1108        ) -> fidl::Result<()> {
1109            encoder.debug_check_bounds::<Protocols>(offset);
1110            // Vector header
1111            let max_ordinal: u64 = self.max_ordinal_present();
1112            encoder.write_num(max_ordinal, offset);
1113            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1114            // Calling encoder.out_of_line_offset(0) is not allowed.
1115            if max_ordinal == 0 {
1116                return Ok(());
1117            }
1118            depth.increment()?;
1119            let envelope_size = 8;
1120            let bytes_len = max_ordinal as usize * envelope_size;
1121            #[allow(unused_variables)]
1122            let offset = encoder.out_of_line_offset(bytes_len);
1123            let mut _prev_end_offset: usize = 0;
1124            if 1 > max_ordinal {
1125                return Ok(());
1126            }
1127
1128            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1129            // are envelope_size bytes.
1130            let cur_offset: usize = (1 - 1) * envelope_size;
1131
1132            // Zero reserved fields.
1133            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1134
1135            // Safety:
1136            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1137            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1138            //   envelope_size bytes, there is always sufficient room.
1139            fidl::encoding::encode_in_envelope_optional::<
1140                fidl::encoding::Endpoint<
1141                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1142                >,
1143                fidl::encoding::DefaultFuchsiaResourceDialect,
1144            >(
1145                self.device.as_mut().map(
1146                    <fidl::encoding::Endpoint<
1147                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1148                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1149                ),
1150                encoder,
1151                offset + cur_offset,
1152                depth,
1153            )?;
1154
1155            _prev_end_offset = cur_offset + envelope_size;
1156            if 2 > max_ordinal {
1157                return Ok(());
1158            }
1159
1160            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1161            // are envelope_size bytes.
1162            let cur_offset: usize = (2 - 1) * envelope_size;
1163
1164            // Zero reserved fields.
1165            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1166
1167            // Safety:
1168            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1169            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1170            //   envelope_size bytes, there is always sufficient room.
1171            fidl::encoding::encode_in_envelope_optional::<
1172                fidl::encoding::Endpoint<
1173                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>,
1174                >,
1175                fidl::encoding::DefaultFuchsiaResourceDialect,
1176            >(
1177                self.device_extra.as_mut().map(
1178                    <fidl::encoding::Endpoint<
1179                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>,
1180                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1181                ),
1182                encoder,
1183                offset + cur_offset,
1184                depth,
1185            )?;
1186
1187            _prev_end_offset = cur_offset + envelope_size;
1188            if 3 > max_ordinal {
1189                return Ok(());
1190            }
1191
1192            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1193            // are envelope_size bytes.
1194            let cur_offset: usize = (3 - 1) * envelope_size;
1195
1196            // Zero reserved fields.
1197            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1198
1199            // Safety:
1200            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1201            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1202            //   envelope_size bytes, there is always sufficient room.
1203            fidl::encoding::encode_in_envelope_optional::<
1204                fidl::encoding::Endpoint<
1205                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1206                >,
1207                fidl::encoding::DefaultFuchsiaResourceDialect,
1208            >(
1209                self.device_test.as_mut().map(
1210                    <fidl::encoding::Endpoint<
1211                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1212                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1213                ),
1214                encoder,
1215                offset + cur_offset,
1216                depth,
1217            )?;
1218
1219            _prev_end_offset = cur_offset + envelope_size;
1220            if 4 > max_ordinal {
1221                return Ok(());
1222            }
1223
1224            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1225            // are envelope_size bytes.
1226            let cur_offset: usize = (4 - 1) * envelope_size;
1227
1228            // Zero reserved fields.
1229            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1230
1231            // Safety:
1232            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1233            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1234            //   envelope_size bytes, there is always sufficient room.
1235            fidl::encoding::encode_in_envelope_optional::<
1236                fidl::encoding::Endpoint<
1237                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceRouteMarker>,
1238                >,
1239                fidl::encoding::DefaultFuchsiaResourceDialect,
1240            >(
1241                self.device_route.as_mut().map(
1242                    <fidl::encoding::Endpoint<
1243                        fidl::endpoints::ServerEnd<
1244                            fidl_fuchsia_lowpan_experimental::DeviceRouteMarker,
1245                        >,
1246                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1247                ),
1248                encoder,
1249                offset + cur_offset,
1250                depth,
1251            )?;
1252
1253            _prev_end_offset = cur_offset + envelope_size;
1254            if 5 > max_ordinal {
1255                return Ok(());
1256            }
1257
1258            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1259            // are envelope_size bytes.
1260            let cur_offset: usize = (5 - 1) * envelope_size;
1261
1262            // Zero reserved fields.
1263            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1264
1265            // Safety:
1266            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1267            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1268            //   envelope_size bytes, there is always sufficient room.
1269            fidl::encoding::encode_in_envelope_optional::<
1270                fidl::encoding::Endpoint<
1271                    fidl::endpoints::ServerEnd<
1272                        fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
1273                    >,
1274                >,
1275                fidl::encoding::DefaultFuchsiaResourceDialect,
1276            >(
1277                self.device_route_extra.as_mut().map(
1278                    <fidl::encoding::Endpoint<
1279                        fidl::endpoints::ServerEnd<
1280                            fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
1281                        >,
1282                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1283                ),
1284                encoder,
1285                offset + cur_offset,
1286                depth,
1287            )?;
1288
1289            _prev_end_offset = cur_offset + envelope_size;
1290            if 6 > max_ordinal {
1291                return Ok(());
1292            }
1293
1294            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1295            // are envelope_size bytes.
1296            let cur_offset: usize = (6 - 1) * envelope_size;
1297
1298            // Zero reserved fields.
1299            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1300
1301            // Safety:
1302            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1303            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1304            //   envelope_size bytes, there is always sufficient room.
1305            fidl::encoding::encode_in_envelope_optional::<
1306                fidl::encoding::Endpoint<
1307                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
1308                >,
1309                fidl::encoding::DefaultFuchsiaResourceDialect,
1310            >(
1311                self.counters.as_mut().map(
1312                    <fidl::encoding::Endpoint<
1313                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
1314                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1315                ),
1316                encoder,
1317                offset + cur_offset,
1318                depth,
1319            )?;
1320
1321            _prev_end_offset = cur_offset + envelope_size;
1322            if 7 > max_ordinal {
1323                return Ok(());
1324            }
1325
1326            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1327            // are envelope_size bytes.
1328            let cur_offset: usize = (7 - 1) * envelope_size;
1329
1330            // Zero reserved fields.
1331            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1332
1333            // Safety:
1334            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1335            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1336            //   envelope_size bytes, there is always sufficient room.
1337            fidl::encoding::encode_in_envelope_optional::<
1338                fidl::encoding::Endpoint<
1339                    fidl::endpoints::ServerEnd<
1340                        fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
1341                    >,
1342                >,
1343                fidl::encoding::DefaultFuchsiaResourceDialect,
1344            >(
1345                self.thread_legacy_joining.as_mut().map(
1346                    <fidl::encoding::Endpoint<
1347                        fidl::endpoints::ServerEnd<
1348                            fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
1349                        >,
1350                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1351                ),
1352                encoder,
1353                offset + cur_offset,
1354                depth,
1355            )?;
1356
1357            _prev_end_offset = cur_offset + envelope_size;
1358            if 8 > max_ordinal {
1359                return Ok(());
1360            }
1361
1362            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1363            // are envelope_size bytes.
1364            let cur_offset: usize = (8 - 1) * envelope_size;
1365
1366            // Zero reserved fields.
1367            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1368
1369            // Safety:
1370            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1371            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1372            //   envelope_size bytes, there is always sufficient room.
1373            fidl::encoding::encode_in_envelope_optional::<
1374                fidl::encoding::Endpoint<
1375                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
1376                >,
1377                fidl::encoding::DefaultFuchsiaResourceDialect,
1378            >(
1379                self.thread_dataset.as_mut().map(
1380                    <fidl::encoding::Endpoint<
1381                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
1382                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1383                ),
1384                encoder,
1385                offset + cur_offset,
1386                depth,
1387            )?;
1388
1389            _prev_end_offset = cur_offset + envelope_size;
1390            if 9 > max_ordinal {
1391                return Ok(());
1392            }
1393
1394            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1395            // are envelope_size bytes.
1396            let cur_offset: usize = (9 - 1) * envelope_size;
1397
1398            // Zero reserved fields.
1399            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1400
1401            // Safety:
1402            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1403            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1404            //   envelope_size bytes, there is always sufficient room.
1405            fidl::encoding::encode_in_envelope_optional::<
1406                fidl::encoding::Endpoint<
1407                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>,
1408                >,
1409                fidl::encoding::DefaultFuchsiaResourceDialect,
1410            >(
1411                self.energy_scan.as_mut().map(
1412                    <fidl::encoding::Endpoint<
1413                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>,
1414                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1415                ),
1416                encoder,
1417                offset + cur_offset,
1418                depth,
1419            )?;
1420
1421            _prev_end_offset = cur_offset + envelope_size;
1422            if 10 > max_ordinal {
1423                return Ok(());
1424            }
1425
1426            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1427            // are envelope_size bytes.
1428            let cur_offset: usize = (10 - 1) * envelope_size;
1429
1430            // Zero reserved fields.
1431            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1432
1433            // Safety:
1434            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1435            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1436            //   envelope_size bytes, there is always sufficient room.
1437            fidl::encoding::encode_in_envelope_optional::<
1438                fidl::encoding::Endpoint<
1439                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>,
1440                >,
1441                fidl::encoding::DefaultFuchsiaResourceDialect,
1442            >(
1443                self.experimental_device.as_mut().map(
1444                    <fidl::encoding::Endpoint<
1445                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>,
1446                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1447                ),
1448                encoder,
1449                offset + cur_offset,
1450                depth,
1451            )?;
1452
1453            _prev_end_offset = cur_offset + envelope_size;
1454            if 11 > max_ordinal {
1455                return Ok(());
1456            }
1457
1458            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1459            // are envelope_size bytes.
1460            let cur_offset: usize = (11 - 1) * envelope_size;
1461
1462            // Zero reserved fields.
1463            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1464
1465            // Safety:
1466            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1467            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1468            //   envelope_size bytes, there is always sufficient room.
1469            fidl::encoding::encode_in_envelope_optional::<
1470                fidl::encoding::Endpoint<
1471                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceExtraMarker>,
1472                >,
1473                fidl::encoding::DefaultFuchsiaResourceDialect,
1474            >(
1475                self.experimental_device_extra.as_mut().map(
1476                    <fidl::encoding::Endpoint<
1477                        fidl::endpoints::ServerEnd<
1478                            fidl_fuchsia_lowpan_experimental::DeviceExtraMarker,
1479                        >,
1480                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1481                ),
1482                encoder,
1483                offset + cur_offset,
1484                depth,
1485            )?;
1486
1487            _prev_end_offset = cur_offset + envelope_size;
1488            if 12 > max_ordinal {
1489                return Ok(());
1490            }
1491
1492            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1493            // are envelope_size bytes.
1494            let cur_offset: usize = (12 - 1) * envelope_size;
1495
1496            // Zero reserved fields.
1497            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1498
1499            // Safety:
1500            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1501            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1502            //   envelope_size bytes, there is always sufficient room.
1503            fidl::encoding::encode_in_envelope_optional::<
1504                fidl::encoding::Endpoint<
1505                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
1506                >,
1507                fidl::encoding::DefaultFuchsiaResourceDialect,
1508            >(
1509                self.meshcop.as_mut().map(
1510                    <fidl::encoding::Endpoint<
1511                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
1512                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1513                ),
1514                encoder,
1515                offset + cur_offset,
1516                depth,
1517            )?;
1518
1519            _prev_end_offset = cur_offset + envelope_size;
1520            if 13 > max_ordinal {
1521                return Ok(());
1522            }
1523
1524            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1525            // are envelope_size bytes.
1526            let cur_offset: usize = (13 - 1) * envelope_size;
1527
1528            // Zero reserved fields.
1529            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1530
1531            // Safety:
1532            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1533            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1534            //   envelope_size bytes, there is always sufficient room.
1535            fidl::encoding::encode_in_envelope_optional::<
1536                fidl::encoding::Endpoint<
1537                    fidl::endpoints::ServerEnd<
1538                        fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
1539                    >,
1540                >,
1541                fidl::encoding::DefaultFuchsiaResourceDialect,
1542            >(
1543                self.telemetry_provider.as_mut().map(
1544                    <fidl::encoding::Endpoint<
1545                        fidl::endpoints::ServerEnd<
1546                            fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
1547                        >,
1548                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1549                ),
1550                encoder,
1551                offset + cur_offset,
1552                depth,
1553            )?;
1554
1555            _prev_end_offset = cur_offset + envelope_size;
1556            if 14 > max_ordinal {
1557                return Ok(());
1558            }
1559
1560            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1561            // are envelope_size bytes.
1562            let cur_offset: usize = (14 - 1) * envelope_size;
1563
1564            // Zero reserved fields.
1565            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1566
1567            // Safety:
1568            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1569            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1570            //   envelope_size bytes, there is always sufficient room.
1571            fidl::encoding::encode_in_envelope_optional::<
1572                fidl::encoding::Endpoint<
1573                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
1574                >,
1575                fidl::encoding::DefaultFuchsiaResourceDialect,
1576            >(
1577                self.thread_feature.as_mut().map(
1578                    <fidl::encoding::Endpoint<
1579                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
1580                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1581                ),
1582                encoder,
1583                offset + cur_offset,
1584                depth,
1585            )?;
1586
1587            _prev_end_offset = cur_offset + envelope_size;
1588            if 15 > max_ordinal {
1589                return Ok(());
1590            }
1591
1592            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1593            // are envelope_size bytes.
1594            let cur_offset: usize = (15 - 1) * envelope_size;
1595
1596            // Zero reserved fields.
1597            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1598
1599            // Safety:
1600            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1601            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1602            //   envelope_size bytes, there is always sufficient room.
1603            fidl::encoding::encode_in_envelope_optional::<
1604                fidl::encoding::Endpoint<
1605                    fidl::endpoints::ServerEnd<
1606                        fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
1607                    >,
1608                >,
1609                fidl::encoding::DefaultFuchsiaResourceDialect,
1610            >(
1611                self.capabilities.as_mut().map(
1612                    <fidl::encoding::Endpoint<
1613                        fidl::endpoints::ServerEnd<
1614                            fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
1615                        >,
1616                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1617                ),
1618                encoder,
1619                offset + cur_offset,
1620                depth,
1621            )?;
1622
1623            _prev_end_offset = cur_offset + envelope_size;
1624
1625            Ok(())
1626        }
1627    }
1628
1629    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Protocols {
1630        #[inline(always)]
1631        fn new_empty() -> Self {
1632            Self::default()
1633        }
1634
1635        unsafe fn decode(
1636            &mut self,
1637            decoder: &mut fidl::encoding::Decoder<
1638                '_,
1639                fidl::encoding::DefaultFuchsiaResourceDialect,
1640            >,
1641            offset: usize,
1642            mut depth: fidl::encoding::Depth,
1643        ) -> fidl::Result<()> {
1644            decoder.debug_check_bounds::<Self>(offset);
1645            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1646                None => return Err(fidl::Error::NotNullable),
1647                Some(len) => len,
1648            };
1649            // Calling decoder.out_of_line_offset(0) is not allowed.
1650            if len == 0 {
1651                return Ok(());
1652            };
1653            depth.increment()?;
1654            let envelope_size = 8;
1655            let bytes_len = len * envelope_size;
1656            let offset = decoder.out_of_line_offset(bytes_len)?;
1657            // Decode the envelope for each type.
1658            let mut _next_ordinal_to_read = 0;
1659            let mut next_offset = offset;
1660            let end_offset = offset + bytes_len;
1661            _next_ordinal_to_read += 1;
1662            if next_offset >= end_offset {
1663                return Ok(());
1664            }
1665
1666            // Decode unknown envelopes for gaps in ordinals.
1667            while _next_ordinal_to_read < 1 {
1668                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1669                _next_ordinal_to_read += 1;
1670                next_offset += envelope_size;
1671            }
1672
1673            let next_out_of_line = decoder.next_out_of_line();
1674            let handles_before = decoder.remaining_handles();
1675            if let Some((inlined, num_bytes, num_handles)) =
1676                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1677            {
1678                let member_inline_size = <fidl::encoding::Endpoint<
1679                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1680                > as fidl::encoding::TypeMarker>::inline_size(
1681                    decoder.context
1682                );
1683                if inlined != (member_inline_size <= 4) {
1684                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1685                }
1686                let inner_offset;
1687                let mut inner_depth = depth.clone();
1688                if inlined {
1689                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1690                    inner_offset = next_offset;
1691                } else {
1692                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1693                    inner_depth.increment()?;
1694                }
1695                let val_ref = self.device.get_or_insert_with(|| {
1696                    fidl::new_empty!(
1697                        fidl::encoding::Endpoint<
1698                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1699                        >,
1700                        fidl::encoding::DefaultFuchsiaResourceDialect
1701                    )
1702                });
1703                fidl::decode!(
1704                    fidl::encoding::Endpoint<
1705                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1706                    >,
1707                    fidl::encoding::DefaultFuchsiaResourceDialect,
1708                    val_ref,
1709                    decoder,
1710                    inner_offset,
1711                    inner_depth
1712                )?;
1713                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1714                {
1715                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1716                }
1717                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1718                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1719                }
1720            }
1721
1722            next_offset += envelope_size;
1723            _next_ordinal_to_read += 1;
1724            if next_offset >= end_offset {
1725                return Ok(());
1726            }
1727
1728            // Decode unknown envelopes for gaps in ordinals.
1729            while _next_ordinal_to_read < 2 {
1730                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1731                _next_ordinal_to_read += 1;
1732                next_offset += envelope_size;
1733            }
1734
1735            let next_out_of_line = decoder.next_out_of_line();
1736            let handles_before = decoder.remaining_handles();
1737            if let Some((inlined, num_bytes, num_handles)) =
1738                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1739            {
1740                let member_inline_size = <fidl::encoding::Endpoint<
1741                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>,
1742                > as fidl::encoding::TypeMarker>::inline_size(
1743                    decoder.context
1744                );
1745                if inlined != (member_inline_size <= 4) {
1746                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1747                }
1748                let inner_offset;
1749                let mut inner_depth = depth.clone();
1750                if inlined {
1751                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1752                    inner_offset = next_offset;
1753                } else {
1754                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1755                    inner_depth.increment()?;
1756                }
1757                let val_ref = self.device_extra.get_or_insert_with(|| {
1758                    fidl::new_empty!(
1759                        fidl::encoding::Endpoint<
1760                            fidl::endpoints::ServerEnd<
1761                                fidl_fuchsia_lowpan_device::DeviceExtraMarker,
1762                            >,
1763                        >,
1764                        fidl::encoding::DefaultFuchsiaResourceDialect
1765                    )
1766                });
1767                fidl::decode!(
1768                    fidl::encoding::Endpoint<
1769                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>,
1770                    >,
1771                    fidl::encoding::DefaultFuchsiaResourceDialect,
1772                    val_ref,
1773                    decoder,
1774                    inner_offset,
1775                    inner_depth
1776                )?;
1777                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1778                {
1779                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1780                }
1781                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1782                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1783                }
1784            }
1785
1786            next_offset += envelope_size;
1787            _next_ordinal_to_read += 1;
1788            if next_offset >= end_offset {
1789                return Ok(());
1790            }
1791
1792            // Decode unknown envelopes for gaps in ordinals.
1793            while _next_ordinal_to_read < 3 {
1794                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1795                _next_ordinal_to_read += 1;
1796                next_offset += envelope_size;
1797            }
1798
1799            let next_out_of_line = decoder.next_out_of_line();
1800            let handles_before = decoder.remaining_handles();
1801            if let Some((inlined, num_bytes, num_handles)) =
1802                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1803            {
1804                let member_inline_size = <fidl::encoding::Endpoint<
1805                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1806                > as fidl::encoding::TypeMarker>::inline_size(
1807                    decoder.context
1808                );
1809                if inlined != (member_inline_size <= 4) {
1810                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1811                }
1812                let inner_offset;
1813                let mut inner_depth = depth.clone();
1814                if inlined {
1815                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1816                    inner_offset = next_offset;
1817                } else {
1818                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1819                    inner_depth.increment()?;
1820                }
1821                let val_ref = self.device_test.get_or_insert_with(|| {
1822                    fidl::new_empty!(
1823                        fidl::encoding::Endpoint<
1824                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1825                        >,
1826                        fidl::encoding::DefaultFuchsiaResourceDialect
1827                    )
1828                });
1829                fidl::decode!(
1830                    fidl::encoding::Endpoint<
1831                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1832                    >,
1833                    fidl::encoding::DefaultFuchsiaResourceDialect,
1834                    val_ref,
1835                    decoder,
1836                    inner_offset,
1837                    inner_depth
1838                )?;
1839                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1840                {
1841                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1842                }
1843                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1844                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1845                }
1846            }
1847
1848            next_offset += envelope_size;
1849            _next_ordinal_to_read += 1;
1850            if next_offset >= end_offset {
1851                return Ok(());
1852            }
1853
1854            // Decode unknown envelopes for gaps in ordinals.
1855            while _next_ordinal_to_read < 4 {
1856                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1857                _next_ordinal_to_read += 1;
1858                next_offset += envelope_size;
1859            }
1860
1861            let next_out_of_line = decoder.next_out_of_line();
1862            let handles_before = decoder.remaining_handles();
1863            if let Some((inlined, num_bytes, num_handles)) =
1864                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1865            {
1866                let member_inline_size = <fidl::encoding::Endpoint<
1867                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceRouteMarker>,
1868                > as fidl::encoding::TypeMarker>::inline_size(
1869                    decoder.context
1870                );
1871                if inlined != (member_inline_size <= 4) {
1872                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1873                }
1874                let inner_offset;
1875                let mut inner_depth = depth.clone();
1876                if inlined {
1877                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1878                    inner_offset = next_offset;
1879                } else {
1880                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1881                    inner_depth.increment()?;
1882                }
1883                let val_ref = self.device_route.get_or_insert_with(|| {
1884                    fidl::new_empty!(
1885                        fidl::encoding::Endpoint<
1886                            fidl::endpoints::ServerEnd<
1887                                fidl_fuchsia_lowpan_experimental::DeviceRouteMarker,
1888                            >,
1889                        >,
1890                        fidl::encoding::DefaultFuchsiaResourceDialect
1891                    )
1892                });
1893                fidl::decode!(
1894                    fidl::encoding::Endpoint<
1895                        fidl::endpoints::ServerEnd<
1896                            fidl_fuchsia_lowpan_experimental::DeviceRouteMarker,
1897                        >,
1898                    >,
1899                    fidl::encoding::DefaultFuchsiaResourceDialect,
1900                    val_ref,
1901                    decoder,
1902                    inner_offset,
1903                    inner_depth
1904                )?;
1905                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1906                {
1907                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1908                }
1909                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1910                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1911                }
1912            }
1913
1914            next_offset += envelope_size;
1915            _next_ordinal_to_read += 1;
1916            if next_offset >= end_offset {
1917                return Ok(());
1918            }
1919
1920            // Decode unknown envelopes for gaps in ordinals.
1921            while _next_ordinal_to_read < 5 {
1922                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1923                _next_ordinal_to_read += 1;
1924                next_offset += envelope_size;
1925            }
1926
1927            let next_out_of_line = decoder.next_out_of_line();
1928            let handles_before = decoder.remaining_handles();
1929            if let Some((inlined, num_bytes, num_handles)) =
1930                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1931            {
1932                let member_inline_size = <fidl::encoding::Endpoint<
1933                    fidl::endpoints::ServerEnd<
1934                        fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
1935                    >,
1936                > as fidl::encoding::TypeMarker>::inline_size(
1937                    decoder.context
1938                );
1939                if inlined != (member_inline_size <= 4) {
1940                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1941                }
1942                let inner_offset;
1943                let mut inner_depth = depth.clone();
1944                if inlined {
1945                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1946                    inner_offset = next_offset;
1947                } else {
1948                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1949                    inner_depth.increment()?;
1950                }
1951                let val_ref = self.device_route_extra.get_or_insert_with(|| {
1952                    fidl::new_empty!(
1953                        fidl::encoding::Endpoint<
1954                            fidl::endpoints::ServerEnd<
1955                                fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
1956                            >,
1957                        >,
1958                        fidl::encoding::DefaultFuchsiaResourceDialect
1959                    )
1960                });
1961                fidl::decode!(
1962                    fidl::encoding::Endpoint<
1963                        fidl::endpoints::ServerEnd<
1964                            fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
1965                        >,
1966                    >,
1967                    fidl::encoding::DefaultFuchsiaResourceDialect,
1968                    val_ref,
1969                    decoder,
1970                    inner_offset,
1971                    inner_depth
1972                )?;
1973                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1974                {
1975                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1976                }
1977                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1978                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1979                }
1980            }
1981
1982            next_offset += envelope_size;
1983            _next_ordinal_to_read += 1;
1984            if next_offset >= end_offset {
1985                return Ok(());
1986            }
1987
1988            // Decode unknown envelopes for gaps in ordinals.
1989            while _next_ordinal_to_read < 6 {
1990                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1991                _next_ordinal_to_read += 1;
1992                next_offset += envelope_size;
1993            }
1994
1995            let next_out_of_line = decoder.next_out_of_line();
1996            let handles_before = decoder.remaining_handles();
1997            if let Some((inlined, num_bytes, num_handles)) =
1998                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1999            {
2000                let member_inline_size = <fidl::encoding::Endpoint<
2001                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
2002                > as fidl::encoding::TypeMarker>::inline_size(
2003                    decoder.context
2004                );
2005                if inlined != (member_inline_size <= 4) {
2006                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2007                }
2008                let inner_offset;
2009                let mut inner_depth = depth.clone();
2010                if inlined {
2011                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2012                    inner_offset = next_offset;
2013                } else {
2014                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2015                    inner_depth.increment()?;
2016                }
2017                let val_ref = self.counters.get_or_insert_with(|| {
2018                    fidl::new_empty!(
2019                        fidl::encoding::Endpoint<
2020                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
2021                        >,
2022                        fidl::encoding::DefaultFuchsiaResourceDialect
2023                    )
2024                });
2025                fidl::decode!(
2026                    fidl::encoding::Endpoint<
2027                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
2028                    >,
2029                    fidl::encoding::DefaultFuchsiaResourceDialect,
2030                    val_ref,
2031                    decoder,
2032                    inner_offset,
2033                    inner_depth
2034                )?;
2035                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2036                {
2037                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2038                }
2039                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2040                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2041                }
2042            }
2043
2044            next_offset += envelope_size;
2045            _next_ordinal_to_read += 1;
2046            if next_offset >= end_offset {
2047                return Ok(());
2048            }
2049
2050            // Decode unknown envelopes for gaps in ordinals.
2051            while _next_ordinal_to_read < 7 {
2052                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2053                _next_ordinal_to_read += 1;
2054                next_offset += envelope_size;
2055            }
2056
2057            let next_out_of_line = decoder.next_out_of_line();
2058            let handles_before = decoder.remaining_handles();
2059            if let Some((inlined, num_bytes, num_handles)) =
2060                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2061            {
2062                let member_inline_size = <fidl::encoding::Endpoint<
2063                    fidl::endpoints::ServerEnd<
2064                        fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
2065                    >,
2066                > as fidl::encoding::TypeMarker>::inline_size(
2067                    decoder.context
2068                );
2069                if inlined != (member_inline_size <= 4) {
2070                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2071                }
2072                let inner_offset;
2073                let mut inner_depth = depth.clone();
2074                if inlined {
2075                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2076                    inner_offset = next_offset;
2077                } else {
2078                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2079                    inner_depth.increment()?;
2080                }
2081                let val_ref = self.thread_legacy_joining.get_or_insert_with(|| {
2082                    fidl::new_empty!(
2083                        fidl::encoding::Endpoint<
2084                            fidl::endpoints::ServerEnd<
2085                                fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
2086                            >,
2087                        >,
2088                        fidl::encoding::DefaultFuchsiaResourceDialect
2089                    )
2090                });
2091                fidl::decode!(
2092                    fidl::encoding::Endpoint<
2093                        fidl::endpoints::ServerEnd<
2094                            fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
2095                        >,
2096                    >,
2097                    fidl::encoding::DefaultFuchsiaResourceDialect,
2098                    val_ref,
2099                    decoder,
2100                    inner_offset,
2101                    inner_depth
2102                )?;
2103                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2104                {
2105                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2106                }
2107                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2108                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2109                }
2110            }
2111
2112            next_offset += envelope_size;
2113            _next_ordinal_to_read += 1;
2114            if next_offset >= end_offset {
2115                return Ok(());
2116            }
2117
2118            // Decode unknown envelopes for gaps in ordinals.
2119            while _next_ordinal_to_read < 8 {
2120                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2121                _next_ordinal_to_read += 1;
2122                next_offset += envelope_size;
2123            }
2124
2125            let next_out_of_line = decoder.next_out_of_line();
2126            let handles_before = decoder.remaining_handles();
2127            if let Some((inlined, num_bytes, num_handles)) =
2128                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2129            {
2130                let member_inline_size = <fidl::encoding::Endpoint<
2131                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
2132                > as fidl::encoding::TypeMarker>::inline_size(
2133                    decoder.context
2134                );
2135                if inlined != (member_inline_size <= 4) {
2136                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2137                }
2138                let inner_offset;
2139                let mut inner_depth = depth.clone();
2140                if inlined {
2141                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2142                    inner_offset = next_offset;
2143                } else {
2144                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2145                    inner_depth.increment()?;
2146                }
2147                let val_ref = self.thread_dataset.get_or_insert_with(|| {
2148                    fidl::new_empty!(
2149                        fidl::encoding::Endpoint<
2150                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
2151                        >,
2152                        fidl::encoding::DefaultFuchsiaResourceDialect
2153                    )
2154                });
2155                fidl::decode!(
2156                    fidl::encoding::Endpoint<
2157                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
2158                    >,
2159                    fidl::encoding::DefaultFuchsiaResourceDialect,
2160                    val_ref,
2161                    decoder,
2162                    inner_offset,
2163                    inner_depth
2164                )?;
2165                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2166                {
2167                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2168                }
2169                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2170                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2171                }
2172            }
2173
2174            next_offset += envelope_size;
2175            _next_ordinal_to_read += 1;
2176            if next_offset >= end_offset {
2177                return Ok(());
2178            }
2179
2180            // Decode unknown envelopes for gaps in ordinals.
2181            while _next_ordinal_to_read < 9 {
2182                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2183                _next_ordinal_to_read += 1;
2184                next_offset += envelope_size;
2185            }
2186
2187            let next_out_of_line = decoder.next_out_of_line();
2188            let handles_before = decoder.remaining_handles();
2189            if let Some((inlined, num_bytes, num_handles)) =
2190                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2191            {
2192                let member_inline_size = <fidl::encoding::Endpoint<
2193                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>,
2194                > as fidl::encoding::TypeMarker>::inline_size(
2195                    decoder.context
2196                );
2197                if inlined != (member_inline_size <= 4) {
2198                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2199                }
2200                let inner_offset;
2201                let mut inner_depth = depth.clone();
2202                if inlined {
2203                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2204                    inner_offset = next_offset;
2205                } else {
2206                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2207                    inner_depth.increment()?;
2208                }
2209                let val_ref = self.energy_scan.get_or_insert_with(|| {
2210                    fidl::new_empty!(
2211                        fidl::encoding::Endpoint<
2212                            fidl::endpoints::ServerEnd<
2213                                fidl_fuchsia_lowpan_device::EnergyScanMarker,
2214                            >,
2215                        >,
2216                        fidl::encoding::DefaultFuchsiaResourceDialect
2217                    )
2218                });
2219                fidl::decode!(
2220                    fidl::encoding::Endpoint<
2221                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>,
2222                    >,
2223                    fidl::encoding::DefaultFuchsiaResourceDialect,
2224                    val_ref,
2225                    decoder,
2226                    inner_offset,
2227                    inner_depth
2228                )?;
2229                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2230                {
2231                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2232                }
2233                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2234                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2235                }
2236            }
2237
2238            next_offset += envelope_size;
2239            _next_ordinal_to_read += 1;
2240            if next_offset >= end_offset {
2241                return Ok(());
2242            }
2243
2244            // Decode unknown envelopes for gaps in ordinals.
2245            while _next_ordinal_to_read < 10 {
2246                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2247                _next_ordinal_to_read += 1;
2248                next_offset += envelope_size;
2249            }
2250
2251            let next_out_of_line = decoder.next_out_of_line();
2252            let handles_before = decoder.remaining_handles();
2253            if let Some((inlined, num_bytes, num_handles)) =
2254                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2255            {
2256                let member_inline_size = <fidl::encoding::Endpoint<
2257                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>,
2258                > as fidl::encoding::TypeMarker>::inline_size(
2259                    decoder.context
2260                );
2261                if inlined != (member_inline_size <= 4) {
2262                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2263                }
2264                let inner_offset;
2265                let mut inner_depth = depth.clone();
2266                if inlined {
2267                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2268                    inner_offset = next_offset;
2269                } else {
2270                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2271                    inner_depth.increment()?;
2272                }
2273                let val_ref = self.experimental_device.get_or_insert_with(|| {
2274                    fidl::new_empty!(
2275                        fidl::encoding::Endpoint<
2276                            fidl::endpoints::ServerEnd<
2277                                fidl_fuchsia_lowpan_experimental::DeviceMarker,
2278                            >,
2279                        >,
2280                        fidl::encoding::DefaultFuchsiaResourceDialect
2281                    )
2282                });
2283                fidl::decode!(
2284                    fidl::encoding::Endpoint<
2285                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>,
2286                    >,
2287                    fidl::encoding::DefaultFuchsiaResourceDialect,
2288                    val_ref,
2289                    decoder,
2290                    inner_offset,
2291                    inner_depth
2292                )?;
2293                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2294                {
2295                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2296                }
2297                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2298                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2299                }
2300            }
2301
2302            next_offset += envelope_size;
2303            _next_ordinal_to_read += 1;
2304            if next_offset >= end_offset {
2305                return Ok(());
2306            }
2307
2308            // Decode unknown envelopes for gaps in ordinals.
2309            while _next_ordinal_to_read < 11 {
2310                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2311                _next_ordinal_to_read += 1;
2312                next_offset += envelope_size;
2313            }
2314
2315            let next_out_of_line = decoder.next_out_of_line();
2316            let handles_before = decoder.remaining_handles();
2317            if let Some((inlined, num_bytes, num_handles)) =
2318                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2319            {
2320                let member_inline_size = <fidl::encoding::Endpoint<
2321                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceExtraMarker>,
2322                > as fidl::encoding::TypeMarker>::inline_size(
2323                    decoder.context
2324                );
2325                if inlined != (member_inline_size <= 4) {
2326                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2327                }
2328                let inner_offset;
2329                let mut inner_depth = depth.clone();
2330                if inlined {
2331                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2332                    inner_offset = next_offset;
2333                } else {
2334                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2335                    inner_depth.increment()?;
2336                }
2337                let val_ref = self.experimental_device_extra.get_or_insert_with(|| {
2338                    fidl::new_empty!(
2339                        fidl::encoding::Endpoint<
2340                            fidl::endpoints::ServerEnd<
2341                                fidl_fuchsia_lowpan_experimental::DeviceExtraMarker,
2342                            >,
2343                        >,
2344                        fidl::encoding::DefaultFuchsiaResourceDialect
2345                    )
2346                });
2347                fidl::decode!(
2348                    fidl::encoding::Endpoint<
2349                        fidl::endpoints::ServerEnd<
2350                            fidl_fuchsia_lowpan_experimental::DeviceExtraMarker,
2351                        >,
2352                    >,
2353                    fidl::encoding::DefaultFuchsiaResourceDialect,
2354                    val_ref,
2355                    decoder,
2356                    inner_offset,
2357                    inner_depth
2358                )?;
2359                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2360                {
2361                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2362                }
2363                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2364                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2365                }
2366            }
2367
2368            next_offset += envelope_size;
2369            _next_ordinal_to_read += 1;
2370            if next_offset >= end_offset {
2371                return Ok(());
2372            }
2373
2374            // Decode unknown envelopes for gaps in ordinals.
2375            while _next_ordinal_to_read < 12 {
2376                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2377                _next_ordinal_to_read += 1;
2378                next_offset += envelope_size;
2379            }
2380
2381            let next_out_of_line = decoder.next_out_of_line();
2382            let handles_before = decoder.remaining_handles();
2383            if let Some((inlined, num_bytes, num_handles)) =
2384                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2385            {
2386                let member_inline_size = <fidl::encoding::Endpoint<
2387                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
2388                > as fidl::encoding::TypeMarker>::inline_size(
2389                    decoder.context
2390                );
2391                if inlined != (member_inline_size <= 4) {
2392                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2393                }
2394                let inner_offset;
2395                let mut inner_depth = depth.clone();
2396                if inlined {
2397                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2398                    inner_offset = next_offset;
2399                } else {
2400                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2401                    inner_depth.increment()?;
2402                }
2403                let val_ref = self.meshcop.get_or_insert_with(|| {
2404                    fidl::new_empty!(
2405                        fidl::encoding::Endpoint<
2406                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
2407                        >,
2408                        fidl::encoding::DefaultFuchsiaResourceDialect
2409                    )
2410                });
2411                fidl::decode!(
2412                    fidl::encoding::Endpoint<
2413                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
2414                    >,
2415                    fidl::encoding::DefaultFuchsiaResourceDialect,
2416                    val_ref,
2417                    decoder,
2418                    inner_offset,
2419                    inner_depth
2420                )?;
2421                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2422                {
2423                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2424                }
2425                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2426                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2427                }
2428            }
2429
2430            next_offset += envelope_size;
2431            _next_ordinal_to_read += 1;
2432            if next_offset >= end_offset {
2433                return Ok(());
2434            }
2435
2436            // Decode unknown envelopes for gaps in ordinals.
2437            while _next_ordinal_to_read < 13 {
2438                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2439                _next_ordinal_to_read += 1;
2440                next_offset += envelope_size;
2441            }
2442
2443            let next_out_of_line = decoder.next_out_of_line();
2444            let handles_before = decoder.remaining_handles();
2445            if let Some((inlined, num_bytes, num_handles)) =
2446                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2447            {
2448                let member_inline_size = <fidl::encoding::Endpoint<
2449                    fidl::endpoints::ServerEnd<
2450                        fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
2451                    >,
2452                > as fidl::encoding::TypeMarker>::inline_size(
2453                    decoder.context
2454                );
2455                if inlined != (member_inline_size <= 4) {
2456                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2457                }
2458                let inner_offset;
2459                let mut inner_depth = depth.clone();
2460                if inlined {
2461                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2462                    inner_offset = next_offset;
2463                } else {
2464                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2465                    inner_depth.increment()?;
2466                }
2467                let val_ref = self.telemetry_provider.get_or_insert_with(|| {
2468                    fidl::new_empty!(
2469                        fidl::encoding::Endpoint<
2470                            fidl::endpoints::ServerEnd<
2471                                fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
2472                            >,
2473                        >,
2474                        fidl::encoding::DefaultFuchsiaResourceDialect
2475                    )
2476                });
2477                fidl::decode!(
2478                    fidl::encoding::Endpoint<
2479                        fidl::endpoints::ServerEnd<
2480                            fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
2481                        >,
2482                    >,
2483                    fidl::encoding::DefaultFuchsiaResourceDialect,
2484                    val_ref,
2485                    decoder,
2486                    inner_offset,
2487                    inner_depth
2488                )?;
2489                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2490                {
2491                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2492                }
2493                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2494                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2495                }
2496            }
2497
2498            next_offset += envelope_size;
2499            _next_ordinal_to_read += 1;
2500            if next_offset >= end_offset {
2501                return Ok(());
2502            }
2503
2504            // Decode unknown envelopes for gaps in ordinals.
2505            while _next_ordinal_to_read < 14 {
2506                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2507                _next_ordinal_to_read += 1;
2508                next_offset += envelope_size;
2509            }
2510
2511            let next_out_of_line = decoder.next_out_of_line();
2512            let handles_before = decoder.remaining_handles();
2513            if let Some((inlined, num_bytes, num_handles)) =
2514                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2515            {
2516                let member_inline_size = <fidl::encoding::Endpoint<
2517                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
2518                > as fidl::encoding::TypeMarker>::inline_size(
2519                    decoder.context
2520                );
2521                if inlined != (member_inline_size <= 4) {
2522                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2523                }
2524                let inner_offset;
2525                let mut inner_depth = depth.clone();
2526                if inlined {
2527                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2528                    inner_offset = next_offset;
2529                } else {
2530                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2531                    inner_depth.increment()?;
2532                }
2533                let val_ref = self.thread_feature.get_or_insert_with(|| {
2534                    fidl::new_empty!(
2535                        fidl::encoding::Endpoint<
2536                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
2537                        >,
2538                        fidl::encoding::DefaultFuchsiaResourceDialect
2539                    )
2540                });
2541                fidl::decode!(
2542                    fidl::encoding::Endpoint<
2543                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
2544                    >,
2545                    fidl::encoding::DefaultFuchsiaResourceDialect,
2546                    val_ref,
2547                    decoder,
2548                    inner_offset,
2549                    inner_depth
2550                )?;
2551                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2552                {
2553                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2554                }
2555                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2556                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2557                }
2558            }
2559
2560            next_offset += envelope_size;
2561            _next_ordinal_to_read += 1;
2562            if next_offset >= end_offset {
2563                return Ok(());
2564            }
2565
2566            // Decode unknown envelopes for gaps in ordinals.
2567            while _next_ordinal_to_read < 15 {
2568                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2569                _next_ordinal_to_read += 1;
2570                next_offset += envelope_size;
2571            }
2572
2573            let next_out_of_line = decoder.next_out_of_line();
2574            let handles_before = decoder.remaining_handles();
2575            if let Some((inlined, num_bytes, num_handles)) =
2576                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2577            {
2578                let member_inline_size = <fidl::encoding::Endpoint<
2579                    fidl::endpoints::ServerEnd<
2580                        fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
2581                    >,
2582                > as fidl::encoding::TypeMarker>::inline_size(
2583                    decoder.context
2584                );
2585                if inlined != (member_inline_size <= 4) {
2586                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2587                }
2588                let inner_offset;
2589                let mut inner_depth = depth.clone();
2590                if inlined {
2591                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2592                    inner_offset = next_offset;
2593                } else {
2594                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2595                    inner_depth.increment()?;
2596                }
2597                let val_ref = self.capabilities.get_or_insert_with(|| {
2598                    fidl::new_empty!(
2599                        fidl::encoding::Endpoint<
2600                            fidl::endpoints::ServerEnd<
2601                                fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
2602                            >,
2603                        >,
2604                        fidl::encoding::DefaultFuchsiaResourceDialect
2605                    )
2606                });
2607                fidl::decode!(
2608                    fidl::encoding::Endpoint<
2609                        fidl::endpoints::ServerEnd<
2610                            fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
2611                        >,
2612                    >,
2613                    fidl::encoding::DefaultFuchsiaResourceDialect,
2614                    val_ref,
2615                    decoder,
2616                    inner_offset,
2617                    inner_depth
2618                )?;
2619                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2620                {
2621                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2622                }
2623                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2624                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2625                }
2626            }
2627
2628            next_offset += envelope_size;
2629
2630            // Decode the remaining unknown envelopes.
2631            while next_offset < end_offset {
2632                _next_ordinal_to_read += 1;
2633                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2634                next_offset += envelope_size;
2635            }
2636
2637            Ok(())
2638        }
2639    }
2640}