fidl_fuchsia_lowpan_driver/
fidl_fuchsia_lowpan_driver.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_lowpan_driver__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, PartialEq)]
15pub struct DriverGetProtocolsRequest {
16    pub protocols: Protocols,
17}
18
19impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for DriverGetProtocolsRequest {}
20
21#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
22pub struct RegisterRegisterDeviceRequest {
23    pub name: String,
24    pub driver: fidl::endpoints::ClientEnd<DriverMarker>,
25}
26
27impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
28    for RegisterRegisterDeviceRequest
29{
30}
31
32/// Table of protocol requests that is passed into `Driver.GetProtocols()`.
33#[derive(Debug, Default, PartialEq)]
34pub struct Protocols {
35    pub device: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>>,
36    pub device_extra:
37        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>>,
38    pub device_test: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>>,
39    pub device_route:
40        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceRouteMarker>>,
41    pub device_route_extra: Option<
42        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker>,
43    >,
44    pub counters: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>>,
45    pub thread_legacy_joining:
46        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker>>,
47    pub thread_dataset:
48        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>>,
49    pub energy_scan:
50        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>>,
51    pub experimental_device:
52        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>>,
53    pub experimental_device_extra:
54        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceExtraMarker>>,
55    pub meshcop: Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>>,
56    pub telemetry_provider: Option<
57        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker>,
58    >,
59    pub thread_feature:
60        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>>,
61    pub capabilities:
62        Option<fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker>>,
63    #[doc(hidden)]
64    pub __source_breaking: fidl::marker::SourceBreaking,
65}
66
67impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Protocols {}
68
69#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
70pub struct DriverMarker;
71
72impl fidl::endpoints::ProtocolMarker for DriverMarker {
73    type Proxy = DriverProxy;
74    type RequestStream = DriverRequestStream;
75    #[cfg(target_os = "fuchsia")]
76    type SynchronousProxy = DriverSynchronousProxy;
77
78    const DEBUG_NAME: &'static str = "(anonymous) Driver";
79}
80
81pub trait DriverProxyInterface: Send + Sync {
82    fn r#get_protocols(&self, protocols: Protocols) -> Result<(), fidl::Error>;
83}
84#[derive(Debug)]
85#[cfg(target_os = "fuchsia")]
86pub struct DriverSynchronousProxy {
87    client: fidl::client::sync::Client,
88}
89
90#[cfg(target_os = "fuchsia")]
91impl fidl::endpoints::SynchronousProxy for DriverSynchronousProxy {
92    type Proxy = DriverProxy;
93    type Protocol = DriverMarker;
94
95    fn from_channel(inner: fidl::Channel) -> Self {
96        Self::new(inner)
97    }
98
99    fn into_channel(self) -> fidl::Channel {
100        self.client.into_channel()
101    }
102
103    fn as_channel(&self) -> &fidl::Channel {
104        self.client.as_channel()
105    }
106}
107
108#[cfg(target_os = "fuchsia")]
109impl DriverSynchronousProxy {
110    pub fn new(channel: fidl::Channel) -> Self {
111        let protocol_name = <DriverMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
112        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
113    }
114
115    pub fn into_channel(self) -> fidl::Channel {
116        self.client.into_channel()
117    }
118
119    /// Waits until an event arrives and returns it. It is safe for other
120    /// threads to make concurrent requests while waiting for an event.
121    pub fn wait_for_event(
122        &self,
123        deadline: zx::MonotonicInstant,
124    ) -> Result<DriverEvent, fidl::Error> {
125        DriverEvent::decode(self.client.wait_for_event(deadline)?)
126    }
127
128    /// Request protocols to control this device.
129    /// Unsupported protocols are closed.
130    pub fn r#get_protocols(&self, mut protocols: Protocols) -> Result<(), fidl::Error> {
131        self.client.send::<DriverGetProtocolsRequest>(
132            (&mut protocols,),
133            0x165f5b09fcc7bc85,
134            fidl::encoding::DynamicFlags::empty(),
135        )
136    }
137}
138
139#[cfg(target_os = "fuchsia")]
140impl From<DriverSynchronousProxy> for zx::Handle {
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    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
398        self.inner.shutdown_with_epitaph(status)
399    }
400
401    fn is_closed(&self) -> bool {
402        self.inner.channel().is_closed()
403    }
404    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
405        self.inner.channel().on_closed()
406    }
407
408    #[cfg(target_os = "fuchsia")]
409    fn signal_peer(
410        &self,
411        clear_mask: zx::Signals,
412        set_mask: zx::Signals,
413    ) -> Result<(), zx_status::Status> {
414        use fidl::Peered;
415        self.inner.channel().signal_peer(clear_mask, set_mask)
416    }
417}
418
419impl DriverControlHandle {}
420
421#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
422pub struct RegisterMarker;
423
424impl fidl::endpoints::ProtocolMarker for RegisterMarker {
425    type Proxy = RegisterProxy;
426    type RequestStream = RegisterRequestStream;
427    #[cfg(target_os = "fuchsia")]
428    type SynchronousProxy = RegisterSynchronousProxy;
429
430    const DEBUG_NAME: &'static str = "fuchsia.lowpan.driver.Register";
431}
432impl fidl::endpoints::DiscoverableProtocolMarker for RegisterMarker {}
433
434pub trait RegisterProxyInterface: Send + Sync {
435    fn r#register_device(
436        &self,
437        name: &str,
438        driver: fidl::endpoints::ClientEnd<DriverMarker>,
439    ) -> Result<(), fidl::Error>;
440}
441#[derive(Debug)]
442#[cfg(target_os = "fuchsia")]
443pub struct RegisterSynchronousProxy {
444    client: fidl::client::sync::Client,
445}
446
447#[cfg(target_os = "fuchsia")]
448impl fidl::endpoints::SynchronousProxy for RegisterSynchronousProxy {
449    type Proxy = RegisterProxy;
450    type Protocol = RegisterMarker;
451
452    fn from_channel(inner: fidl::Channel) -> Self {
453        Self::new(inner)
454    }
455
456    fn into_channel(self) -> fidl::Channel {
457        self.client.into_channel()
458    }
459
460    fn as_channel(&self) -> &fidl::Channel {
461        self.client.as_channel()
462    }
463}
464
465#[cfg(target_os = "fuchsia")]
466impl RegisterSynchronousProxy {
467    pub fn new(channel: fidl::Channel) -> Self {
468        let protocol_name = <RegisterMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
469        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
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(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::Handle {
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    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
779        self.inner.shutdown_with_epitaph(status)
780    }
781
782    fn is_closed(&self) -> bool {
783        self.inner.channel().is_closed()
784    }
785    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
786        self.inner.channel().on_closed()
787    }
788
789    #[cfg(target_os = "fuchsia")]
790    fn signal_peer(
791        &self,
792        clear_mask: zx::Signals,
793        set_mask: zx::Signals,
794    ) -> Result<(), zx_status::Status> {
795        use fidl::Peered;
796        self.inner.channel().signal_peer(clear_mask, set_mask)
797    }
798}
799
800impl RegisterControlHandle {}
801
802mod internal {
803    use super::*;
804
805    impl fidl::encoding::ResourceTypeMarker for DriverGetProtocolsRequest {
806        type Borrowed<'a> = &'a mut Self;
807        fn take_or_borrow<'a>(
808            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
809        ) -> Self::Borrowed<'a> {
810            value
811        }
812    }
813
814    unsafe impl fidl::encoding::TypeMarker for DriverGetProtocolsRequest {
815        type Owned = Self;
816
817        #[inline(always)]
818        fn inline_align(_context: fidl::encoding::Context) -> usize {
819            8
820        }
821
822        #[inline(always)]
823        fn inline_size(_context: fidl::encoding::Context) -> usize {
824            16
825        }
826    }
827
828    unsafe impl
829        fidl::encoding::Encode<
830            DriverGetProtocolsRequest,
831            fidl::encoding::DefaultFuchsiaResourceDialect,
832        > for &mut DriverGetProtocolsRequest
833    {
834        #[inline]
835        unsafe fn encode(
836            self,
837            encoder: &mut fidl::encoding::Encoder<
838                '_,
839                fidl::encoding::DefaultFuchsiaResourceDialect,
840            >,
841            offset: usize,
842            _depth: fidl::encoding::Depth,
843        ) -> fidl::Result<()> {
844            encoder.debug_check_bounds::<DriverGetProtocolsRequest>(offset);
845            // Delegate to tuple encoding.
846            fidl::encoding::Encode::<
847                DriverGetProtocolsRequest,
848                fidl::encoding::DefaultFuchsiaResourceDialect,
849            >::encode(
850                (<Protocols as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
851                    &mut self.protocols,
852                ),),
853                encoder,
854                offset,
855                _depth,
856            )
857        }
858    }
859    unsafe impl<T0: fidl::encoding::Encode<Protocols, fidl::encoding::DefaultFuchsiaResourceDialect>>
860        fidl::encoding::Encode<
861            DriverGetProtocolsRequest,
862            fidl::encoding::DefaultFuchsiaResourceDialect,
863        > for (T0,)
864    {
865        #[inline]
866        unsafe fn encode(
867            self,
868            encoder: &mut fidl::encoding::Encoder<
869                '_,
870                fidl::encoding::DefaultFuchsiaResourceDialect,
871            >,
872            offset: usize,
873            depth: fidl::encoding::Depth,
874        ) -> fidl::Result<()> {
875            encoder.debug_check_bounds::<DriverGetProtocolsRequest>(offset);
876            // Zero out padding regions. There's no need to apply masks
877            // because the unmasked parts will be overwritten by fields.
878            // Write the fields.
879            self.0.encode(encoder, offset + 0, depth)?;
880            Ok(())
881        }
882    }
883
884    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
885        for DriverGetProtocolsRequest
886    {
887        #[inline(always)]
888        fn new_empty() -> Self {
889            Self {
890                protocols: fidl::new_empty!(
891                    Protocols,
892                    fidl::encoding::DefaultFuchsiaResourceDialect
893                ),
894            }
895        }
896
897        #[inline]
898        unsafe fn decode(
899            &mut self,
900            decoder: &mut fidl::encoding::Decoder<
901                '_,
902                fidl::encoding::DefaultFuchsiaResourceDialect,
903            >,
904            offset: usize,
905            _depth: fidl::encoding::Depth,
906        ) -> fidl::Result<()> {
907            decoder.debug_check_bounds::<Self>(offset);
908            // Verify that padding bytes are zero.
909            fidl::decode!(
910                Protocols,
911                fidl::encoding::DefaultFuchsiaResourceDialect,
912                &mut self.protocols,
913                decoder,
914                offset + 0,
915                _depth
916            )?;
917            Ok(())
918        }
919    }
920
921    impl fidl::encoding::ResourceTypeMarker for RegisterRegisterDeviceRequest {
922        type Borrowed<'a> = &'a mut Self;
923        fn take_or_borrow<'a>(
924            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
925        ) -> Self::Borrowed<'a> {
926            value
927        }
928    }
929
930    unsafe impl fidl::encoding::TypeMarker for RegisterRegisterDeviceRequest {
931        type Owned = Self;
932
933        #[inline(always)]
934        fn inline_align(_context: fidl::encoding::Context) -> usize {
935            8
936        }
937
938        #[inline(always)]
939        fn inline_size(_context: fidl::encoding::Context) -> usize {
940            24
941        }
942    }
943
944    unsafe impl
945        fidl::encoding::Encode<
946            RegisterRegisterDeviceRequest,
947            fidl::encoding::DefaultFuchsiaResourceDialect,
948        > for &mut RegisterRegisterDeviceRequest
949    {
950        #[inline]
951        unsafe fn encode(
952            self,
953            encoder: &mut fidl::encoding::Encoder<
954                '_,
955                fidl::encoding::DefaultFuchsiaResourceDialect,
956            >,
957            offset: usize,
958            _depth: fidl::encoding::Depth,
959        ) -> fidl::Result<()> {
960            encoder.debug_check_bounds::<RegisterRegisterDeviceRequest>(offset);
961            // Delegate to tuple encoding.
962            fidl::encoding::Encode::<RegisterRegisterDeviceRequest, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
963                (
964                    <fidl::encoding::BoundedString<32> as fidl::encoding::ValueTypeMarker>::borrow(&self.name),
965                    <fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<DriverMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.driver),
966                ),
967                encoder, offset, _depth
968            )
969        }
970    }
971    unsafe impl<
972            T0: fidl::encoding::Encode<
973                fidl::encoding::BoundedString<32>,
974                fidl::encoding::DefaultFuchsiaResourceDialect,
975            >,
976            T1: fidl::encoding::Encode<
977                fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<DriverMarker>>,
978                fidl::encoding::DefaultFuchsiaResourceDialect,
979            >,
980        >
981        fidl::encoding::Encode<
982            RegisterRegisterDeviceRequest,
983            fidl::encoding::DefaultFuchsiaResourceDialect,
984        > for (T0, T1)
985    {
986        #[inline]
987        unsafe fn encode(
988            self,
989            encoder: &mut fidl::encoding::Encoder<
990                '_,
991                fidl::encoding::DefaultFuchsiaResourceDialect,
992            >,
993            offset: usize,
994            depth: fidl::encoding::Depth,
995        ) -> fidl::Result<()> {
996            encoder.debug_check_bounds::<RegisterRegisterDeviceRequest>(offset);
997            // Zero out padding regions. There's no need to apply masks
998            // because the unmasked parts will be overwritten by fields.
999            unsafe {
1000                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(16);
1001                (ptr as *mut u64).write_unaligned(0);
1002            }
1003            // Write the fields.
1004            self.0.encode(encoder, offset + 0, depth)?;
1005            self.1.encode(encoder, offset + 16, depth)?;
1006            Ok(())
1007        }
1008    }
1009
1010    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1011        for RegisterRegisterDeviceRequest
1012    {
1013        #[inline(always)]
1014        fn new_empty() -> Self {
1015            Self {
1016                name: fidl::new_empty!(
1017                    fidl::encoding::BoundedString<32>,
1018                    fidl::encoding::DefaultFuchsiaResourceDialect
1019                ),
1020                driver: fidl::new_empty!(
1021                    fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<DriverMarker>>,
1022                    fidl::encoding::DefaultFuchsiaResourceDialect
1023                ),
1024            }
1025        }
1026
1027        #[inline]
1028        unsafe fn decode(
1029            &mut self,
1030            decoder: &mut fidl::encoding::Decoder<
1031                '_,
1032                fidl::encoding::DefaultFuchsiaResourceDialect,
1033            >,
1034            offset: usize,
1035            _depth: fidl::encoding::Depth,
1036        ) -> fidl::Result<()> {
1037            decoder.debug_check_bounds::<Self>(offset);
1038            // Verify that padding bytes are zero.
1039            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(16) };
1040            let padval = unsafe { (ptr as *const u64).read_unaligned() };
1041            let mask = 0xffffffff00000000u64;
1042            let maskedval = padval & mask;
1043            if maskedval != 0 {
1044                return Err(fidl::Error::NonZeroPadding {
1045                    padding_start: offset + 16 + ((mask as u64).trailing_zeros() / 8) as usize,
1046                });
1047            }
1048            fidl::decode!(
1049                fidl::encoding::BoundedString<32>,
1050                fidl::encoding::DefaultFuchsiaResourceDialect,
1051                &mut self.name,
1052                decoder,
1053                offset + 0,
1054                _depth
1055            )?;
1056            fidl::decode!(
1057                fidl::encoding::Endpoint<fidl::endpoints::ClientEnd<DriverMarker>>,
1058                fidl::encoding::DefaultFuchsiaResourceDialect,
1059                &mut self.driver,
1060                decoder,
1061                offset + 16,
1062                _depth
1063            )?;
1064            Ok(())
1065        }
1066    }
1067
1068    impl Protocols {
1069        #[inline(always)]
1070        fn max_ordinal_present(&self) -> u64 {
1071            if let Some(_) = self.capabilities {
1072                return 15;
1073            }
1074            if let Some(_) = self.thread_feature {
1075                return 14;
1076            }
1077            if let Some(_) = self.telemetry_provider {
1078                return 13;
1079            }
1080            if let Some(_) = self.meshcop {
1081                return 12;
1082            }
1083            if let Some(_) = self.experimental_device_extra {
1084                return 11;
1085            }
1086            if let Some(_) = self.experimental_device {
1087                return 10;
1088            }
1089            if let Some(_) = self.energy_scan {
1090                return 9;
1091            }
1092            if let Some(_) = self.thread_dataset {
1093                return 8;
1094            }
1095            if let Some(_) = self.thread_legacy_joining {
1096                return 7;
1097            }
1098            if let Some(_) = self.counters {
1099                return 6;
1100            }
1101            if let Some(_) = self.device_route_extra {
1102                return 5;
1103            }
1104            if let Some(_) = self.device_route {
1105                return 4;
1106            }
1107            if let Some(_) = self.device_test {
1108                return 3;
1109            }
1110            if let Some(_) = self.device_extra {
1111                return 2;
1112            }
1113            if let Some(_) = self.device {
1114                return 1;
1115            }
1116            0
1117        }
1118    }
1119
1120    impl fidl::encoding::ResourceTypeMarker for Protocols {
1121        type Borrowed<'a> = &'a mut Self;
1122        fn take_or_borrow<'a>(
1123            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1124        ) -> Self::Borrowed<'a> {
1125            value
1126        }
1127    }
1128
1129    unsafe impl fidl::encoding::TypeMarker for Protocols {
1130        type Owned = Self;
1131
1132        #[inline(always)]
1133        fn inline_align(_context: fidl::encoding::Context) -> usize {
1134            8
1135        }
1136
1137        #[inline(always)]
1138        fn inline_size(_context: fidl::encoding::Context) -> usize {
1139            16
1140        }
1141    }
1142
1143    unsafe impl fidl::encoding::Encode<Protocols, fidl::encoding::DefaultFuchsiaResourceDialect>
1144        for &mut Protocols
1145    {
1146        unsafe fn encode(
1147            self,
1148            encoder: &mut fidl::encoding::Encoder<
1149                '_,
1150                fidl::encoding::DefaultFuchsiaResourceDialect,
1151            >,
1152            offset: usize,
1153            mut depth: fidl::encoding::Depth,
1154        ) -> fidl::Result<()> {
1155            encoder.debug_check_bounds::<Protocols>(offset);
1156            // Vector header
1157            let max_ordinal: u64 = self.max_ordinal_present();
1158            encoder.write_num(max_ordinal, offset);
1159            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1160            // Calling encoder.out_of_line_offset(0) is not allowed.
1161            if max_ordinal == 0 {
1162                return Ok(());
1163            }
1164            depth.increment()?;
1165            let envelope_size = 8;
1166            let bytes_len = max_ordinal as usize * envelope_size;
1167            #[allow(unused_variables)]
1168            let offset = encoder.out_of_line_offset(bytes_len);
1169            let mut _prev_end_offset: usize = 0;
1170            if 1 > max_ordinal {
1171                return Ok(());
1172            }
1173
1174            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1175            // are envelope_size bytes.
1176            let cur_offset: usize = (1 - 1) * envelope_size;
1177
1178            // Zero reserved fields.
1179            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1180
1181            // Safety:
1182            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1183            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1184            //   envelope_size bytes, there is always sufficient room.
1185            fidl::encoding::encode_in_envelope_optional::<
1186                fidl::encoding::Endpoint<
1187                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1188                >,
1189                fidl::encoding::DefaultFuchsiaResourceDialect,
1190            >(
1191                self.device.as_mut().map(
1192                    <fidl::encoding::Endpoint<
1193                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1194                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1195                ),
1196                encoder,
1197                offset + cur_offset,
1198                depth,
1199            )?;
1200
1201            _prev_end_offset = cur_offset + envelope_size;
1202            if 2 > max_ordinal {
1203                return Ok(());
1204            }
1205
1206            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1207            // are envelope_size bytes.
1208            let cur_offset: usize = (2 - 1) * envelope_size;
1209
1210            // Zero reserved fields.
1211            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1212
1213            // Safety:
1214            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1215            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1216            //   envelope_size bytes, there is always sufficient room.
1217            fidl::encoding::encode_in_envelope_optional::<
1218                fidl::encoding::Endpoint<
1219                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>,
1220                >,
1221                fidl::encoding::DefaultFuchsiaResourceDialect,
1222            >(
1223                self.device_extra.as_mut().map(
1224                    <fidl::encoding::Endpoint<
1225                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>,
1226                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1227                ),
1228                encoder,
1229                offset + cur_offset,
1230                depth,
1231            )?;
1232
1233            _prev_end_offset = cur_offset + envelope_size;
1234            if 3 > max_ordinal {
1235                return Ok(());
1236            }
1237
1238            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1239            // are envelope_size bytes.
1240            let cur_offset: usize = (3 - 1) * envelope_size;
1241
1242            // Zero reserved fields.
1243            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1244
1245            // Safety:
1246            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1247            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1248            //   envelope_size bytes, there is always sufficient room.
1249            fidl::encoding::encode_in_envelope_optional::<
1250                fidl::encoding::Endpoint<
1251                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1252                >,
1253                fidl::encoding::DefaultFuchsiaResourceDialect,
1254            >(
1255                self.device_test.as_mut().map(
1256                    <fidl::encoding::Endpoint<
1257                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1258                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1259                ),
1260                encoder,
1261                offset + cur_offset,
1262                depth,
1263            )?;
1264
1265            _prev_end_offset = cur_offset + envelope_size;
1266            if 4 > max_ordinal {
1267                return Ok(());
1268            }
1269
1270            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1271            // are envelope_size bytes.
1272            let cur_offset: usize = (4 - 1) * envelope_size;
1273
1274            // Zero reserved fields.
1275            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1276
1277            // Safety:
1278            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1279            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1280            //   envelope_size bytes, there is always sufficient room.
1281            fidl::encoding::encode_in_envelope_optional::<
1282                fidl::encoding::Endpoint<
1283                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceRouteMarker>,
1284                >,
1285                fidl::encoding::DefaultFuchsiaResourceDialect,
1286            >(
1287                self.device_route.as_mut().map(
1288                    <fidl::encoding::Endpoint<
1289                        fidl::endpoints::ServerEnd<
1290                            fidl_fuchsia_lowpan_experimental::DeviceRouteMarker,
1291                        >,
1292                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1293                ),
1294                encoder,
1295                offset + cur_offset,
1296                depth,
1297            )?;
1298
1299            _prev_end_offset = cur_offset + envelope_size;
1300            if 5 > max_ordinal {
1301                return Ok(());
1302            }
1303
1304            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1305            // are envelope_size bytes.
1306            let cur_offset: usize = (5 - 1) * envelope_size;
1307
1308            // Zero reserved fields.
1309            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1310
1311            // Safety:
1312            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1313            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1314            //   envelope_size bytes, there is always sufficient room.
1315            fidl::encoding::encode_in_envelope_optional::<
1316                fidl::encoding::Endpoint<
1317                    fidl::endpoints::ServerEnd<
1318                        fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
1319                    >,
1320                >,
1321                fidl::encoding::DefaultFuchsiaResourceDialect,
1322            >(
1323                self.device_route_extra.as_mut().map(
1324                    <fidl::encoding::Endpoint<
1325                        fidl::endpoints::ServerEnd<
1326                            fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
1327                        >,
1328                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1329                ),
1330                encoder,
1331                offset + cur_offset,
1332                depth,
1333            )?;
1334
1335            _prev_end_offset = cur_offset + envelope_size;
1336            if 6 > max_ordinal {
1337                return Ok(());
1338            }
1339
1340            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1341            // are envelope_size bytes.
1342            let cur_offset: usize = (6 - 1) * envelope_size;
1343
1344            // Zero reserved fields.
1345            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1346
1347            // Safety:
1348            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1349            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1350            //   envelope_size bytes, there is always sufficient room.
1351            fidl::encoding::encode_in_envelope_optional::<
1352                fidl::encoding::Endpoint<
1353                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
1354                >,
1355                fidl::encoding::DefaultFuchsiaResourceDialect,
1356            >(
1357                self.counters.as_mut().map(
1358                    <fidl::encoding::Endpoint<
1359                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
1360                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1361                ),
1362                encoder,
1363                offset + cur_offset,
1364                depth,
1365            )?;
1366
1367            _prev_end_offset = cur_offset + envelope_size;
1368            if 7 > max_ordinal {
1369                return Ok(());
1370            }
1371
1372            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1373            // are envelope_size bytes.
1374            let cur_offset: usize = (7 - 1) * envelope_size;
1375
1376            // Zero reserved fields.
1377            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1378
1379            // Safety:
1380            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1381            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1382            //   envelope_size bytes, there is always sufficient room.
1383            fidl::encoding::encode_in_envelope_optional::<
1384                fidl::encoding::Endpoint<
1385                    fidl::endpoints::ServerEnd<
1386                        fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
1387                    >,
1388                >,
1389                fidl::encoding::DefaultFuchsiaResourceDialect,
1390            >(
1391                self.thread_legacy_joining.as_mut().map(
1392                    <fidl::encoding::Endpoint<
1393                        fidl::endpoints::ServerEnd<
1394                            fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
1395                        >,
1396                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1397                ),
1398                encoder,
1399                offset + cur_offset,
1400                depth,
1401            )?;
1402
1403            _prev_end_offset = cur_offset + envelope_size;
1404            if 8 > max_ordinal {
1405                return Ok(());
1406            }
1407
1408            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1409            // are envelope_size bytes.
1410            let cur_offset: usize = (8 - 1) * envelope_size;
1411
1412            // Zero reserved fields.
1413            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1414
1415            // Safety:
1416            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1417            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1418            //   envelope_size bytes, there is always sufficient room.
1419            fidl::encoding::encode_in_envelope_optional::<
1420                fidl::encoding::Endpoint<
1421                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
1422                >,
1423                fidl::encoding::DefaultFuchsiaResourceDialect,
1424            >(
1425                self.thread_dataset.as_mut().map(
1426                    <fidl::encoding::Endpoint<
1427                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
1428                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1429                ),
1430                encoder,
1431                offset + cur_offset,
1432                depth,
1433            )?;
1434
1435            _prev_end_offset = cur_offset + envelope_size;
1436            if 9 > max_ordinal {
1437                return Ok(());
1438            }
1439
1440            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1441            // are envelope_size bytes.
1442            let cur_offset: usize = (9 - 1) * envelope_size;
1443
1444            // Zero reserved fields.
1445            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1446
1447            // Safety:
1448            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1449            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1450            //   envelope_size bytes, there is always sufficient room.
1451            fidl::encoding::encode_in_envelope_optional::<
1452                fidl::encoding::Endpoint<
1453                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>,
1454                >,
1455                fidl::encoding::DefaultFuchsiaResourceDialect,
1456            >(
1457                self.energy_scan.as_mut().map(
1458                    <fidl::encoding::Endpoint<
1459                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>,
1460                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1461                ),
1462                encoder,
1463                offset + cur_offset,
1464                depth,
1465            )?;
1466
1467            _prev_end_offset = cur_offset + envelope_size;
1468            if 10 > max_ordinal {
1469                return Ok(());
1470            }
1471
1472            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1473            // are envelope_size bytes.
1474            let cur_offset: usize = (10 - 1) * envelope_size;
1475
1476            // Zero reserved fields.
1477            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1478
1479            // Safety:
1480            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1481            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1482            //   envelope_size bytes, there is always sufficient room.
1483            fidl::encoding::encode_in_envelope_optional::<
1484                fidl::encoding::Endpoint<
1485                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>,
1486                >,
1487                fidl::encoding::DefaultFuchsiaResourceDialect,
1488            >(
1489                self.experimental_device.as_mut().map(
1490                    <fidl::encoding::Endpoint<
1491                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>,
1492                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1493                ),
1494                encoder,
1495                offset + cur_offset,
1496                depth,
1497            )?;
1498
1499            _prev_end_offset = cur_offset + envelope_size;
1500            if 11 > max_ordinal {
1501                return Ok(());
1502            }
1503
1504            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1505            // are envelope_size bytes.
1506            let cur_offset: usize = (11 - 1) * envelope_size;
1507
1508            // Zero reserved fields.
1509            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1510
1511            // Safety:
1512            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1513            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1514            //   envelope_size bytes, there is always sufficient room.
1515            fidl::encoding::encode_in_envelope_optional::<
1516                fidl::encoding::Endpoint<
1517                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceExtraMarker>,
1518                >,
1519                fidl::encoding::DefaultFuchsiaResourceDialect,
1520            >(
1521                self.experimental_device_extra.as_mut().map(
1522                    <fidl::encoding::Endpoint<
1523                        fidl::endpoints::ServerEnd<
1524                            fidl_fuchsia_lowpan_experimental::DeviceExtraMarker,
1525                        >,
1526                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1527                ),
1528                encoder,
1529                offset + cur_offset,
1530                depth,
1531            )?;
1532
1533            _prev_end_offset = cur_offset + envelope_size;
1534            if 12 > max_ordinal {
1535                return Ok(());
1536            }
1537
1538            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1539            // are envelope_size bytes.
1540            let cur_offset: usize = (12 - 1) * envelope_size;
1541
1542            // Zero reserved fields.
1543            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1544
1545            // Safety:
1546            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1547            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1548            //   envelope_size bytes, there is always sufficient room.
1549            fidl::encoding::encode_in_envelope_optional::<
1550                fidl::encoding::Endpoint<
1551                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
1552                >,
1553                fidl::encoding::DefaultFuchsiaResourceDialect,
1554            >(
1555                self.meshcop.as_mut().map(
1556                    <fidl::encoding::Endpoint<
1557                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
1558                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1559                ),
1560                encoder,
1561                offset + cur_offset,
1562                depth,
1563            )?;
1564
1565            _prev_end_offset = cur_offset + envelope_size;
1566            if 13 > max_ordinal {
1567                return Ok(());
1568            }
1569
1570            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1571            // are envelope_size bytes.
1572            let cur_offset: usize = (13 - 1) * envelope_size;
1573
1574            // Zero reserved fields.
1575            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1576
1577            // Safety:
1578            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1579            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1580            //   envelope_size bytes, there is always sufficient room.
1581            fidl::encoding::encode_in_envelope_optional::<
1582                fidl::encoding::Endpoint<
1583                    fidl::endpoints::ServerEnd<
1584                        fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
1585                    >,
1586                >,
1587                fidl::encoding::DefaultFuchsiaResourceDialect,
1588            >(
1589                self.telemetry_provider.as_mut().map(
1590                    <fidl::encoding::Endpoint<
1591                        fidl::endpoints::ServerEnd<
1592                            fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
1593                        >,
1594                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1595                ),
1596                encoder,
1597                offset + cur_offset,
1598                depth,
1599            )?;
1600
1601            _prev_end_offset = cur_offset + envelope_size;
1602            if 14 > max_ordinal {
1603                return Ok(());
1604            }
1605
1606            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1607            // are envelope_size bytes.
1608            let cur_offset: usize = (14 - 1) * envelope_size;
1609
1610            // Zero reserved fields.
1611            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1612
1613            // Safety:
1614            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1615            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1616            //   envelope_size bytes, there is always sufficient room.
1617            fidl::encoding::encode_in_envelope_optional::<
1618                fidl::encoding::Endpoint<
1619                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
1620                >,
1621                fidl::encoding::DefaultFuchsiaResourceDialect,
1622            >(
1623                self.thread_feature.as_mut().map(
1624                    <fidl::encoding::Endpoint<
1625                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
1626                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1627                ),
1628                encoder,
1629                offset + cur_offset,
1630                depth,
1631            )?;
1632
1633            _prev_end_offset = cur_offset + envelope_size;
1634            if 15 > max_ordinal {
1635                return Ok(());
1636            }
1637
1638            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1639            // are envelope_size bytes.
1640            let cur_offset: usize = (15 - 1) * envelope_size;
1641
1642            // Zero reserved fields.
1643            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1644
1645            // Safety:
1646            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1647            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1648            //   envelope_size bytes, there is always sufficient room.
1649            fidl::encoding::encode_in_envelope_optional::<
1650                fidl::encoding::Endpoint<
1651                    fidl::endpoints::ServerEnd<
1652                        fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
1653                    >,
1654                >,
1655                fidl::encoding::DefaultFuchsiaResourceDialect,
1656            >(
1657                self.capabilities.as_mut().map(
1658                    <fidl::encoding::Endpoint<
1659                        fidl::endpoints::ServerEnd<
1660                            fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
1661                        >,
1662                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1663                ),
1664                encoder,
1665                offset + cur_offset,
1666                depth,
1667            )?;
1668
1669            _prev_end_offset = cur_offset + envelope_size;
1670
1671            Ok(())
1672        }
1673    }
1674
1675    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Protocols {
1676        #[inline(always)]
1677        fn new_empty() -> Self {
1678            Self::default()
1679        }
1680
1681        unsafe fn decode(
1682            &mut self,
1683            decoder: &mut fidl::encoding::Decoder<
1684                '_,
1685                fidl::encoding::DefaultFuchsiaResourceDialect,
1686            >,
1687            offset: usize,
1688            mut depth: fidl::encoding::Depth,
1689        ) -> fidl::Result<()> {
1690            decoder.debug_check_bounds::<Self>(offset);
1691            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1692                None => return Err(fidl::Error::NotNullable),
1693                Some(len) => len,
1694            };
1695            // Calling decoder.out_of_line_offset(0) is not allowed.
1696            if len == 0 {
1697                return Ok(());
1698            };
1699            depth.increment()?;
1700            let envelope_size = 8;
1701            let bytes_len = len * envelope_size;
1702            let offset = decoder.out_of_line_offset(bytes_len)?;
1703            // Decode the envelope for each type.
1704            let mut _next_ordinal_to_read = 0;
1705            let mut next_offset = offset;
1706            let end_offset = offset + bytes_len;
1707            _next_ordinal_to_read += 1;
1708            if next_offset >= end_offset {
1709                return Ok(());
1710            }
1711
1712            // Decode unknown envelopes for gaps in ordinals.
1713            while _next_ordinal_to_read < 1 {
1714                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1715                _next_ordinal_to_read += 1;
1716                next_offset += envelope_size;
1717            }
1718
1719            let next_out_of_line = decoder.next_out_of_line();
1720            let handles_before = decoder.remaining_handles();
1721            if let Some((inlined, num_bytes, num_handles)) =
1722                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1723            {
1724                let member_inline_size = <fidl::encoding::Endpoint<
1725                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1726                > as fidl::encoding::TypeMarker>::inline_size(
1727                    decoder.context
1728                );
1729                if inlined != (member_inline_size <= 4) {
1730                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1731                }
1732                let inner_offset;
1733                let mut inner_depth = depth.clone();
1734                if inlined {
1735                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1736                    inner_offset = next_offset;
1737                } else {
1738                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1739                    inner_depth.increment()?;
1740                }
1741                let val_ref = self.device.get_or_insert_with(|| {
1742                    fidl::new_empty!(
1743                        fidl::encoding::Endpoint<
1744                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1745                        >,
1746                        fidl::encoding::DefaultFuchsiaResourceDialect
1747                    )
1748                });
1749                fidl::decode!(
1750                    fidl::encoding::Endpoint<
1751                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceMarker>,
1752                    >,
1753                    fidl::encoding::DefaultFuchsiaResourceDialect,
1754                    val_ref,
1755                    decoder,
1756                    inner_offset,
1757                    inner_depth
1758                )?;
1759                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1760                {
1761                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1762                }
1763                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1764                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1765                }
1766            }
1767
1768            next_offset += envelope_size;
1769            _next_ordinal_to_read += 1;
1770            if next_offset >= end_offset {
1771                return Ok(());
1772            }
1773
1774            // Decode unknown envelopes for gaps in ordinals.
1775            while _next_ordinal_to_read < 2 {
1776                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1777                _next_ordinal_to_read += 1;
1778                next_offset += envelope_size;
1779            }
1780
1781            let next_out_of_line = decoder.next_out_of_line();
1782            let handles_before = decoder.remaining_handles();
1783            if let Some((inlined, num_bytes, num_handles)) =
1784                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1785            {
1786                let member_inline_size = <fidl::encoding::Endpoint<
1787                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>,
1788                > as fidl::encoding::TypeMarker>::inline_size(
1789                    decoder.context
1790                );
1791                if inlined != (member_inline_size <= 4) {
1792                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1793                }
1794                let inner_offset;
1795                let mut inner_depth = depth.clone();
1796                if inlined {
1797                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1798                    inner_offset = next_offset;
1799                } else {
1800                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1801                    inner_depth.increment()?;
1802                }
1803                let val_ref = self.device_extra.get_or_insert_with(|| {
1804                    fidl::new_empty!(
1805                        fidl::encoding::Endpoint<
1806                            fidl::endpoints::ServerEnd<
1807                                fidl_fuchsia_lowpan_device::DeviceExtraMarker,
1808                            >,
1809                        >,
1810                        fidl::encoding::DefaultFuchsiaResourceDialect
1811                    )
1812                });
1813                fidl::decode!(
1814                    fidl::encoding::Endpoint<
1815                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::DeviceExtraMarker>,
1816                    >,
1817                    fidl::encoding::DefaultFuchsiaResourceDialect,
1818                    val_ref,
1819                    decoder,
1820                    inner_offset,
1821                    inner_depth
1822                )?;
1823                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1824                {
1825                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1826                }
1827                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1828                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1829                }
1830            }
1831
1832            next_offset += envelope_size;
1833            _next_ordinal_to_read += 1;
1834            if next_offset >= end_offset {
1835                return Ok(());
1836            }
1837
1838            // Decode unknown envelopes for gaps in ordinals.
1839            while _next_ordinal_to_read < 3 {
1840                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1841                _next_ordinal_to_read += 1;
1842                next_offset += envelope_size;
1843            }
1844
1845            let next_out_of_line = decoder.next_out_of_line();
1846            let handles_before = decoder.remaining_handles();
1847            if let Some((inlined, num_bytes, num_handles)) =
1848                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1849            {
1850                let member_inline_size = <fidl::encoding::Endpoint<
1851                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1852                > as fidl::encoding::TypeMarker>::inline_size(
1853                    decoder.context
1854                );
1855                if inlined != (member_inline_size <= 4) {
1856                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1857                }
1858                let inner_offset;
1859                let mut inner_depth = depth.clone();
1860                if inlined {
1861                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1862                    inner_offset = next_offset;
1863                } else {
1864                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1865                    inner_depth.increment()?;
1866                }
1867                let val_ref = self.device_test.get_or_insert_with(|| {
1868                    fidl::new_empty!(
1869                        fidl::encoding::Endpoint<
1870                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1871                        >,
1872                        fidl::encoding::DefaultFuchsiaResourceDialect
1873                    )
1874                });
1875                fidl::decode!(
1876                    fidl::encoding::Endpoint<
1877                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_test::DeviceTestMarker>,
1878                    >,
1879                    fidl::encoding::DefaultFuchsiaResourceDialect,
1880                    val_ref,
1881                    decoder,
1882                    inner_offset,
1883                    inner_depth
1884                )?;
1885                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1886                {
1887                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1888                }
1889                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1890                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1891                }
1892            }
1893
1894            next_offset += envelope_size;
1895            _next_ordinal_to_read += 1;
1896            if next_offset >= end_offset {
1897                return Ok(());
1898            }
1899
1900            // Decode unknown envelopes for gaps in ordinals.
1901            while _next_ordinal_to_read < 4 {
1902                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1903                _next_ordinal_to_read += 1;
1904                next_offset += envelope_size;
1905            }
1906
1907            let next_out_of_line = decoder.next_out_of_line();
1908            let handles_before = decoder.remaining_handles();
1909            if let Some((inlined, num_bytes, num_handles)) =
1910                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1911            {
1912                let member_inline_size = <fidl::encoding::Endpoint<
1913                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceRouteMarker>,
1914                > as fidl::encoding::TypeMarker>::inline_size(
1915                    decoder.context
1916                );
1917                if inlined != (member_inline_size <= 4) {
1918                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1919                }
1920                let inner_offset;
1921                let mut inner_depth = depth.clone();
1922                if inlined {
1923                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1924                    inner_offset = next_offset;
1925                } else {
1926                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1927                    inner_depth.increment()?;
1928                }
1929                let val_ref = self.device_route.get_or_insert_with(|| {
1930                    fidl::new_empty!(
1931                        fidl::encoding::Endpoint<
1932                            fidl::endpoints::ServerEnd<
1933                                fidl_fuchsia_lowpan_experimental::DeviceRouteMarker,
1934                            >,
1935                        >,
1936                        fidl::encoding::DefaultFuchsiaResourceDialect
1937                    )
1938                });
1939                fidl::decode!(
1940                    fidl::encoding::Endpoint<
1941                        fidl::endpoints::ServerEnd<
1942                            fidl_fuchsia_lowpan_experimental::DeviceRouteMarker,
1943                        >,
1944                    >,
1945                    fidl::encoding::DefaultFuchsiaResourceDialect,
1946                    val_ref,
1947                    decoder,
1948                    inner_offset,
1949                    inner_depth
1950                )?;
1951                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1952                {
1953                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1954                }
1955                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1956                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1957                }
1958            }
1959
1960            next_offset += envelope_size;
1961            _next_ordinal_to_read += 1;
1962            if next_offset >= end_offset {
1963                return Ok(());
1964            }
1965
1966            // Decode unknown envelopes for gaps in ordinals.
1967            while _next_ordinal_to_read < 5 {
1968                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1969                _next_ordinal_to_read += 1;
1970                next_offset += envelope_size;
1971            }
1972
1973            let next_out_of_line = decoder.next_out_of_line();
1974            let handles_before = decoder.remaining_handles();
1975            if let Some((inlined, num_bytes, num_handles)) =
1976                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1977            {
1978                let member_inline_size = <fidl::encoding::Endpoint<
1979                    fidl::endpoints::ServerEnd<
1980                        fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
1981                    >,
1982                > as fidl::encoding::TypeMarker>::inline_size(
1983                    decoder.context
1984                );
1985                if inlined != (member_inline_size <= 4) {
1986                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1987                }
1988                let inner_offset;
1989                let mut inner_depth = depth.clone();
1990                if inlined {
1991                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1992                    inner_offset = next_offset;
1993                } else {
1994                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1995                    inner_depth.increment()?;
1996                }
1997                let val_ref = self.device_route_extra.get_or_insert_with(|| {
1998                    fidl::new_empty!(
1999                        fidl::encoding::Endpoint<
2000                            fidl::endpoints::ServerEnd<
2001                                fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
2002                            >,
2003                        >,
2004                        fidl::encoding::DefaultFuchsiaResourceDialect
2005                    )
2006                });
2007                fidl::decode!(
2008                    fidl::encoding::Endpoint<
2009                        fidl::endpoints::ServerEnd<
2010                            fidl_fuchsia_lowpan_experimental::DeviceRouteExtraMarker,
2011                        >,
2012                    >,
2013                    fidl::encoding::DefaultFuchsiaResourceDialect,
2014                    val_ref,
2015                    decoder,
2016                    inner_offset,
2017                    inner_depth
2018                )?;
2019                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2020                {
2021                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2022                }
2023                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2024                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2025                }
2026            }
2027
2028            next_offset += envelope_size;
2029            _next_ordinal_to_read += 1;
2030            if next_offset >= end_offset {
2031                return Ok(());
2032            }
2033
2034            // Decode unknown envelopes for gaps in ordinals.
2035            while _next_ordinal_to_read < 6 {
2036                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2037                _next_ordinal_to_read += 1;
2038                next_offset += envelope_size;
2039            }
2040
2041            let next_out_of_line = decoder.next_out_of_line();
2042            let handles_before = decoder.remaining_handles();
2043            if let Some((inlined, num_bytes, num_handles)) =
2044                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2045            {
2046                let member_inline_size = <fidl::encoding::Endpoint<
2047                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
2048                > as fidl::encoding::TypeMarker>::inline_size(
2049                    decoder.context
2050                );
2051                if inlined != (member_inline_size <= 4) {
2052                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2053                }
2054                let inner_offset;
2055                let mut inner_depth = depth.clone();
2056                if inlined {
2057                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2058                    inner_offset = next_offset;
2059                } else {
2060                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2061                    inner_depth.increment()?;
2062                }
2063                let val_ref = self.counters.get_or_insert_with(|| {
2064                    fidl::new_empty!(
2065                        fidl::encoding::Endpoint<
2066                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
2067                        >,
2068                        fidl::encoding::DefaultFuchsiaResourceDialect
2069                    )
2070                });
2071                fidl::decode!(
2072                    fidl::encoding::Endpoint<
2073                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::CountersMarker>,
2074                    >,
2075                    fidl::encoding::DefaultFuchsiaResourceDialect,
2076                    val_ref,
2077                    decoder,
2078                    inner_offset,
2079                    inner_depth
2080                )?;
2081                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2082                {
2083                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2084                }
2085                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2086                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2087                }
2088            }
2089
2090            next_offset += envelope_size;
2091            _next_ordinal_to_read += 1;
2092            if next_offset >= end_offset {
2093                return Ok(());
2094            }
2095
2096            // Decode unknown envelopes for gaps in ordinals.
2097            while _next_ordinal_to_read < 7 {
2098                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2099                _next_ordinal_to_read += 1;
2100                next_offset += envelope_size;
2101            }
2102
2103            let next_out_of_line = decoder.next_out_of_line();
2104            let handles_before = decoder.remaining_handles();
2105            if let Some((inlined, num_bytes, num_handles)) =
2106                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2107            {
2108                let member_inline_size = <fidl::encoding::Endpoint<
2109                    fidl::endpoints::ServerEnd<
2110                        fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
2111                    >,
2112                > as fidl::encoding::TypeMarker>::inline_size(
2113                    decoder.context
2114                );
2115                if inlined != (member_inline_size <= 4) {
2116                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2117                }
2118                let inner_offset;
2119                let mut inner_depth = depth.clone();
2120                if inlined {
2121                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2122                    inner_offset = next_offset;
2123                } else {
2124                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2125                    inner_depth.increment()?;
2126                }
2127                let val_ref = self.thread_legacy_joining.get_or_insert_with(|| {
2128                    fidl::new_empty!(
2129                        fidl::encoding::Endpoint<
2130                            fidl::endpoints::ServerEnd<
2131                                fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
2132                            >,
2133                        >,
2134                        fidl::encoding::DefaultFuchsiaResourceDialect
2135                    )
2136                });
2137                fidl::decode!(
2138                    fidl::encoding::Endpoint<
2139                        fidl::endpoints::ServerEnd<
2140                            fidl_fuchsia_lowpan_experimental::LegacyJoiningMarker,
2141                        >,
2142                    >,
2143                    fidl::encoding::DefaultFuchsiaResourceDialect,
2144                    val_ref,
2145                    decoder,
2146                    inner_offset,
2147                    inner_depth
2148                )?;
2149                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2150                {
2151                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2152                }
2153                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2154                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2155                }
2156            }
2157
2158            next_offset += envelope_size;
2159            _next_ordinal_to_read += 1;
2160            if next_offset >= end_offset {
2161                return Ok(());
2162            }
2163
2164            // Decode unknown envelopes for gaps in ordinals.
2165            while _next_ordinal_to_read < 8 {
2166                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2167                _next_ordinal_to_read += 1;
2168                next_offset += envelope_size;
2169            }
2170
2171            let next_out_of_line = decoder.next_out_of_line();
2172            let handles_before = decoder.remaining_handles();
2173            if let Some((inlined, num_bytes, num_handles)) =
2174                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2175            {
2176                let member_inline_size = <fidl::encoding::Endpoint<
2177                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
2178                > as fidl::encoding::TypeMarker>::inline_size(
2179                    decoder.context
2180                );
2181                if inlined != (member_inline_size <= 4) {
2182                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2183                }
2184                let inner_offset;
2185                let mut inner_depth = depth.clone();
2186                if inlined {
2187                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2188                    inner_offset = next_offset;
2189                } else {
2190                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2191                    inner_depth.increment()?;
2192                }
2193                let val_ref = self.thread_dataset.get_or_insert_with(|| {
2194                    fidl::new_empty!(
2195                        fidl::encoding::Endpoint<
2196                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
2197                        >,
2198                        fidl::encoding::DefaultFuchsiaResourceDialect
2199                    )
2200                });
2201                fidl::decode!(
2202                    fidl::encoding::Endpoint<
2203                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::DatasetMarker>,
2204                    >,
2205                    fidl::encoding::DefaultFuchsiaResourceDialect,
2206                    val_ref,
2207                    decoder,
2208                    inner_offset,
2209                    inner_depth
2210                )?;
2211                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2212                {
2213                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2214                }
2215                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2216                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2217                }
2218            }
2219
2220            next_offset += envelope_size;
2221            _next_ordinal_to_read += 1;
2222            if next_offset >= end_offset {
2223                return Ok(());
2224            }
2225
2226            // Decode unknown envelopes for gaps in ordinals.
2227            while _next_ordinal_to_read < 9 {
2228                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2229                _next_ordinal_to_read += 1;
2230                next_offset += envelope_size;
2231            }
2232
2233            let next_out_of_line = decoder.next_out_of_line();
2234            let handles_before = decoder.remaining_handles();
2235            if let Some((inlined, num_bytes, num_handles)) =
2236                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2237            {
2238                let member_inline_size = <fidl::encoding::Endpoint<
2239                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>,
2240                > as fidl::encoding::TypeMarker>::inline_size(
2241                    decoder.context
2242                );
2243                if inlined != (member_inline_size <= 4) {
2244                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2245                }
2246                let inner_offset;
2247                let mut inner_depth = depth.clone();
2248                if inlined {
2249                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2250                    inner_offset = next_offset;
2251                } else {
2252                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2253                    inner_depth.increment()?;
2254                }
2255                let val_ref = self.energy_scan.get_or_insert_with(|| {
2256                    fidl::new_empty!(
2257                        fidl::encoding::Endpoint<
2258                            fidl::endpoints::ServerEnd<
2259                                fidl_fuchsia_lowpan_device::EnergyScanMarker,
2260                            >,
2261                        >,
2262                        fidl::encoding::DefaultFuchsiaResourceDialect
2263                    )
2264                });
2265                fidl::decode!(
2266                    fidl::encoding::Endpoint<
2267                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_device::EnergyScanMarker>,
2268                    >,
2269                    fidl::encoding::DefaultFuchsiaResourceDialect,
2270                    val_ref,
2271                    decoder,
2272                    inner_offset,
2273                    inner_depth
2274                )?;
2275                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2276                {
2277                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2278                }
2279                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2280                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2281                }
2282            }
2283
2284            next_offset += envelope_size;
2285            _next_ordinal_to_read += 1;
2286            if next_offset >= end_offset {
2287                return Ok(());
2288            }
2289
2290            // Decode unknown envelopes for gaps in ordinals.
2291            while _next_ordinal_to_read < 10 {
2292                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2293                _next_ordinal_to_read += 1;
2294                next_offset += envelope_size;
2295            }
2296
2297            let next_out_of_line = decoder.next_out_of_line();
2298            let handles_before = decoder.remaining_handles();
2299            if let Some((inlined, num_bytes, num_handles)) =
2300                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2301            {
2302                let member_inline_size = <fidl::encoding::Endpoint<
2303                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>,
2304                > as fidl::encoding::TypeMarker>::inline_size(
2305                    decoder.context
2306                );
2307                if inlined != (member_inline_size <= 4) {
2308                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2309                }
2310                let inner_offset;
2311                let mut inner_depth = depth.clone();
2312                if inlined {
2313                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2314                    inner_offset = next_offset;
2315                } else {
2316                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2317                    inner_depth.increment()?;
2318                }
2319                let val_ref = self.experimental_device.get_or_insert_with(|| {
2320                    fidl::new_empty!(
2321                        fidl::encoding::Endpoint<
2322                            fidl::endpoints::ServerEnd<
2323                                fidl_fuchsia_lowpan_experimental::DeviceMarker,
2324                            >,
2325                        >,
2326                        fidl::encoding::DefaultFuchsiaResourceDialect
2327                    )
2328                });
2329                fidl::decode!(
2330                    fidl::encoding::Endpoint<
2331                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceMarker>,
2332                    >,
2333                    fidl::encoding::DefaultFuchsiaResourceDialect,
2334                    val_ref,
2335                    decoder,
2336                    inner_offset,
2337                    inner_depth
2338                )?;
2339                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2340                {
2341                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2342                }
2343                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2344                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2345                }
2346            }
2347
2348            next_offset += envelope_size;
2349            _next_ordinal_to_read += 1;
2350            if next_offset >= end_offset {
2351                return Ok(());
2352            }
2353
2354            // Decode unknown envelopes for gaps in ordinals.
2355            while _next_ordinal_to_read < 11 {
2356                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2357                _next_ordinal_to_read += 1;
2358                next_offset += envelope_size;
2359            }
2360
2361            let next_out_of_line = decoder.next_out_of_line();
2362            let handles_before = decoder.remaining_handles();
2363            if let Some((inlined, num_bytes, num_handles)) =
2364                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2365            {
2366                let member_inline_size = <fidl::encoding::Endpoint<
2367                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_experimental::DeviceExtraMarker>,
2368                > as fidl::encoding::TypeMarker>::inline_size(
2369                    decoder.context
2370                );
2371                if inlined != (member_inline_size <= 4) {
2372                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2373                }
2374                let inner_offset;
2375                let mut inner_depth = depth.clone();
2376                if inlined {
2377                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2378                    inner_offset = next_offset;
2379                } else {
2380                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2381                    inner_depth.increment()?;
2382                }
2383                let val_ref = self.experimental_device_extra.get_or_insert_with(|| {
2384                    fidl::new_empty!(
2385                        fidl::encoding::Endpoint<
2386                            fidl::endpoints::ServerEnd<
2387                                fidl_fuchsia_lowpan_experimental::DeviceExtraMarker,
2388                            >,
2389                        >,
2390                        fidl::encoding::DefaultFuchsiaResourceDialect
2391                    )
2392                });
2393                fidl::decode!(
2394                    fidl::encoding::Endpoint<
2395                        fidl::endpoints::ServerEnd<
2396                            fidl_fuchsia_lowpan_experimental::DeviceExtraMarker,
2397                        >,
2398                    >,
2399                    fidl::encoding::DefaultFuchsiaResourceDialect,
2400                    val_ref,
2401                    decoder,
2402                    inner_offset,
2403                    inner_depth
2404                )?;
2405                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2406                {
2407                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2408                }
2409                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2410                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2411                }
2412            }
2413
2414            next_offset += envelope_size;
2415            _next_ordinal_to_read += 1;
2416            if next_offset >= end_offset {
2417                return Ok(());
2418            }
2419
2420            // Decode unknown envelopes for gaps in ordinals.
2421            while _next_ordinal_to_read < 12 {
2422                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2423                _next_ordinal_to_read += 1;
2424                next_offset += envelope_size;
2425            }
2426
2427            let next_out_of_line = decoder.next_out_of_line();
2428            let handles_before = decoder.remaining_handles();
2429            if let Some((inlined, num_bytes, num_handles)) =
2430                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2431            {
2432                let member_inline_size = <fidl::encoding::Endpoint<
2433                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
2434                > as fidl::encoding::TypeMarker>::inline_size(
2435                    decoder.context
2436                );
2437                if inlined != (member_inline_size <= 4) {
2438                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2439                }
2440                let inner_offset;
2441                let mut inner_depth = depth.clone();
2442                if inlined {
2443                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2444                    inner_offset = next_offset;
2445                } else {
2446                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2447                    inner_depth.increment()?;
2448                }
2449                let val_ref = self.meshcop.get_or_insert_with(|| {
2450                    fidl::new_empty!(
2451                        fidl::encoding::Endpoint<
2452                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
2453                        >,
2454                        fidl::encoding::DefaultFuchsiaResourceDialect
2455                    )
2456                });
2457                fidl::decode!(
2458                    fidl::encoding::Endpoint<
2459                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::MeshcopMarker>,
2460                    >,
2461                    fidl::encoding::DefaultFuchsiaResourceDialect,
2462                    val_ref,
2463                    decoder,
2464                    inner_offset,
2465                    inner_depth
2466                )?;
2467                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2468                {
2469                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2470                }
2471                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2472                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2473                }
2474            }
2475
2476            next_offset += envelope_size;
2477            _next_ordinal_to_read += 1;
2478            if next_offset >= end_offset {
2479                return Ok(());
2480            }
2481
2482            // Decode unknown envelopes for gaps in ordinals.
2483            while _next_ordinal_to_read < 13 {
2484                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2485                _next_ordinal_to_read += 1;
2486                next_offset += envelope_size;
2487            }
2488
2489            let next_out_of_line = decoder.next_out_of_line();
2490            let handles_before = decoder.remaining_handles();
2491            if let Some((inlined, num_bytes, num_handles)) =
2492                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2493            {
2494                let member_inline_size = <fidl::encoding::Endpoint<
2495                    fidl::endpoints::ServerEnd<
2496                        fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
2497                    >,
2498                > as fidl::encoding::TypeMarker>::inline_size(
2499                    decoder.context
2500                );
2501                if inlined != (member_inline_size <= 4) {
2502                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2503                }
2504                let inner_offset;
2505                let mut inner_depth = depth.clone();
2506                if inlined {
2507                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2508                    inner_offset = next_offset;
2509                } else {
2510                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2511                    inner_depth.increment()?;
2512                }
2513                let val_ref = self.telemetry_provider.get_or_insert_with(|| {
2514                    fidl::new_empty!(
2515                        fidl::encoding::Endpoint<
2516                            fidl::endpoints::ServerEnd<
2517                                fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
2518                            >,
2519                        >,
2520                        fidl::encoding::DefaultFuchsiaResourceDialect
2521                    )
2522                });
2523                fidl::decode!(
2524                    fidl::encoding::Endpoint<
2525                        fidl::endpoints::ServerEnd<
2526                            fidl_fuchsia_lowpan_experimental::TelemetryProviderMarker,
2527                        >,
2528                    >,
2529                    fidl::encoding::DefaultFuchsiaResourceDialect,
2530                    val_ref,
2531                    decoder,
2532                    inner_offset,
2533                    inner_depth
2534                )?;
2535                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2536                {
2537                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2538                }
2539                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2540                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2541                }
2542            }
2543
2544            next_offset += envelope_size;
2545            _next_ordinal_to_read += 1;
2546            if next_offset >= end_offset {
2547                return Ok(());
2548            }
2549
2550            // Decode unknown envelopes for gaps in ordinals.
2551            while _next_ordinal_to_read < 14 {
2552                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2553                _next_ordinal_to_read += 1;
2554                next_offset += envelope_size;
2555            }
2556
2557            let next_out_of_line = decoder.next_out_of_line();
2558            let handles_before = decoder.remaining_handles();
2559            if let Some((inlined, num_bytes, num_handles)) =
2560                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2561            {
2562                let member_inline_size = <fidl::encoding::Endpoint<
2563                    fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
2564                > as fidl::encoding::TypeMarker>::inline_size(
2565                    decoder.context
2566                );
2567                if inlined != (member_inline_size <= 4) {
2568                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2569                }
2570                let inner_offset;
2571                let mut inner_depth = depth.clone();
2572                if inlined {
2573                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2574                    inner_offset = next_offset;
2575                } else {
2576                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2577                    inner_depth.increment()?;
2578                }
2579                let val_ref = self.thread_feature.get_or_insert_with(|| {
2580                    fidl::new_empty!(
2581                        fidl::encoding::Endpoint<
2582                            fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
2583                        >,
2584                        fidl::encoding::DefaultFuchsiaResourceDialect
2585                    )
2586                });
2587                fidl::decode!(
2588                    fidl::encoding::Endpoint<
2589                        fidl::endpoints::ServerEnd<fidl_fuchsia_lowpan_thread::FeatureMarker>,
2590                    >,
2591                    fidl::encoding::DefaultFuchsiaResourceDialect,
2592                    val_ref,
2593                    decoder,
2594                    inner_offset,
2595                    inner_depth
2596                )?;
2597                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2598                {
2599                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2600                }
2601                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2602                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2603                }
2604            }
2605
2606            next_offset += envelope_size;
2607            _next_ordinal_to_read += 1;
2608            if next_offset >= end_offset {
2609                return Ok(());
2610            }
2611
2612            // Decode unknown envelopes for gaps in ordinals.
2613            while _next_ordinal_to_read < 15 {
2614                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2615                _next_ordinal_to_read += 1;
2616                next_offset += envelope_size;
2617            }
2618
2619            let next_out_of_line = decoder.next_out_of_line();
2620            let handles_before = decoder.remaining_handles();
2621            if let Some((inlined, num_bytes, num_handles)) =
2622                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2623            {
2624                let member_inline_size = <fidl::encoding::Endpoint<
2625                    fidl::endpoints::ServerEnd<
2626                        fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
2627                    >,
2628                > as fidl::encoding::TypeMarker>::inline_size(
2629                    decoder.context
2630                );
2631                if inlined != (member_inline_size <= 4) {
2632                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2633                }
2634                let inner_offset;
2635                let mut inner_depth = depth.clone();
2636                if inlined {
2637                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2638                    inner_offset = next_offset;
2639                } else {
2640                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2641                    inner_depth.increment()?;
2642                }
2643                let val_ref = self.capabilities.get_or_insert_with(|| {
2644                    fidl::new_empty!(
2645                        fidl::encoding::Endpoint<
2646                            fidl::endpoints::ServerEnd<
2647                                fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
2648                            >,
2649                        >,
2650                        fidl::encoding::DefaultFuchsiaResourceDialect
2651                    )
2652                });
2653                fidl::decode!(
2654                    fidl::encoding::Endpoint<
2655                        fidl::endpoints::ServerEnd<
2656                            fidl_fuchsia_lowpan_thread::ThreadCapabilitiesMarker,
2657                        >,
2658                    >,
2659                    fidl::encoding::DefaultFuchsiaResourceDialect,
2660                    val_ref,
2661                    decoder,
2662                    inner_offset,
2663                    inner_depth
2664                )?;
2665                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2666                {
2667                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2668                }
2669                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2670                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2671                }
2672            }
2673
2674            next_offset += envelope_size;
2675
2676            // Decode the remaining unknown envelopes.
2677            while next_offset < end_offset {
2678                _next_ordinal_to_read += 1;
2679                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2680                next_offset += envelope_size;
2681            }
2682
2683            Ok(())
2684        }
2685    }
2686}