fidl_fuchsia_bluetooth_snoop__common/
fidl_fuchsia_bluetooth_snoop__common.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::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
8use futures::future::{self, MaybeDone, TryFutureExt};
9use zx_status;
10
11/// HCI packet format
12/// Defined by the Core Specification (v5.4: Vol 4, Part E, Sec 5.4)
13#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
14pub enum PacketFormat {
15    /// Command sent to the controller from the host.
16    Command,
17    /// Exchange of data between host and controller.
18    AclData,
19    /// Exchange of synchronous data (SCO or eSCO) betweeen host and controller.
20    SynchronousData,
21    /// Used by the controller to notify the host when events occur.
22    Event,
23    /// Used to exchange isochronous data between the host and controller.
24    IsoData,
25    #[doc(hidden)]
26    __SourceBreaking { unknown_ordinal: u32 },
27}
28
29/// Pattern that matches an unknown `PacketFormat` member.
30#[macro_export]
31macro_rules! PacketFormatUnknown {
32    () => {
33        _
34    };
35}
36
37impl PacketFormat {
38    #[inline]
39    pub fn from_primitive(prim: u32) -> Option<Self> {
40        match prim {
41            1 => Some(Self::Command),
42            2 => Some(Self::AclData),
43            3 => Some(Self::SynchronousData),
44            4 => Some(Self::Event),
45            5 => Some(Self::IsoData),
46            _ => None,
47        }
48    }
49
50    #[inline]
51    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
52        match prim {
53            1 => Self::Command,
54            2 => Self::AclData,
55            3 => Self::SynchronousData,
56            4 => Self::Event,
57            5 => Self::IsoData,
58            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
59        }
60    }
61
62    #[inline]
63    pub fn unknown() -> Self {
64        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
65    }
66
67    #[inline]
68    pub const fn into_primitive(self) -> u32 {
69        match self {
70            Self::Command => 1,
71            Self::AclData => 2,
72            Self::SynchronousData => 3,
73            Self::Event => 4,
74            Self::IsoData => 5,
75            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
76        }
77    }
78
79    #[inline]
80    pub fn is_unknown(&self) -> bool {
81        match self {
82            Self::__SourceBreaking { unknown_ordinal: _ } => true,
83            _ => false,
84        }
85    }
86}
87
88#[derive(Clone, Debug, Default, PartialEq)]
89pub struct DevicePackets {
90    /// The device these packets were observed from.
91    /// Always provided.
92    pub host_device: Option<String>,
93    /// Set of packets that were observed.
94    /// Always provided.
95    pub packets: Option<Vec<SnoopPacket>>,
96    #[doc(hidden)]
97    pub __source_breaking: fidl::marker::SourceBreaking,
98}
99
100impl fidl::Persistable for DevicePackets {}
101
102#[derive(Clone, Debug, Default, PartialEq)]
103pub struct SnoopPacket {
104    /// true if this packet is sent from the controller to the host.
105    /// Always present.
106    pub is_received: Option<bool>,
107    /// Packet format, determined by the transport.
108    /// Always present.
109    pub format: Option<PacketFormat>,
110    /// Timestamp that the snoop service received the packet from a transport
111    /// as measured by the host system, in system monotonic time.
112    pub timestamp: Option<i64>,
113    /// Length of the packet. This may differ from the length of `data`
114    /// as payloads can be truncated for storage reasons.
115    pub length: Option<u32>,
116    /// Packet data. This may be truncated, but if non-empty contains the packet
117    /// data starting from the beginning.
118    pub data: Option<Vec<u8>>,
119    #[doc(hidden)]
120    pub __source_breaking: fidl::marker::SourceBreaking,
121}
122
123impl fidl::Persistable for SnoopPacket {}
124
125#[derive(Clone, Debug, Default, PartialEq)]
126pub struct UnrecognizedDeviceName {
127    #[doc(hidden)]
128    pub __source_breaking: fidl::marker::SourceBreaking,
129}
130
131impl fidl::Persistable for UnrecognizedDeviceName {}
132
133#[derive(Clone, Debug)]
134pub enum CaptureError {
135    /// Unrecognized device name
136    UnrecognizedDeviceName(UnrecognizedDeviceName),
137    #[doc(hidden)]
138    __SourceBreaking { unknown_ordinal: u64 },
139}
140
141/// Pattern that matches an unknown `CaptureError` member.
142#[macro_export]
143macro_rules! CaptureErrorUnknown {
144    () => {
145        _
146    };
147}
148
149// Custom PartialEq so that unknown variants are not equal to themselves.
150impl PartialEq for CaptureError {
151    fn eq(&self, other: &Self) -> bool {
152        match (self, other) {
153            (Self::UnrecognizedDeviceName(x), Self::UnrecognizedDeviceName(y)) => *x == *y,
154            _ => false,
155        }
156    }
157}
158
159impl CaptureError {
160    #[inline]
161    pub fn ordinal(&self) -> u64 {
162        match *self {
163            Self::UnrecognizedDeviceName(_) => 1,
164            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
165        }
166    }
167
168    #[inline]
169    pub fn unknown_variant_for_testing() -> Self {
170        Self::__SourceBreaking { unknown_ordinal: 0 }
171    }
172
173    #[inline]
174    pub fn is_unknown(&self) -> bool {
175        match self {
176            Self::__SourceBreaking { .. } => true,
177            _ => false,
178        }
179    }
180}
181
182impl fidl::Persistable for CaptureError {}
183
184pub mod packet_observer_ordinals {
185    pub const OBSERVE: u64 = 0x2a82a5a9a18b79c9;
186    pub const ERROR: u64 = 0x6596e43f4f0761e4;
187}
188
189pub mod snoop_ordinals {
190    pub const START: u64 = 0xa520491a4a82f24;
191}
192
193mod internal {
194    use super::*;
195    unsafe impl fidl::encoding::TypeMarker for PacketFormat {
196        type Owned = Self;
197
198        #[inline(always)]
199        fn inline_align(_context: fidl::encoding::Context) -> usize {
200            std::mem::align_of::<u32>()
201        }
202
203        #[inline(always)]
204        fn inline_size(_context: fidl::encoding::Context) -> usize {
205            std::mem::size_of::<u32>()
206        }
207
208        #[inline(always)]
209        fn encode_is_copy() -> bool {
210            false
211        }
212
213        #[inline(always)]
214        fn decode_is_copy() -> bool {
215            false
216        }
217    }
218
219    impl fidl::encoding::ValueTypeMarker for PacketFormat {
220        type Borrowed<'a> = Self;
221        #[inline(always)]
222        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
223            *value
224        }
225    }
226
227    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for PacketFormat {
228        #[inline]
229        unsafe fn encode(
230            self,
231            encoder: &mut fidl::encoding::Encoder<'_, D>,
232            offset: usize,
233            _depth: fidl::encoding::Depth,
234        ) -> fidl::Result<()> {
235            encoder.debug_check_bounds::<Self>(offset);
236            encoder.write_num(self.into_primitive(), offset);
237            Ok(())
238        }
239    }
240
241    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PacketFormat {
242        #[inline(always)]
243        fn new_empty() -> Self {
244            Self::unknown()
245        }
246
247        #[inline]
248        unsafe fn decode(
249            &mut self,
250            decoder: &mut fidl::encoding::Decoder<'_, D>,
251            offset: usize,
252            _depth: fidl::encoding::Depth,
253        ) -> fidl::Result<()> {
254            decoder.debug_check_bounds::<Self>(offset);
255            let prim = decoder.read_num::<u32>(offset);
256
257            *self = Self::from_primitive_allow_unknown(prim);
258            Ok(())
259        }
260    }
261
262    impl DevicePackets {
263        #[inline(always)]
264        fn max_ordinal_present(&self) -> u64 {
265            if let Some(_) = self.packets {
266                return 2;
267            }
268            if let Some(_) = self.host_device {
269                return 1;
270            }
271            0
272        }
273    }
274
275    impl fidl::encoding::ValueTypeMarker for DevicePackets {
276        type Borrowed<'a> = &'a Self;
277        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
278            value
279        }
280    }
281
282    unsafe impl fidl::encoding::TypeMarker for DevicePackets {
283        type Owned = Self;
284
285        #[inline(always)]
286        fn inline_align(_context: fidl::encoding::Context) -> usize {
287            8
288        }
289
290        #[inline(always)]
291        fn inline_size(_context: fidl::encoding::Context) -> usize {
292            16
293        }
294    }
295
296    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DevicePackets, D>
297        for &DevicePackets
298    {
299        unsafe fn encode(
300            self,
301            encoder: &mut fidl::encoding::Encoder<'_, D>,
302            offset: usize,
303            mut depth: fidl::encoding::Depth,
304        ) -> fidl::Result<()> {
305            encoder.debug_check_bounds::<DevicePackets>(offset);
306            // Vector header
307            let max_ordinal: u64 = self.max_ordinal_present();
308            encoder.write_num(max_ordinal, offset);
309            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
310            // Calling encoder.out_of_line_offset(0) is not allowed.
311            if max_ordinal == 0 {
312                return Ok(());
313            }
314            depth.increment()?;
315            let envelope_size = 8;
316            let bytes_len = max_ordinal as usize * envelope_size;
317            #[allow(unused_variables)]
318            let offset = encoder.out_of_line_offset(bytes_len);
319            let mut _prev_end_offset: usize = 0;
320            if 1 > max_ordinal {
321                return Ok(());
322            }
323
324            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
325            // are envelope_size bytes.
326            let cur_offset: usize = (1 - 1) * envelope_size;
327
328            // Zero reserved fields.
329            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
330
331            // Safety:
332            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
333            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
334            //   envelope_size bytes, there is always sufficient room.
335            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<255>, D>(
336                self.host_device.as_ref().map(
337                    <fidl::encoding::BoundedString<255> as fidl::encoding::ValueTypeMarker>::borrow,
338                ),
339                encoder,
340                offset + cur_offset,
341                depth,
342            )?;
343
344            _prev_end_offset = cur_offset + envelope_size;
345            if 2 > max_ordinal {
346                return Ok(());
347            }
348
349            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
350            // are envelope_size bytes.
351            let cur_offset: usize = (2 - 1) * envelope_size;
352
353            // Zero reserved fields.
354            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
355
356            // Safety:
357            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
358            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
359            //   envelope_size bytes, there is always sufficient room.
360            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<SnoopPacket>, D>(
361            self.packets.as_ref().map(<fidl::encoding::UnboundedVector<SnoopPacket> as fidl::encoding::ValueTypeMarker>::borrow),
362            encoder, offset + cur_offset, depth
363        )?;
364
365            _prev_end_offset = cur_offset + envelope_size;
366
367            Ok(())
368        }
369    }
370
371    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DevicePackets {
372        #[inline(always)]
373        fn new_empty() -> Self {
374            Self::default()
375        }
376
377        unsafe fn decode(
378            &mut self,
379            decoder: &mut fidl::encoding::Decoder<'_, D>,
380            offset: usize,
381            mut depth: fidl::encoding::Depth,
382        ) -> fidl::Result<()> {
383            decoder.debug_check_bounds::<Self>(offset);
384            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
385                None => return Err(fidl::Error::NotNullable),
386                Some(len) => len,
387            };
388            // Calling decoder.out_of_line_offset(0) is not allowed.
389            if len == 0 {
390                return Ok(());
391            };
392            depth.increment()?;
393            let envelope_size = 8;
394            let bytes_len = len * envelope_size;
395            let offset = decoder.out_of_line_offset(bytes_len)?;
396            // Decode the envelope for each type.
397            let mut _next_ordinal_to_read = 0;
398            let mut next_offset = offset;
399            let end_offset = offset + bytes_len;
400            _next_ordinal_to_read += 1;
401            if next_offset >= end_offset {
402                return Ok(());
403            }
404
405            // Decode unknown envelopes for gaps in ordinals.
406            while _next_ordinal_to_read < 1 {
407                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
408                _next_ordinal_to_read += 1;
409                next_offset += envelope_size;
410            }
411
412            let next_out_of_line = decoder.next_out_of_line();
413            let handles_before = decoder.remaining_handles();
414            if let Some((inlined, num_bytes, num_handles)) =
415                fidl::encoding::decode_envelope_header(decoder, next_offset)?
416            {
417                let member_inline_size =
418                    <fidl::encoding::BoundedString<255> as fidl::encoding::TypeMarker>::inline_size(
419                        decoder.context,
420                    );
421                if inlined != (member_inline_size <= 4) {
422                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
423                }
424                let inner_offset;
425                let mut inner_depth = depth.clone();
426                if inlined {
427                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
428                    inner_offset = next_offset;
429                } else {
430                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
431                    inner_depth.increment()?;
432                }
433                let val_ref = self
434                    .host_device
435                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<255>, D));
436                fidl::decode!(
437                    fidl::encoding::BoundedString<255>,
438                    D,
439                    val_ref,
440                    decoder,
441                    inner_offset,
442                    inner_depth
443                )?;
444                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
445                {
446                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
447                }
448                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
449                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
450                }
451            }
452
453            next_offset += envelope_size;
454            _next_ordinal_to_read += 1;
455            if next_offset >= end_offset {
456                return Ok(());
457            }
458
459            // Decode unknown envelopes for gaps in ordinals.
460            while _next_ordinal_to_read < 2 {
461                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
462                _next_ordinal_to_read += 1;
463                next_offset += envelope_size;
464            }
465
466            let next_out_of_line = decoder.next_out_of_line();
467            let handles_before = decoder.remaining_handles();
468            if let Some((inlined, num_bytes, num_handles)) =
469                fidl::encoding::decode_envelope_header(decoder, next_offset)?
470            {
471                let member_inline_size = <fidl::encoding::UnboundedVector<SnoopPacket> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
472                if inlined != (member_inline_size <= 4) {
473                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
474                }
475                let inner_offset;
476                let mut inner_depth = depth.clone();
477                if inlined {
478                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
479                    inner_offset = next_offset;
480                } else {
481                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
482                    inner_depth.increment()?;
483                }
484                let val_ref = self.packets.get_or_insert_with(|| {
485                    fidl::new_empty!(fidl::encoding::UnboundedVector<SnoopPacket>, D)
486                });
487                fidl::decode!(
488                    fidl::encoding::UnboundedVector<SnoopPacket>,
489                    D,
490                    val_ref,
491                    decoder,
492                    inner_offset,
493                    inner_depth
494                )?;
495                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
496                {
497                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
498                }
499                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
500                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
501                }
502            }
503
504            next_offset += envelope_size;
505
506            // Decode the remaining unknown envelopes.
507            while next_offset < end_offset {
508                _next_ordinal_to_read += 1;
509                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
510                next_offset += envelope_size;
511            }
512
513            Ok(())
514        }
515    }
516
517    impl SnoopPacket {
518        #[inline(always)]
519        fn max_ordinal_present(&self) -> u64 {
520            if let Some(_) = self.data {
521                return 5;
522            }
523            if let Some(_) = self.length {
524                return 4;
525            }
526            if let Some(_) = self.timestamp {
527                return 3;
528            }
529            if let Some(_) = self.format {
530                return 2;
531            }
532            if let Some(_) = self.is_received {
533                return 1;
534            }
535            0
536        }
537    }
538
539    impl fidl::encoding::ValueTypeMarker for SnoopPacket {
540        type Borrowed<'a> = &'a Self;
541        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
542            value
543        }
544    }
545
546    unsafe impl fidl::encoding::TypeMarker for SnoopPacket {
547        type Owned = Self;
548
549        #[inline(always)]
550        fn inline_align(_context: fidl::encoding::Context) -> usize {
551            8
552        }
553
554        #[inline(always)]
555        fn inline_size(_context: fidl::encoding::Context) -> usize {
556            16
557        }
558    }
559
560    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SnoopPacket, D>
561        for &SnoopPacket
562    {
563        unsafe fn encode(
564            self,
565            encoder: &mut fidl::encoding::Encoder<'_, D>,
566            offset: usize,
567            mut depth: fidl::encoding::Depth,
568        ) -> fidl::Result<()> {
569            encoder.debug_check_bounds::<SnoopPacket>(offset);
570            // Vector header
571            let max_ordinal: u64 = self.max_ordinal_present();
572            encoder.write_num(max_ordinal, offset);
573            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
574            // Calling encoder.out_of_line_offset(0) is not allowed.
575            if max_ordinal == 0 {
576                return Ok(());
577            }
578            depth.increment()?;
579            let envelope_size = 8;
580            let bytes_len = max_ordinal as usize * envelope_size;
581            #[allow(unused_variables)]
582            let offset = encoder.out_of_line_offset(bytes_len);
583            let mut _prev_end_offset: usize = 0;
584            if 1 > max_ordinal {
585                return Ok(());
586            }
587
588            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
589            // are envelope_size bytes.
590            let cur_offset: usize = (1 - 1) * envelope_size;
591
592            // Zero reserved fields.
593            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
594
595            // Safety:
596            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
597            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
598            //   envelope_size bytes, there is always sufficient room.
599            fidl::encoding::encode_in_envelope_optional::<bool, D>(
600                self.is_received.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
601                encoder,
602                offset + cur_offset,
603                depth,
604            )?;
605
606            _prev_end_offset = cur_offset + envelope_size;
607            if 2 > max_ordinal {
608                return Ok(());
609            }
610
611            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
612            // are envelope_size bytes.
613            let cur_offset: usize = (2 - 1) * envelope_size;
614
615            // Zero reserved fields.
616            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
617
618            // Safety:
619            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
620            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
621            //   envelope_size bytes, there is always sufficient room.
622            fidl::encoding::encode_in_envelope_optional::<PacketFormat, D>(
623                self.format.as_ref().map(<PacketFormat as fidl::encoding::ValueTypeMarker>::borrow),
624                encoder,
625                offset + cur_offset,
626                depth,
627            )?;
628
629            _prev_end_offset = cur_offset + envelope_size;
630            if 3 > max_ordinal {
631                return Ok(());
632            }
633
634            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
635            // are envelope_size bytes.
636            let cur_offset: usize = (3 - 1) * envelope_size;
637
638            // Zero reserved fields.
639            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
640
641            // Safety:
642            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
643            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
644            //   envelope_size bytes, there is always sufficient room.
645            fidl::encoding::encode_in_envelope_optional::<i64, D>(
646                self.timestamp.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
647                encoder,
648                offset + cur_offset,
649                depth,
650            )?;
651
652            _prev_end_offset = cur_offset + envelope_size;
653            if 4 > max_ordinal {
654                return Ok(());
655            }
656
657            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
658            // are envelope_size bytes.
659            let cur_offset: usize = (4 - 1) * envelope_size;
660
661            // Zero reserved fields.
662            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
663
664            // Safety:
665            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
666            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
667            //   envelope_size bytes, there is always sufficient room.
668            fidl::encoding::encode_in_envelope_optional::<u32, D>(
669                self.length.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
670                encoder,
671                offset + cur_offset,
672                depth,
673            )?;
674
675            _prev_end_offset = cur_offset + envelope_size;
676            if 5 > max_ordinal {
677                return Ok(());
678            }
679
680            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
681            // are envelope_size bytes.
682            let cur_offset: usize = (5 - 1) * envelope_size;
683
684            // Zero reserved fields.
685            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
686
687            // Safety:
688            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
689            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
690            //   envelope_size bytes, there is always sufficient room.
691            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<u8>, D>(
692            self.data.as_ref().map(<fidl::encoding::UnboundedVector<u8> as fidl::encoding::ValueTypeMarker>::borrow),
693            encoder, offset + cur_offset, depth
694        )?;
695
696            _prev_end_offset = cur_offset + envelope_size;
697
698            Ok(())
699        }
700    }
701
702    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SnoopPacket {
703        #[inline(always)]
704        fn new_empty() -> Self {
705            Self::default()
706        }
707
708        unsafe fn decode(
709            &mut self,
710            decoder: &mut fidl::encoding::Decoder<'_, D>,
711            offset: usize,
712            mut depth: fidl::encoding::Depth,
713        ) -> fidl::Result<()> {
714            decoder.debug_check_bounds::<Self>(offset);
715            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
716                None => return Err(fidl::Error::NotNullable),
717                Some(len) => len,
718            };
719            // Calling decoder.out_of_line_offset(0) is not allowed.
720            if len == 0 {
721                return Ok(());
722            };
723            depth.increment()?;
724            let envelope_size = 8;
725            let bytes_len = len * envelope_size;
726            let offset = decoder.out_of_line_offset(bytes_len)?;
727            // Decode the envelope for each type.
728            let mut _next_ordinal_to_read = 0;
729            let mut next_offset = offset;
730            let end_offset = offset + bytes_len;
731            _next_ordinal_to_read += 1;
732            if next_offset >= end_offset {
733                return Ok(());
734            }
735
736            // Decode unknown envelopes for gaps in ordinals.
737            while _next_ordinal_to_read < 1 {
738                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
739                _next_ordinal_to_read += 1;
740                next_offset += envelope_size;
741            }
742
743            let next_out_of_line = decoder.next_out_of_line();
744            let handles_before = decoder.remaining_handles();
745            if let Some((inlined, num_bytes, num_handles)) =
746                fidl::encoding::decode_envelope_header(decoder, next_offset)?
747            {
748                let member_inline_size =
749                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
750                if inlined != (member_inline_size <= 4) {
751                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
752                }
753                let inner_offset;
754                let mut inner_depth = depth.clone();
755                if inlined {
756                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
757                    inner_offset = next_offset;
758                } else {
759                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
760                    inner_depth.increment()?;
761                }
762                let val_ref = self.is_received.get_or_insert_with(|| fidl::new_empty!(bool, D));
763                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
764                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
765                {
766                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
767                }
768                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
769                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
770                }
771            }
772
773            next_offset += envelope_size;
774            _next_ordinal_to_read += 1;
775            if next_offset >= end_offset {
776                return Ok(());
777            }
778
779            // Decode unknown envelopes for gaps in ordinals.
780            while _next_ordinal_to_read < 2 {
781                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
782                _next_ordinal_to_read += 1;
783                next_offset += envelope_size;
784            }
785
786            let next_out_of_line = decoder.next_out_of_line();
787            let handles_before = decoder.remaining_handles();
788            if let Some((inlined, num_bytes, num_handles)) =
789                fidl::encoding::decode_envelope_header(decoder, next_offset)?
790            {
791                let member_inline_size =
792                    <PacketFormat as fidl::encoding::TypeMarker>::inline_size(decoder.context);
793                if inlined != (member_inline_size <= 4) {
794                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
795                }
796                let inner_offset;
797                let mut inner_depth = depth.clone();
798                if inlined {
799                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
800                    inner_offset = next_offset;
801                } else {
802                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
803                    inner_depth.increment()?;
804                }
805                let val_ref = self.format.get_or_insert_with(|| fidl::new_empty!(PacketFormat, D));
806                fidl::decode!(PacketFormat, D, val_ref, decoder, inner_offset, inner_depth)?;
807                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
808                {
809                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
810                }
811                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
812                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
813                }
814            }
815
816            next_offset += envelope_size;
817            _next_ordinal_to_read += 1;
818            if next_offset >= end_offset {
819                return Ok(());
820            }
821
822            // Decode unknown envelopes for gaps in ordinals.
823            while _next_ordinal_to_read < 3 {
824                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
825                _next_ordinal_to_read += 1;
826                next_offset += envelope_size;
827            }
828
829            let next_out_of_line = decoder.next_out_of_line();
830            let handles_before = decoder.remaining_handles();
831            if let Some((inlined, num_bytes, num_handles)) =
832                fidl::encoding::decode_envelope_header(decoder, next_offset)?
833            {
834                let member_inline_size =
835                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
836                if inlined != (member_inline_size <= 4) {
837                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
838                }
839                let inner_offset;
840                let mut inner_depth = depth.clone();
841                if inlined {
842                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
843                    inner_offset = next_offset;
844                } else {
845                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
846                    inner_depth.increment()?;
847                }
848                let val_ref = self.timestamp.get_or_insert_with(|| fidl::new_empty!(i64, D));
849                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
850                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
851                {
852                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
853                }
854                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
855                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
856                }
857            }
858
859            next_offset += envelope_size;
860            _next_ordinal_to_read += 1;
861            if next_offset >= end_offset {
862                return Ok(());
863            }
864
865            // Decode unknown envelopes for gaps in ordinals.
866            while _next_ordinal_to_read < 4 {
867                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
868                _next_ordinal_to_read += 1;
869                next_offset += envelope_size;
870            }
871
872            let next_out_of_line = decoder.next_out_of_line();
873            let handles_before = decoder.remaining_handles();
874            if let Some((inlined, num_bytes, num_handles)) =
875                fidl::encoding::decode_envelope_header(decoder, next_offset)?
876            {
877                let member_inline_size =
878                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
879                if inlined != (member_inline_size <= 4) {
880                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
881                }
882                let inner_offset;
883                let mut inner_depth = depth.clone();
884                if inlined {
885                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
886                    inner_offset = next_offset;
887                } else {
888                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
889                    inner_depth.increment()?;
890                }
891                let val_ref = self.length.get_or_insert_with(|| fidl::new_empty!(u32, D));
892                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
893                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
894                {
895                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
896                }
897                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
898                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
899                }
900            }
901
902            next_offset += envelope_size;
903            _next_ordinal_to_read += 1;
904            if next_offset >= end_offset {
905                return Ok(());
906            }
907
908            // Decode unknown envelopes for gaps in ordinals.
909            while _next_ordinal_to_read < 5 {
910                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
911                _next_ordinal_to_read += 1;
912                next_offset += envelope_size;
913            }
914
915            let next_out_of_line = decoder.next_out_of_line();
916            let handles_before = decoder.remaining_handles();
917            if let Some((inlined, num_bytes, num_handles)) =
918                fidl::encoding::decode_envelope_header(decoder, next_offset)?
919            {
920                let member_inline_size = <fidl::encoding::UnboundedVector<u8> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
921                if inlined != (member_inline_size <= 4) {
922                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
923                }
924                let inner_offset;
925                let mut inner_depth = depth.clone();
926                if inlined {
927                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
928                    inner_offset = next_offset;
929                } else {
930                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
931                    inner_depth.increment()?;
932                }
933                let val_ref = self.data.get_or_insert_with(|| {
934                    fidl::new_empty!(fidl::encoding::UnboundedVector<u8>, D)
935                });
936                fidl::decode!(
937                    fidl::encoding::UnboundedVector<u8>,
938                    D,
939                    val_ref,
940                    decoder,
941                    inner_offset,
942                    inner_depth
943                )?;
944                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
945                {
946                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
947                }
948                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
949                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
950                }
951            }
952
953            next_offset += envelope_size;
954
955            // Decode the remaining unknown envelopes.
956            while next_offset < end_offset {
957                _next_ordinal_to_read += 1;
958                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
959                next_offset += envelope_size;
960            }
961
962            Ok(())
963        }
964    }
965
966    impl UnrecognizedDeviceName {
967        #[inline(always)]
968        fn max_ordinal_present(&self) -> u64 {
969            0
970        }
971    }
972
973    impl fidl::encoding::ValueTypeMarker for UnrecognizedDeviceName {
974        type Borrowed<'a> = &'a Self;
975        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
976            value
977        }
978    }
979
980    unsafe impl fidl::encoding::TypeMarker for UnrecognizedDeviceName {
981        type Owned = Self;
982
983        #[inline(always)]
984        fn inline_align(_context: fidl::encoding::Context) -> usize {
985            8
986        }
987
988        #[inline(always)]
989        fn inline_size(_context: fidl::encoding::Context) -> usize {
990            16
991        }
992    }
993
994    unsafe impl<D: fidl::encoding::ResourceDialect>
995        fidl::encoding::Encode<UnrecognizedDeviceName, D> for &UnrecognizedDeviceName
996    {
997        unsafe fn encode(
998            self,
999            encoder: &mut fidl::encoding::Encoder<'_, D>,
1000            offset: usize,
1001            mut depth: fidl::encoding::Depth,
1002        ) -> fidl::Result<()> {
1003            encoder.debug_check_bounds::<UnrecognizedDeviceName>(offset);
1004            // Vector header
1005            let max_ordinal: u64 = self.max_ordinal_present();
1006            encoder.write_num(max_ordinal, offset);
1007            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1008            // Calling encoder.out_of_line_offset(0) is not allowed.
1009            if max_ordinal == 0 {
1010                return Ok(());
1011            }
1012            depth.increment()?;
1013            let envelope_size = 8;
1014            let bytes_len = max_ordinal as usize * envelope_size;
1015            #[allow(unused_variables)]
1016            let offset = encoder.out_of_line_offset(bytes_len);
1017            let mut _prev_end_offset: usize = 0;
1018
1019            Ok(())
1020        }
1021    }
1022
1023    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1024        for UnrecognizedDeviceName
1025    {
1026        #[inline(always)]
1027        fn new_empty() -> Self {
1028            Self::default()
1029        }
1030
1031        unsafe fn decode(
1032            &mut self,
1033            decoder: &mut fidl::encoding::Decoder<'_, D>,
1034            offset: usize,
1035            mut depth: fidl::encoding::Depth,
1036        ) -> fidl::Result<()> {
1037            decoder.debug_check_bounds::<Self>(offset);
1038            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1039                None => return Err(fidl::Error::NotNullable),
1040                Some(len) => len,
1041            };
1042            // Calling decoder.out_of_line_offset(0) is not allowed.
1043            if len == 0 {
1044                return Ok(());
1045            };
1046            depth.increment()?;
1047            let envelope_size = 8;
1048            let bytes_len = len * envelope_size;
1049            let offset = decoder.out_of_line_offset(bytes_len)?;
1050            // Decode the envelope for each type.
1051            let mut _next_ordinal_to_read = 0;
1052            let mut next_offset = offset;
1053            let end_offset = offset + bytes_len;
1054
1055            // Decode the remaining unknown envelopes.
1056            while next_offset < end_offset {
1057                _next_ordinal_to_read += 1;
1058                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1059                next_offset += envelope_size;
1060            }
1061
1062            Ok(())
1063        }
1064    }
1065
1066    impl fidl::encoding::ValueTypeMarker for CaptureError {
1067        type Borrowed<'a> = &'a Self;
1068        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1069            value
1070        }
1071    }
1072
1073    unsafe impl fidl::encoding::TypeMarker for CaptureError {
1074        type Owned = Self;
1075
1076        #[inline(always)]
1077        fn inline_align(_context: fidl::encoding::Context) -> usize {
1078            8
1079        }
1080
1081        #[inline(always)]
1082        fn inline_size(_context: fidl::encoding::Context) -> usize {
1083            16
1084        }
1085    }
1086
1087    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<CaptureError, D>
1088        for &CaptureError
1089    {
1090        #[inline]
1091        unsafe fn encode(
1092            self,
1093            encoder: &mut fidl::encoding::Encoder<'_, D>,
1094            offset: usize,
1095            _depth: fidl::encoding::Depth,
1096        ) -> fidl::Result<()> {
1097            encoder.debug_check_bounds::<CaptureError>(offset);
1098            encoder.write_num::<u64>(self.ordinal(), offset);
1099            match self {
1100                CaptureError::UnrecognizedDeviceName(ref val) => {
1101                    fidl::encoding::encode_in_envelope::<UnrecognizedDeviceName, D>(
1102                        <UnrecognizedDeviceName as fidl::encoding::ValueTypeMarker>::borrow(val),
1103                        encoder,
1104                        offset + 8,
1105                        _depth,
1106                    )
1107                }
1108                CaptureError::__SourceBreaking { .. } => Err(fidl::Error::UnknownUnionTag),
1109            }
1110        }
1111    }
1112
1113    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for CaptureError {
1114        #[inline(always)]
1115        fn new_empty() -> Self {
1116            Self::__SourceBreaking { unknown_ordinal: 0 }
1117        }
1118
1119        #[inline]
1120        unsafe fn decode(
1121            &mut self,
1122            decoder: &mut fidl::encoding::Decoder<'_, D>,
1123            offset: usize,
1124            mut depth: fidl::encoding::Depth,
1125        ) -> fidl::Result<()> {
1126            decoder.debug_check_bounds::<Self>(offset);
1127            #[allow(unused_variables)]
1128            let next_out_of_line = decoder.next_out_of_line();
1129            let handles_before = decoder.remaining_handles();
1130            let (ordinal, inlined, num_bytes, num_handles) =
1131                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
1132
1133            let member_inline_size = match ordinal {
1134                1 => <UnrecognizedDeviceName as fidl::encoding::TypeMarker>::inline_size(
1135                    decoder.context,
1136                ),
1137                0 => return Err(fidl::Error::UnknownUnionTag),
1138                _ => num_bytes as usize,
1139            };
1140
1141            if inlined != (member_inline_size <= 4) {
1142                return Err(fidl::Error::InvalidInlineBitInEnvelope);
1143            }
1144            let _inner_offset;
1145            if inlined {
1146                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
1147                _inner_offset = offset + 8;
1148            } else {
1149                depth.increment()?;
1150                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1151            }
1152            match ordinal {
1153                1 => {
1154                    #[allow(irrefutable_let_patterns)]
1155                    if let CaptureError::UnrecognizedDeviceName(_) = self {
1156                        // Do nothing, read the value into the object
1157                    } else {
1158                        // Initialize `self` to the right variant
1159                        *self = CaptureError::UnrecognizedDeviceName(fidl::new_empty!(
1160                            UnrecognizedDeviceName,
1161                            D
1162                        ));
1163                    }
1164                    #[allow(irrefutable_let_patterns)]
1165                    if let CaptureError::UnrecognizedDeviceName(ref mut val) = self {
1166                        fidl::decode!(
1167                            UnrecognizedDeviceName,
1168                            D,
1169                            val,
1170                            decoder,
1171                            _inner_offset,
1172                            depth
1173                        )?;
1174                    } else {
1175                        unreachable!()
1176                    }
1177                }
1178                #[allow(deprecated)]
1179                ordinal => {
1180                    for _ in 0..num_handles {
1181                        decoder.drop_next_handle()?;
1182                    }
1183                    *self = CaptureError::__SourceBreaking { unknown_ordinal: ordinal };
1184                }
1185            }
1186            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
1187                return Err(fidl::Error::InvalidNumBytesInEnvelope);
1188            }
1189            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1190                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1191            }
1192            Ok(())
1193        }
1194    }
1195}