Skip to main content

fidl_fuchsia_driver_debug_common/
fidl_fuchsia_driver_debug_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
11pub const MAX_ARG_COUNT: u32 = 128;
12
13pub const MAX_ARG_LENGTH: u32 = 1024;
14
15pub const MAX_COMMAND_COUNT: u32 = 64;
16
17pub const MAX_COMMAND_NAME_LENGTH: u32 = 256;
18
19pub const MAX_DESCRIPTION_LENGTH: u32 = 1024;
20
21#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
22#[repr(C)]
23pub struct DebugExecuteResponse {
24    /// The command's exit code, where 0 typically denotes success.
25    pub exit_code: i32,
26}
27
28impl fidl::Persistable for DebugExecuteResponse {}
29
30#[derive(Clone, Debug, PartialEq)]
31pub struct DebugListCommandsResponse {
32    pub commands: Vec<CommandInfo>,
33}
34
35impl fidl::Persistable for DebugListCommandsResponse {}
36
37/// Metadata for a supported command in the Debug protocol.
38#[derive(Clone, Debug, Default, PartialEq)]
39pub struct CommandInfo {
40    /// The name of the command.
41    pub name: Option<String>,
42    /// A human-readable description of what the command does and its usage.
43    pub description: Option<String>,
44    #[doc(hidden)]
45    pub __source_breaking: fidl::marker::SourceBreaking,
46}
47
48impl fidl::Persistable for CommandInfo {}
49
50pub mod debug_ordinals {
51    pub const EXECUTE: u64 = 0x5304f66cffdbed45;
52    pub const LIST_COMMANDS: u64 = 0x64f45f16f35cf381;
53}
54
55mod internal {
56    use super::*;
57
58    impl fidl::encoding::ValueTypeMarker for DebugExecuteResponse {
59        type Borrowed<'a> = &'a Self;
60        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
61            value
62        }
63    }
64
65    unsafe impl fidl::encoding::TypeMarker for DebugExecuteResponse {
66        type Owned = Self;
67
68        #[inline(always)]
69        fn inline_align(_context: fidl::encoding::Context) -> usize {
70            4
71        }
72
73        #[inline(always)]
74        fn inline_size(_context: fidl::encoding::Context) -> usize {
75            4
76        }
77        #[inline(always)]
78        fn encode_is_copy() -> bool {
79            true
80        }
81
82        #[inline(always)]
83        fn decode_is_copy() -> bool {
84            true
85        }
86    }
87
88    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DebugExecuteResponse, D>
89        for &DebugExecuteResponse
90    {
91        #[inline]
92        unsafe fn encode(
93            self,
94            encoder: &mut fidl::encoding::Encoder<'_, D>,
95            offset: usize,
96            _depth: fidl::encoding::Depth,
97        ) -> fidl::Result<()> {
98            encoder.debug_check_bounds::<DebugExecuteResponse>(offset);
99            unsafe {
100                // Copy the object into the buffer.
101                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
102                (buf_ptr as *mut DebugExecuteResponse)
103                    .write_unaligned((self as *const DebugExecuteResponse).read());
104                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
105                // done second because the memcpy will write garbage to these bytes.
106            }
107            Ok(())
108        }
109    }
110    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i32, D>>
111        fidl::encoding::Encode<DebugExecuteResponse, D> for (T0,)
112    {
113        #[inline]
114        unsafe fn encode(
115            self,
116            encoder: &mut fidl::encoding::Encoder<'_, D>,
117            offset: usize,
118            depth: fidl::encoding::Depth,
119        ) -> fidl::Result<()> {
120            encoder.debug_check_bounds::<DebugExecuteResponse>(offset);
121            // Zero out padding regions. There's no need to apply masks
122            // because the unmasked parts will be overwritten by fields.
123            // Write the fields.
124            self.0.encode(encoder, offset + 0, depth)?;
125            Ok(())
126        }
127    }
128
129    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DebugExecuteResponse {
130        #[inline(always)]
131        fn new_empty() -> Self {
132            Self { exit_code: fidl::new_empty!(i32, D) }
133        }
134
135        #[inline]
136        unsafe fn decode(
137            &mut self,
138            decoder: &mut fidl::encoding::Decoder<'_, D>,
139            offset: usize,
140            _depth: fidl::encoding::Depth,
141        ) -> fidl::Result<()> {
142            decoder.debug_check_bounds::<Self>(offset);
143            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
144            // Verify that padding bytes are zero.
145            // Copy from the buffer into the object.
146            unsafe {
147                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
148            }
149            Ok(())
150        }
151    }
152
153    impl fidl::encoding::ValueTypeMarker for DebugListCommandsResponse {
154        type Borrowed<'a> = &'a Self;
155        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
156            value
157        }
158    }
159
160    unsafe impl fidl::encoding::TypeMarker for DebugListCommandsResponse {
161        type Owned = Self;
162
163        #[inline(always)]
164        fn inline_align(_context: fidl::encoding::Context) -> usize {
165            8
166        }
167
168        #[inline(always)]
169        fn inline_size(_context: fidl::encoding::Context) -> usize {
170            16
171        }
172    }
173
174    unsafe impl<D: fidl::encoding::ResourceDialect>
175        fidl::encoding::Encode<DebugListCommandsResponse, D> for &DebugListCommandsResponse
176    {
177        #[inline]
178        unsafe fn encode(
179            self,
180            encoder: &mut fidl::encoding::Encoder<'_, D>,
181            offset: usize,
182            _depth: fidl::encoding::Depth,
183        ) -> fidl::Result<()> {
184            encoder.debug_check_bounds::<DebugListCommandsResponse>(offset);
185            // Delegate to tuple encoding.
186            fidl::encoding::Encode::<DebugListCommandsResponse, D>::encode(
187                (
188                    <fidl::encoding::Vector<CommandInfo, 64> as fidl::encoding::ValueTypeMarker>::borrow(&self.commands),
189                ),
190                encoder, offset, _depth
191            )
192        }
193    }
194    unsafe impl<
195        D: fidl::encoding::ResourceDialect,
196        T0: fidl::encoding::Encode<fidl::encoding::Vector<CommandInfo, 64>, D>,
197    > fidl::encoding::Encode<DebugListCommandsResponse, D> for (T0,)
198    {
199        #[inline]
200        unsafe fn encode(
201            self,
202            encoder: &mut fidl::encoding::Encoder<'_, D>,
203            offset: usize,
204            depth: fidl::encoding::Depth,
205        ) -> fidl::Result<()> {
206            encoder.debug_check_bounds::<DebugListCommandsResponse>(offset);
207            // Zero out padding regions. There's no need to apply masks
208            // because the unmasked parts will be overwritten by fields.
209            // Write the fields.
210            self.0.encode(encoder, offset + 0, depth)?;
211            Ok(())
212        }
213    }
214
215    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
216        for DebugListCommandsResponse
217    {
218        #[inline(always)]
219        fn new_empty() -> Self {
220            Self { commands: fidl::new_empty!(fidl::encoding::Vector<CommandInfo, 64>, D) }
221        }
222
223        #[inline]
224        unsafe fn decode(
225            &mut self,
226            decoder: &mut fidl::encoding::Decoder<'_, D>,
227            offset: usize,
228            _depth: fidl::encoding::Depth,
229        ) -> fidl::Result<()> {
230            decoder.debug_check_bounds::<Self>(offset);
231            // Verify that padding bytes are zero.
232            fidl::decode!(fidl::encoding::Vector<CommandInfo, 64>, D, &mut self.commands, decoder, offset + 0, _depth)?;
233            Ok(())
234        }
235    }
236
237    impl CommandInfo {
238        #[inline(always)]
239        fn max_ordinal_present(&self) -> u64 {
240            if let Some(_) = self.description {
241                return 2;
242            }
243            if let Some(_) = self.name {
244                return 1;
245            }
246            0
247        }
248    }
249
250    impl fidl::encoding::ValueTypeMarker for CommandInfo {
251        type Borrowed<'a> = &'a Self;
252        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
253            value
254        }
255    }
256
257    unsafe impl fidl::encoding::TypeMarker for CommandInfo {
258        type Owned = Self;
259
260        #[inline(always)]
261        fn inline_align(_context: fidl::encoding::Context) -> usize {
262            8
263        }
264
265        #[inline(always)]
266        fn inline_size(_context: fidl::encoding::Context) -> usize {
267            16
268        }
269    }
270
271    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<CommandInfo, D>
272        for &CommandInfo
273    {
274        unsafe fn encode(
275            self,
276            encoder: &mut fidl::encoding::Encoder<'_, D>,
277            offset: usize,
278            mut depth: fidl::encoding::Depth,
279        ) -> fidl::Result<()> {
280            encoder.debug_check_bounds::<CommandInfo>(offset);
281            // Vector header
282            let max_ordinal: u64 = self.max_ordinal_present();
283            encoder.write_num(max_ordinal, offset);
284            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
285            // Calling encoder.out_of_line_offset(0) is not allowed.
286            if max_ordinal == 0 {
287                return Ok(());
288            }
289            depth.increment()?;
290            let envelope_size = 8;
291            let bytes_len = max_ordinal as usize * envelope_size;
292            #[allow(unused_variables)]
293            let offset = encoder.out_of_line_offset(bytes_len);
294            let mut _prev_end_offset: usize = 0;
295            if 1 > max_ordinal {
296                return Ok(());
297            }
298
299            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
300            // are envelope_size bytes.
301            let cur_offset: usize = (1 - 1) * envelope_size;
302
303            // Zero reserved fields.
304            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
305
306            // Safety:
307            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
308            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
309            //   envelope_size bytes, there is always sufficient room.
310            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<256>, D>(
311                self.name.as_ref().map(
312                    <fidl::encoding::BoundedString<256> as fidl::encoding::ValueTypeMarker>::borrow,
313                ),
314                encoder,
315                offset + cur_offset,
316                depth,
317            )?;
318
319            _prev_end_offset = cur_offset + envelope_size;
320            if 2 > 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 = (2 - 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<1024>, D>(
336            self.description.as_ref().map(<fidl::encoding::BoundedString<1024> as fidl::encoding::ValueTypeMarker>::borrow),
337            encoder, offset + cur_offset, depth
338        )?;
339
340            _prev_end_offset = cur_offset + envelope_size;
341
342            Ok(())
343        }
344    }
345
346    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for CommandInfo {
347        #[inline(always)]
348        fn new_empty() -> Self {
349            Self::default()
350        }
351
352        unsafe fn decode(
353            &mut self,
354            decoder: &mut fidl::encoding::Decoder<'_, D>,
355            offset: usize,
356            mut depth: fidl::encoding::Depth,
357        ) -> fidl::Result<()> {
358            decoder.debug_check_bounds::<Self>(offset);
359            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
360                None => return Err(fidl::Error::NotNullable),
361                Some(len) => len,
362            };
363            // Calling decoder.out_of_line_offset(0) is not allowed.
364            if len == 0 {
365                return Ok(());
366            };
367            depth.increment()?;
368            let envelope_size = 8;
369            let bytes_len = len * envelope_size;
370            let offset = decoder.out_of_line_offset(bytes_len)?;
371            // Decode the envelope for each type.
372            let mut _next_ordinal_to_read = 0;
373            let mut next_offset = offset;
374            let end_offset = offset + bytes_len;
375            _next_ordinal_to_read += 1;
376            if next_offset >= end_offset {
377                return Ok(());
378            }
379
380            // Decode unknown envelopes for gaps in ordinals.
381            while _next_ordinal_to_read < 1 {
382                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
383                _next_ordinal_to_read += 1;
384                next_offset += envelope_size;
385            }
386
387            let next_out_of_line = decoder.next_out_of_line();
388            let handles_before = decoder.remaining_handles();
389            if let Some((inlined, num_bytes, num_handles)) =
390                fidl::encoding::decode_envelope_header(decoder, next_offset)?
391            {
392                let member_inline_size =
393                    <fidl::encoding::BoundedString<256> as fidl::encoding::TypeMarker>::inline_size(
394                        decoder.context,
395                    );
396                if inlined != (member_inline_size <= 4) {
397                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
398                }
399                let inner_offset;
400                let mut inner_depth = depth.clone();
401                if inlined {
402                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
403                    inner_offset = next_offset;
404                } else {
405                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
406                    inner_depth.increment()?;
407                }
408                let val_ref = self
409                    .name
410                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<256>, D));
411                fidl::decode!(
412                    fidl::encoding::BoundedString<256>,
413                    D,
414                    val_ref,
415                    decoder,
416                    inner_offset,
417                    inner_depth
418                )?;
419                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
420                {
421                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
422                }
423                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
424                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
425                }
426            }
427
428            next_offset += envelope_size;
429            _next_ordinal_to_read += 1;
430            if next_offset >= end_offset {
431                return Ok(());
432            }
433
434            // Decode unknown envelopes for gaps in ordinals.
435            while _next_ordinal_to_read < 2 {
436                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
437                _next_ordinal_to_read += 1;
438                next_offset += envelope_size;
439            }
440
441            let next_out_of_line = decoder.next_out_of_line();
442            let handles_before = decoder.remaining_handles();
443            if let Some((inlined, num_bytes, num_handles)) =
444                fidl::encoding::decode_envelope_header(decoder, next_offset)?
445            {
446                let member_inline_size = <fidl::encoding::BoundedString<1024> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
447                if inlined != (member_inline_size <= 4) {
448                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
449                }
450                let inner_offset;
451                let mut inner_depth = depth.clone();
452                if inlined {
453                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
454                    inner_offset = next_offset;
455                } else {
456                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
457                    inner_depth.increment()?;
458                }
459                let val_ref = self.description.get_or_insert_with(|| {
460                    fidl::new_empty!(fidl::encoding::BoundedString<1024>, D)
461                });
462                fidl::decode!(
463                    fidl::encoding::BoundedString<1024>,
464                    D,
465                    val_ref,
466                    decoder,
467                    inner_offset,
468                    inner_depth
469                )?;
470                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
471                {
472                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
473                }
474                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
475                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
476                }
477            }
478
479            next_offset += envelope_size;
480
481            // Decode the remaining unknown envelopes.
482            while next_offset < end_offset {
483                _next_ordinal_to_read += 1;
484                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
485                next_offset += envelope_size;
486            }
487
488            Ok(())
489        }
490    }
491}