fidl_fuchsia_lowpan_driver/
fidl_fuchsia_lowpan_driver.rs

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