Skip to main content

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