fidl_fuchsia_fs_startup__common/
fidl_fuchsia_fs_startup__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/// Compression algorithm specifier.
12#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
13pub enum CompressionAlgorithm {
14    ZstdChunked,
15    Uncompressed,
16    #[doc(hidden)]
17    __SourceBreaking {
18        unknown_ordinal: u32,
19    },
20}
21
22/// Pattern that matches an unknown `CompressionAlgorithm` member.
23#[macro_export]
24macro_rules! CompressionAlgorithmUnknown {
25    () => {
26        _
27    };
28}
29
30impl CompressionAlgorithm {
31    #[inline]
32    pub fn from_primitive(prim: u32) -> Option<Self> {
33        match prim {
34            0 => Some(Self::ZstdChunked),
35            1 => Some(Self::Uncompressed),
36            _ => None,
37        }
38    }
39
40    #[inline]
41    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
42        match prim {
43            0 => Self::ZstdChunked,
44            1 => Self::Uncompressed,
45            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
46        }
47    }
48
49    #[inline]
50    pub fn unknown() -> Self {
51        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
52    }
53
54    #[inline]
55    pub const fn into_primitive(self) -> u32 {
56        match self {
57            Self::ZstdChunked => 0,
58            Self::Uncompressed => 1,
59            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
60        }
61    }
62
63    #[inline]
64    pub fn is_unknown(&self) -> bool {
65        match self {
66            Self::__SourceBreaking { unknown_ordinal: _ } => true,
67            _ => false,
68        }
69    }
70}
71
72/// An optional eviction policy override for pager-backed blobs for blobfs.
73#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
74pub enum EvictionPolicyOverride {
75    /// Don't override the default cache policy.
76    None,
77    /// Override the default cache policy for pager-backed blobs with kNeverEvict.
78    NeverEvict,
79    /// Override the default cache policy for pager-backed blobs with kEvictImmediately.
80    EvictImmediately,
81    #[doc(hidden)]
82    __SourceBreaking { unknown_ordinal: u32 },
83}
84
85/// Pattern that matches an unknown `EvictionPolicyOverride` member.
86#[macro_export]
87macro_rules! EvictionPolicyOverrideUnknown {
88    () => {
89        _
90    };
91}
92
93impl EvictionPolicyOverride {
94    #[inline]
95    pub fn from_primitive(prim: u32) -> Option<Self> {
96        match prim {
97            0 => Some(Self::None),
98            1 => Some(Self::NeverEvict),
99            2 => Some(Self::EvictImmediately),
100            _ => None,
101        }
102    }
103
104    #[inline]
105    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
106        match prim {
107            0 => Self::None,
108            1 => Self::NeverEvict,
109            2 => Self::EvictImmediately,
110            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
111        }
112    }
113
114    #[inline]
115    pub fn unknown() -> Self {
116        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
117    }
118
119    #[inline]
120    pub const fn into_primitive(self) -> u32 {
121        match self {
122            Self::None => 0,
123            Self::NeverEvict => 1,
124            Self::EvictImmediately => 2,
125            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
126        }
127    }
128
129    #[inline]
130    pub fn is_unknown(&self) -> bool {
131        match self {
132            Self::__SourceBreaking { unknown_ordinal: _ } => true,
133            _ => false,
134        }
135    }
136}
137
138#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
139#[repr(C)]
140pub struct VolumeSetLimitRequest {
141    pub bytes: u64,
142}
143
144impl fidl::Persistable for VolumeSetLimitRequest {}
145
146#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
147#[repr(C)]
148pub struct VolumeGetLimitResponse {
149    pub bytes: u64,
150}
151
152impl fidl::Persistable for VolumeGetLimitResponse {}
153
154#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
155pub struct VolumesRemoveRequest {
156    pub name: String,
157}
158
159impl fidl::Persistable for VolumesRemoveRequest {}
160
161/// Options for how to format filesystems.
162#[derive(Clone, Debug, Default, PartialEq)]
163pub struct FormatOptions {
164    /// Enable verbose logging.
165    pub verbose: Option<bool>,
166    /// If true, use the deprecated padded merkle tree blobfs format.
167    pub deprecated_padded_blobfs_format: Option<bool>,
168    /// The initial number of inodes to allocate space for. If zero, a default is used. Only
169    /// supported for blobfs.
170    pub num_inodes: Option<u64>,
171    /// The number of fvm slices to preallocate for data when the filesystem is created.
172    pub fvm_data_slices: Option<u32>,
173    /// The number of sectors-per-cluster (for FAT filesystems).
174    pub sectors_per_cluster: Option<u16>,
175    #[doc(hidden)]
176    pub __source_breaking: fidl::marker::SourceBreaking,
177}
178
179impl fidl::Persistable for FormatOptions {}
180
181/// Options for starting a filesystem.
182#[derive(Clone, Debug, Default, PartialEq)]
183pub struct StartOptions {
184    /// Start the filesystem in read-only mode.
185    pub read_only: Option<bool>,
186    /// Enable verbose logging.
187    pub verbose: Option<bool>,
188    /// If true, run fsck after every transaction. This is for testing purposes only - it's very
189    /// slow to run a filesystem like this.
190    pub fsck_after_every_transaction: Option<bool>,
191    /// A compression algorithm specifier for the filesystem to use when storing files (if the
192    /// filesystem supports it). Defaults to ZSTD_CHUNKED.
193    pub write_compression_algorithm: Option<CompressionAlgorithm>,
194    /// An optional compression level for the filesystem to use when storing files (if the
195    /// filesystem and the configured |write_compression_algorithm| supports it). Setting to < 0
196    /// indicates no value (the filesystem chooses a default if necessary).
197    pub write_compression_level: Option<i32>,
198    /// An optional eviction policy specifier for the filesystem to use for in-memory structures
199    /// (if the filesystem supports it), specifically for pager-backed files.
200    pub cache_eviction_policy_override: Option<EvictionPolicyOverride>,
201    /// Use profiling for the first N seconds after filesystem start. Records the access patterns
202    /// of objects for N seconds and if the profile already exists, prefetch data and hold the vmos
203    /// in cache for N seconds. Functionally this means that the first launch with this option
204    /// records the profile and all other launches with this option will replay that profile.
205    pub startup_profiling_seconds: Option<u32>,
206    /// If true, configures the filesystem to use the hardware's inline encryption engine when
207    /// writing encrypted data. This allows the filesystem to store user-encrypted data without
208    /// being able to read or write the plaintext contents, which enhances security and privacy.
209    /// Requires the block device to support inline encryption and for `barriers_enabled` to be
210    /// true.
211    /// TODO(https://fxbug.dev/393196849): For now, this flag only prevents the filesystem from
212    /// computing checksums. Update this comment when the filesystem actually uses inline
213    /// encryption.
214    pub inline_crypto_enabled: Option<bool>,
215    /// Configures the filesystem to use barriers instead of checksums to ensure consistency. If
216    /// set, barriers will be used to enforce proper ordering of data and metadata writes, which
217    /// is otherwise provided by computing and verifying data checksums.  Requires filesystem
218    /// support; at the time of writing, only Fxfs uses this argument.
219    /// Must be set to true if `inline_crypto_enabled` is true.
220    pub barriers_enabled: Option<bool>,
221    #[doc(hidden)]
222    pub __source_breaking: fidl::marker::SourceBreaking,
223}
224
225impl fidl::Persistable for StartOptions {}
226
227pub mod startup_ordinals {
228    pub const START: u64 = 0x317aa9458d3190c8;
229    pub const FORMAT: u64 = 0x3124676dd91933de;
230    pub const CHECK: u64 = 0x81e85b3190e7db3;
231}
232
233pub mod volume_ordinals {
234    pub const MOUNT: u64 = 0x3470ab56d455af0;
235    pub const CHECK: u64 = 0x5b638348f5e0418c;
236    pub const SET_LIMIT: u64 = 0x19286d83eb3cd137;
237    pub const GET_LIMIT: u64 = 0xb14e4950939f16;
238}
239
240pub mod volumes_ordinals {
241    pub const CREATE: u64 = 0x11a55097834b38e8;
242    pub const REMOVE: u64 = 0x70983b9344dc2292;
243}
244
245mod internal {
246    use super::*;
247    unsafe impl fidl::encoding::TypeMarker for CompressionAlgorithm {
248        type Owned = Self;
249
250        #[inline(always)]
251        fn inline_align(_context: fidl::encoding::Context) -> usize {
252            std::mem::align_of::<u32>()
253        }
254
255        #[inline(always)]
256        fn inline_size(_context: fidl::encoding::Context) -> usize {
257            std::mem::size_of::<u32>()
258        }
259
260        #[inline(always)]
261        fn encode_is_copy() -> bool {
262            false
263        }
264
265        #[inline(always)]
266        fn decode_is_copy() -> bool {
267            false
268        }
269    }
270
271    impl fidl::encoding::ValueTypeMarker for CompressionAlgorithm {
272        type Borrowed<'a> = Self;
273        #[inline(always)]
274        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
275            *value
276        }
277    }
278
279    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
280        for CompressionAlgorithm
281    {
282        #[inline]
283        unsafe fn encode(
284            self,
285            encoder: &mut fidl::encoding::Encoder<'_, D>,
286            offset: usize,
287            _depth: fidl::encoding::Depth,
288        ) -> fidl::Result<()> {
289            encoder.debug_check_bounds::<Self>(offset);
290            encoder.write_num(self.into_primitive(), offset);
291            Ok(())
292        }
293    }
294
295    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for CompressionAlgorithm {
296        #[inline(always)]
297        fn new_empty() -> Self {
298            Self::unknown()
299        }
300
301        #[inline]
302        unsafe fn decode(
303            &mut self,
304            decoder: &mut fidl::encoding::Decoder<'_, D>,
305            offset: usize,
306            _depth: fidl::encoding::Depth,
307        ) -> fidl::Result<()> {
308            decoder.debug_check_bounds::<Self>(offset);
309            let prim = decoder.read_num::<u32>(offset);
310
311            *self = Self::from_primitive_allow_unknown(prim);
312            Ok(())
313        }
314    }
315    unsafe impl fidl::encoding::TypeMarker for EvictionPolicyOverride {
316        type Owned = Self;
317
318        #[inline(always)]
319        fn inline_align(_context: fidl::encoding::Context) -> usize {
320            std::mem::align_of::<u32>()
321        }
322
323        #[inline(always)]
324        fn inline_size(_context: fidl::encoding::Context) -> usize {
325            std::mem::size_of::<u32>()
326        }
327
328        #[inline(always)]
329        fn encode_is_copy() -> bool {
330            false
331        }
332
333        #[inline(always)]
334        fn decode_is_copy() -> bool {
335            false
336        }
337    }
338
339    impl fidl::encoding::ValueTypeMarker for EvictionPolicyOverride {
340        type Borrowed<'a> = Self;
341        #[inline(always)]
342        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
343            *value
344        }
345    }
346
347    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
348        for EvictionPolicyOverride
349    {
350        #[inline]
351        unsafe fn encode(
352            self,
353            encoder: &mut fidl::encoding::Encoder<'_, D>,
354            offset: usize,
355            _depth: fidl::encoding::Depth,
356        ) -> fidl::Result<()> {
357            encoder.debug_check_bounds::<Self>(offset);
358            encoder.write_num(self.into_primitive(), offset);
359            Ok(())
360        }
361    }
362
363    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
364        for EvictionPolicyOverride
365    {
366        #[inline(always)]
367        fn new_empty() -> Self {
368            Self::unknown()
369        }
370
371        #[inline]
372        unsafe fn decode(
373            &mut self,
374            decoder: &mut fidl::encoding::Decoder<'_, D>,
375            offset: usize,
376            _depth: fidl::encoding::Depth,
377        ) -> fidl::Result<()> {
378            decoder.debug_check_bounds::<Self>(offset);
379            let prim = decoder.read_num::<u32>(offset);
380
381            *self = Self::from_primitive_allow_unknown(prim);
382            Ok(())
383        }
384    }
385
386    impl fidl::encoding::ValueTypeMarker for VolumeSetLimitRequest {
387        type Borrowed<'a> = &'a Self;
388        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
389            value
390        }
391    }
392
393    unsafe impl fidl::encoding::TypeMarker for VolumeSetLimitRequest {
394        type Owned = Self;
395
396        #[inline(always)]
397        fn inline_align(_context: fidl::encoding::Context) -> usize {
398            8
399        }
400
401        #[inline(always)]
402        fn inline_size(_context: fidl::encoding::Context) -> usize {
403            8
404        }
405        #[inline(always)]
406        fn encode_is_copy() -> bool {
407            true
408        }
409
410        #[inline(always)]
411        fn decode_is_copy() -> bool {
412            true
413        }
414    }
415
416    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<VolumeSetLimitRequest, D>
417        for &VolumeSetLimitRequest
418    {
419        #[inline]
420        unsafe fn encode(
421            self,
422            encoder: &mut fidl::encoding::Encoder<'_, D>,
423            offset: usize,
424            _depth: fidl::encoding::Depth,
425        ) -> fidl::Result<()> {
426            encoder.debug_check_bounds::<VolumeSetLimitRequest>(offset);
427            unsafe {
428                // Copy the object into the buffer.
429                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
430                (buf_ptr as *mut VolumeSetLimitRequest)
431                    .write_unaligned((self as *const VolumeSetLimitRequest).read());
432                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
433                // done second because the memcpy will write garbage to these bytes.
434            }
435            Ok(())
436        }
437    }
438    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u64, D>>
439        fidl::encoding::Encode<VolumeSetLimitRequest, D> for (T0,)
440    {
441        #[inline]
442        unsafe fn encode(
443            self,
444            encoder: &mut fidl::encoding::Encoder<'_, D>,
445            offset: usize,
446            depth: fidl::encoding::Depth,
447        ) -> fidl::Result<()> {
448            encoder.debug_check_bounds::<VolumeSetLimitRequest>(offset);
449            // Zero out padding regions. There's no need to apply masks
450            // because the unmasked parts will be overwritten by fields.
451            // Write the fields.
452            self.0.encode(encoder, offset + 0, depth)?;
453            Ok(())
454        }
455    }
456
457    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for VolumeSetLimitRequest {
458        #[inline(always)]
459        fn new_empty() -> Self {
460            Self { bytes: fidl::new_empty!(u64, D) }
461        }
462
463        #[inline]
464        unsafe fn decode(
465            &mut self,
466            decoder: &mut fidl::encoding::Decoder<'_, D>,
467            offset: usize,
468            _depth: fidl::encoding::Depth,
469        ) -> fidl::Result<()> {
470            decoder.debug_check_bounds::<Self>(offset);
471            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
472            // Verify that padding bytes are zero.
473            // Copy from the buffer into the object.
474            unsafe {
475                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
476            }
477            Ok(())
478        }
479    }
480
481    impl fidl::encoding::ValueTypeMarker for VolumeGetLimitResponse {
482        type Borrowed<'a> = &'a Self;
483        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
484            value
485        }
486    }
487
488    unsafe impl fidl::encoding::TypeMarker for VolumeGetLimitResponse {
489        type Owned = Self;
490
491        #[inline(always)]
492        fn inline_align(_context: fidl::encoding::Context) -> usize {
493            8
494        }
495
496        #[inline(always)]
497        fn inline_size(_context: fidl::encoding::Context) -> usize {
498            8
499        }
500        #[inline(always)]
501        fn encode_is_copy() -> bool {
502            true
503        }
504
505        #[inline(always)]
506        fn decode_is_copy() -> bool {
507            true
508        }
509    }
510
511    unsafe impl<D: fidl::encoding::ResourceDialect>
512        fidl::encoding::Encode<VolumeGetLimitResponse, D> for &VolumeGetLimitResponse
513    {
514        #[inline]
515        unsafe fn encode(
516            self,
517            encoder: &mut fidl::encoding::Encoder<'_, D>,
518            offset: usize,
519            _depth: fidl::encoding::Depth,
520        ) -> fidl::Result<()> {
521            encoder.debug_check_bounds::<VolumeGetLimitResponse>(offset);
522            unsafe {
523                // Copy the object into the buffer.
524                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
525                (buf_ptr as *mut VolumeGetLimitResponse)
526                    .write_unaligned((self as *const VolumeGetLimitResponse).read());
527                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
528                // done second because the memcpy will write garbage to these bytes.
529            }
530            Ok(())
531        }
532    }
533    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u64, D>>
534        fidl::encoding::Encode<VolumeGetLimitResponse, D> for (T0,)
535    {
536        #[inline]
537        unsafe fn encode(
538            self,
539            encoder: &mut fidl::encoding::Encoder<'_, D>,
540            offset: usize,
541            depth: fidl::encoding::Depth,
542        ) -> fidl::Result<()> {
543            encoder.debug_check_bounds::<VolumeGetLimitResponse>(offset);
544            // Zero out padding regions. There's no need to apply masks
545            // because the unmasked parts will be overwritten by fields.
546            // Write the fields.
547            self.0.encode(encoder, offset + 0, depth)?;
548            Ok(())
549        }
550    }
551
552    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
553        for VolumeGetLimitResponse
554    {
555        #[inline(always)]
556        fn new_empty() -> Self {
557            Self { bytes: fidl::new_empty!(u64, D) }
558        }
559
560        #[inline]
561        unsafe fn decode(
562            &mut self,
563            decoder: &mut fidl::encoding::Decoder<'_, D>,
564            offset: usize,
565            _depth: fidl::encoding::Depth,
566        ) -> fidl::Result<()> {
567            decoder.debug_check_bounds::<Self>(offset);
568            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
569            // Verify that padding bytes are zero.
570            // Copy from the buffer into the object.
571            unsafe {
572                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
573            }
574            Ok(())
575        }
576    }
577
578    impl fidl::encoding::ValueTypeMarker for VolumesRemoveRequest {
579        type Borrowed<'a> = &'a Self;
580        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
581            value
582        }
583    }
584
585    unsafe impl fidl::encoding::TypeMarker for VolumesRemoveRequest {
586        type Owned = Self;
587
588        #[inline(always)]
589        fn inline_align(_context: fidl::encoding::Context) -> usize {
590            8
591        }
592
593        #[inline(always)]
594        fn inline_size(_context: fidl::encoding::Context) -> usize {
595            16
596        }
597    }
598
599    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<VolumesRemoveRequest, D>
600        for &VolumesRemoveRequest
601    {
602        #[inline]
603        unsafe fn encode(
604            self,
605            encoder: &mut fidl::encoding::Encoder<'_, D>,
606            offset: usize,
607            _depth: fidl::encoding::Depth,
608        ) -> fidl::Result<()> {
609            encoder.debug_check_bounds::<VolumesRemoveRequest>(offset);
610            // Delegate to tuple encoding.
611            fidl::encoding::Encode::<VolumesRemoveRequest, D>::encode(
612                (<fidl::encoding::BoundedString<255> as fidl::encoding::ValueTypeMarker>::borrow(
613                    &self.name,
614                ),),
615                encoder,
616                offset,
617                _depth,
618            )
619        }
620    }
621    unsafe impl<
622            D: fidl::encoding::ResourceDialect,
623            T0: fidl::encoding::Encode<fidl::encoding::BoundedString<255>, D>,
624        > fidl::encoding::Encode<VolumesRemoveRequest, D> for (T0,)
625    {
626        #[inline]
627        unsafe fn encode(
628            self,
629            encoder: &mut fidl::encoding::Encoder<'_, D>,
630            offset: usize,
631            depth: fidl::encoding::Depth,
632        ) -> fidl::Result<()> {
633            encoder.debug_check_bounds::<VolumesRemoveRequest>(offset);
634            // Zero out padding regions. There's no need to apply masks
635            // because the unmasked parts will be overwritten by fields.
636            // Write the fields.
637            self.0.encode(encoder, offset + 0, depth)?;
638            Ok(())
639        }
640    }
641
642    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for VolumesRemoveRequest {
643        #[inline(always)]
644        fn new_empty() -> Self {
645            Self { name: fidl::new_empty!(fidl::encoding::BoundedString<255>, D) }
646        }
647
648        #[inline]
649        unsafe fn decode(
650            &mut self,
651            decoder: &mut fidl::encoding::Decoder<'_, D>,
652            offset: usize,
653            _depth: fidl::encoding::Depth,
654        ) -> fidl::Result<()> {
655            decoder.debug_check_bounds::<Self>(offset);
656            // Verify that padding bytes are zero.
657            fidl::decode!(
658                fidl::encoding::BoundedString<255>,
659                D,
660                &mut self.name,
661                decoder,
662                offset + 0,
663                _depth
664            )?;
665            Ok(())
666        }
667    }
668
669    impl FormatOptions {
670        #[inline(always)]
671        fn max_ordinal_present(&self) -> u64 {
672            if let Some(_) = self.sectors_per_cluster {
673                return 5;
674            }
675            if let Some(_) = self.fvm_data_slices {
676                return 4;
677            }
678            if let Some(_) = self.num_inodes {
679                return 3;
680            }
681            if let Some(_) = self.deprecated_padded_blobfs_format {
682                return 2;
683            }
684            if let Some(_) = self.verbose {
685                return 1;
686            }
687            0
688        }
689    }
690
691    impl fidl::encoding::ValueTypeMarker for FormatOptions {
692        type Borrowed<'a> = &'a Self;
693        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
694            value
695        }
696    }
697
698    unsafe impl fidl::encoding::TypeMarker for FormatOptions {
699        type Owned = Self;
700
701        #[inline(always)]
702        fn inline_align(_context: fidl::encoding::Context) -> usize {
703            8
704        }
705
706        #[inline(always)]
707        fn inline_size(_context: fidl::encoding::Context) -> usize {
708            16
709        }
710    }
711
712    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<FormatOptions, D>
713        for &FormatOptions
714    {
715        unsafe fn encode(
716            self,
717            encoder: &mut fidl::encoding::Encoder<'_, D>,
718            offset: usize,
719            mut depth: fidl::encoding::Depth,
720        ) -> fidl::Result<()> {
721            encoder.debug_check_bounds::<FormatOptions>(offset);
722            // Vector header
723            let max_ordinal: u64 = self.max_ordinal_present();
724            encoder.write_num(max_ordinal, offset);
725            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
726            // Calling encoder.out_of_line_offset(0) is not allowed.
727            if max_ordinal == 0 {
728                return Ok(());
729            }
730            depth.increment()?;
731            let envelope_size = 8;
732            let bytes_len = max_ordinal as usize * envelope_size;
733            #[allow(unused_variables)]
734            let offset = encoder.out_of_line_offset(bytes_len);
735            let mut _prev_end_offset: usize = 0;
736            if 1 > max_ordinal {
737                return Ok(());
738            }
739
740            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
741            // are envelope_size bytes.
742            let cur_offset: usize = (1 - 1) * envelope_size;
743
744            // Zero reserved fields.
745            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
746
747            // Safety:
748            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
749            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
750            //   envelope_size bytes, there is always sufficient room.
751            fidl::encoding::encode_in_envelope_optional::<bool, D>(
752                self.verbose.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
753                encoder,
754                offset + cur_offset,
755                depth,
756            )?;
757
758            _prev_end_offset = cur_offset + envelope_size;
759            if 2 > max_ordinal {
760                return Ok(());
761            }
762
763            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
764            // are envelope_size bytes.
765            let cur_offset: usize = (2 - 1) * envelope_size;
766
767            // Zero reserved fields.
768            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
769
770            // Safety:
771            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
772            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
773            //   envelope_size bytes, there is always sufficient room.
774            fidl::encoding::encode_in_envelope_optional::<bool, D>(
775                self.deprecated_padded_blobfs_format
776                    .as_ref()
777                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
778                encoder,
779                offset + cur_offset,
780                depth,
781            )?;
782
783            _prev_end_offset = cur_offset + envelope_size;
784            if 3 > max_ordinal {
785                return Ok(());
786            }
787
788            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
789            // are envelope_size bytes.
790            let cur_offset: usize = (3 - 1) * envelope_size;
791
792            // Zero reserved fields.
793            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
794
795            // Safety:
796            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
797            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
798            //   envelope_size bytes, there is always sufficient room.
799            fidl::encoding::encode_in_envelope_optional::<u64, D>(
800                self.num_inodes.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
801                encoder,
802                offset + cur_offset,
803                depth,
804            )?;
805
806            _prev_end_offset = cur_offset + envelope_size;
807            if 4 > max_ordinal {
808                return Ok(());
809            }
810
811            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
812            // are envelope_size bytes.
813            let cur_offset: usize = (4 - 1) * envelope_size;
814
815            // Zero reserved fields.
816            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
817
818            // Safety:
819            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
820            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
821            //   envelope_size bytes, there is always sufficient room.
822            fidl::encoding::encode_in_envelope_optional::<u32, D>(
823                self.fvm_data_slices.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
824                encoder,
825                offset + cur_offset,
826                depth,
827            )?;
828
829            _prev_end_offset = cur_offset + envelope_size;
830            if 5 > max_ordinal {
831                return Ok(());
832            }
833
834            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
835            // are envelope_size bytes.
836            let cur_offset: usize = (5 - 1) * envelope_size;
837
838            // Zero reserved fields.
839            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
840
841            // Safety:
842            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
843            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
844            //   envelope_size bytes, there is always sufficient room.
845            fidl::encoding::encode_in_envelope_optional::<u16, D>(
846                self.sectors_per_cluster
847                    .as_ref()
848                    .map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
849                encoder,
850                offset + cur_offset,
851                depth,
852            )?;
853
854            _prev_end_offset = cur_offset + envelope_size;
855
856            Ok(())
857        }
858    }
859
860    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for FormatOptions {
861        #[inline(always)]
862        fn new_empty() -> Self {
863            Self::default()
864        }
865
866        unsafe fn decode(
867            &mut self,
868            decoder: &mut fidl::encoding::Decoder<'_, D>,
869            offset: usize,
870            mut depth: fidl::encoding::Depth,
871        ) -> fidl::Result<()> {
872            decoder.debug_check_bounds::<Self>(offset);
873            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
874                None => return Err(fidl::Error::NotNullable),
875                Some(len) => len,
876            };
877            // Calling decoder.out_of_line_offset(0) is not allowed.
878            if len == 0 {
879                return Ok(());
880            };
881            depth.increment()?;
882            let envelope_size = 8;
883            let bytes_len = len * envelope_size;
884            let offset = decoder.out_of_line_offset(bytes_len)?;
885            // Decode the envelope for each type.
886            let mut _next_ordinal_to_read = 0;
887            let mut next_offset = offset;
888            let end_offset = offset + bytes_len;
889            _next_ordinal_to_read += 1;
890            if next_offset >= end_offset {
891                return Ok(());
892            }
893
894            // Decode unknown envelopes for gaps in ordinals.
895            while _next_ordinal_to_read < 1 {
896                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
897                _next_ordinal_to_read += 1;
898                next_offset += envelope_size;
899            }
900
901            let next_out_of_line = decoder.next_out_of_line();
902            let handles_before = decoder.remaining_handles();
903            if let Some((inlined, num_bytes, num_handles)) =
904                fidl::encoding::decode_envelope_header(decoder, next_offset)?
905            {
906                let member_inline_size =
907                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
908                if inlined != (member_inline_size <= 4) {
909                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
910                }
911                let inner_offset;
912                let mut inner_depth = depth.clone();
913                if inlined {
914                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
915                    inner_offset = next_offset;
916                } else {
917                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
918                    inner_depth.increment()?;
919                }
920                let val_ref = self.verbose.get_or_insert_with(|| fidl::new_empty!(bool, D));
921                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
922                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
923                {
924                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
925                }
926                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
927                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
928                }
929            }
930
931            next_offset += envelope_size;
932            _next_ordinal_to_read += 1;
933            if next_offset >= end_offset {
934                return Ok(());
935            }
936
937            // Decode unknown envelopes for gaps in ordinals.
938            while _next_ordinal_to_read < 2 {
939                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
940                _next_ordinal_to_read += 1;
941                next_offset += envelope_size;
942            }
943
944            let next_out_of_line = decoder.next_out_of_line();
945            let handles_before = decoder.remaining_handles();
946            if let Some((inlined, num_bytes, num_handles)) =
947                fidl::encoding::decode_envelope_header(decoder, next_offset)?
948            {
949                let member_inline_size =
950                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
951                if inlined != (member_inline_size <= 4) {
952                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
953                }
954                let inner_offset;
955                let mut inner_depth = depth.clone();
956                if inlined {
957                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
958                    inner_offset = next_offset;
959                } else {
960                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
961                    inner_depth.increment()?;
962                }
963                let val_ref = self
964                    .deprecated_padded_blobfs_format
965                    .get_or_insert_with(|| fidl::new_empty!(bool, D));
966                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
967                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
968                {
969                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
970                }
971                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
972                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
973                }
974            }
975
976            next_offset += envelope_size;
977            _next_ordinal_to_read += 1;
978            if next_offset >= end_offset {
979                return Ok(());
980            }
981
982            // Decode unknown envelopes for gaps in ordinals.
983            while _next_ordinal_to_read < 3 {
984                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
985                _next_ordinal_to_read += 1;
986                next_offset += envelope_size;
987            }
988
989            let next_out_of_line = decoder.next_out_of_line();
990            let handles_before = decoder.remaining_handles();
991            if let Some((inlined, num_bytes, num_handles)) =
992                fidl::encoding::decode_envelope_header(decoder, next_offset)?
993            {
994                let member_inline_size =
995                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
996                if inlined != (member_inline_size <= 4) {
997                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
998                }
999                let inner_offset;
1000                let mut inner_depth = depth.clone();
1001                if inlined {
1002                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1003                    inner_offset = next_offset;
1004                } else {
1005                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1006                    inner_depth.increment()?;
1007                }
1008                let val_ref = self.num_inodes.get_or_insert_with(|| fidl::new_empty!(u64, D));
1009                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
1010                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1011                {
1012                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1013                }
1014                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1015                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1016                }
1017            }
1018
1019            next_offset += envelope_size;
1020            _next_ordinal_to_read += 1;
1021            if next_offset >= end_offset {
1022                return Ok(());
1023            }
1024
1025            // Decode unknown envelopes for gaps in ordinals.
1026            while _next_ordinal_to_read < 4 {
1027                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1028                _next_ordinal_to_read += 1;
1029                next_offset += envelope_size;
1030            }
1031
1032            let next_out_of_line = decoder.next_out_of_line();
1033            let handles_before = decoder.remaining_handles();
1034            if let Some((inlined, num_bytes, num_handles)) =
1035                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1036            {
1037                let member_inline_size =
1038                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1039                if inlined != (member_inline_size <= 4) {
1040                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1041                }
1042                let inner_offset;
1043                let mut inner_depth = depth.clone();
1044                if inlined {
1045                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1046                    inner_offset = next_offset;
1047                } else {
1048                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1049                    inner_depth.increment()?;
1050                }
1051                let val_ref = self.fvm_data_slices.get_or_insert_with(|| fidl::new_empty!(u32, D));
1052                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1053                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1054                {
1055                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1056                }
1057                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1058                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1059                }
1060            }
1061
1062            next_offset += envelope_size;
1063            _next_ordinal_to_read += 1;
1064            if next_offset >= end_offset {
1065                return Ok(());
1066            }
1067
1068            // Decode unknown envelopes for gaps in ordinals.
1069            while _next_ordinal_to_read < 5 {
1070                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1071                _next_ordinal_to_read += 1;
1072                next_offset += envelope_size;
1073            }
1074
1075            let next_out_of_line = decoder.next_out_of_line();
1076            let handles_before = decoder.remaining_handles();
1077            if let Some((inlined, num_bytes, num_handles)) =
1078                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1079            {
1080                let member_inline_size =
1081                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1082                if inlined != (member_inline_size <= 4) {
1083                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1084                }
1085                let inner_offset;
1086                let mut inner_depth = depth.clone();
1087                if inlined {
1088                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1089                    inner_offset = next_offset;
1090                } else {
1091                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1092                    inner_depth.increment()?;
1093                }
1094                let val_ref =
1095                    self.sectors_per_cluster.get_or_insert_with(|| fidl::new_empty!(u16, D));
1096                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
1097                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1098                {
1099                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1100                }
1101                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1102                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1103                }
1104            }
1105
1106            next_offset += envelope_size;
1107
1108            // Decode the remaining unknown envelopes.
1109            while next_offset < end_offset {
1110                _next_ordinal_to_read += 1;
1111                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1112                next_offset += envelope_size;
1113            }
1114
1115            Ok(())
1116        }
1117    }
1118
1119    impl StartOptions {
1120        #[inline(always)]
1121        fn max_ordinal_present(&self) -> u64 {
1122            if let Some(_) = self.barriers_enabled {
1123                return 9;
1124            }
1125            if let Some(_) = self.inline_crypto_enabled {
1126                return 8;
1127            }
1128            if let Some(_) = self.startup_profiling_seconds {
1129                return 7;
1130            }
1131            if let Some(_) = self.cache_eviction_policy_override {
1132                return 6;
1133            }
1134            if let Some(_) = self.write_compression_level {
1135                return 5;
1136            }
1137            if let Some(_) = self.write_compression_algorithm {
1138                return 4;
1139            }
1140            if let Some(_) = self.fsck_after_every_transaction {
1141                return 3;
1142            }
1143            if let Some(_) = self.verbose {
1144                return 2;
1145            }
1146            if let Some(_) = self.read_only {
1147                return 1;
1148            }
1149            0
1150        }
1151    }
1152
1153    impl fidl::encoding::ValueTypeMarker for StartOptions {
1154        type Borrowed<'a> = &'a Self;
1155        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1156            value
1157        }
1158    }
1159
1160    unsafe impl fidl::encoding::TypeMarker for StartOptions {
1161        type Owned = Self;
1162
1163        #[inline(always)]
1164        fn inline_align(_context: fidl::encoding::Context) -> usize {
1165            8
1166        }
1167
1168        #[inline(always)]
1169        fn inline_size(_context: fidl::encoding::Context) -> usize {
1170            16
1171        }
1172    }
1173
1174    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<StartOptions, D>
1175        for &StartOptions
1176    {
1177        unsafe fn encode(
1178            self,
1179            encoder: &mut fidl::encoding::Encoder<'_, D>,
1180            offset: usize,
1181            mut depth: fidl::encoding::Depth,
1182        ) -> fidl::Result<()> {
1183            encoder.debug_check_bounds::<StartOptions>(offset);
1184            // Vector header
1185            let max_ordinal: u64 = self.max_ordinal_present();
1186            encoder.write_num(max_ordinal, offset);
1187            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1188            // Calling encoder.out_of_line_offset(0) is not allowed.
1189            if max_ordinal == 0 {
1190                return Ok(());
1191            }
1192            depth.increment()?;
1193            let envelope_size = 8;
1194            let bytes_len = max_ordinal as usize * envelope_size;
1195            #[allow(unused_variables)]
1196            let offset = encoder.out_of_line_offset(bytes_len);
1197            let mut _prev_end_offset: usize = 0;
1198            if 1 > max_ordinal {
1199                return Ok(());
1200            }
1201
1202            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1203            // are envelope_size bytes.
1204            let cur_offset: usize = (1 - 1) * envelope_size;
1205
1206            // Zero reserved fields.
1207            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1208
1209            // Safety:
1210            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1211            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1212            //   envelope_size bytes, there is always sufficient room.
1213            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1214                self.read_only.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1215                encoder,
1216                offset + cur_offset,
1217                depth,
1218            )?;
1219
1220            _prev_end_offset = cur_offset + envelope_size;
1221            if 2 > max_ordinal {
1222                return Ok(());
1223            }
1224
1225            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1226            // are envelope_size bytes.
1227            let cur_offset: usize = (2 - 1) * envelope_size;
1228
1229            // Zero reserved fields.
1230            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1231
1232            // Safety:
1233            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1234            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1235            //   envelope_size bytes, there is always sufficient room.
1236            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1237                self.verbose.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1238                encoder,
1239                offset + cur_offset,
1240                depth,
1241            )?;
1242
1243            _prev_end_offset = cur_offset + envelope_size;
1244            if 3 > max_ordinal {
1245                return Ok(());
1246            }
1247
1248            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1249            // are envelope_size bytes.
1250            let cur_offset: usize = (3 - 1) * envelope_size;
1251
1252            // Zero reserved fields.
1253            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1254
1255            // Safety:
1256            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1257            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1258            //   envelope_size bytes, there is always sufficient room.
1259            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1260                self.fsck_after_every_transaction
1261                    .as_ref()
1262                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1263                encoder,
1264                offset + cur_offset,
1265                depth,
1266            )?;
1267
1268            _prev_end_offset = cur_offset + envelope_size;
1269            if 4 > max_ordinal {
1270                return Ok(());
1271            }
1272
1273            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1274            // are envelope_size bytes.
1275            let cur_offset: usize = (4 - 1) * envelope_size;
1276
1277            // Zero reserved fields.
1278            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1279
1280            // Safety:
1281            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1282            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1283            //   envelope_size bytes, there is always sufficient room.
1284            fidl::encoding::encode_in_envelope_optional::<CompressionAlgorithm, D>(
1285                self.write_compression_algorithm
1286                    .as_ref()
1287                    .map(<CompressionAlgorithm as fidl::encoding::ValueTypeMarker>::borrow),
1288                encoder,
1289                offset + cur_offset,
1290                depth,
1291            )?;
1292
1293            _prev_end_offset = cur_offset + envelope_size;
1294            if 5 > max_ordinal {
1295                return Ok(());
1296            }
1297
1298            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1299            // are envelope_size bytes.
1300            let cur_offset: usize = (5 - 1) * envelope_size;
1301
1302            // Zero reserved fields.
1303            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1304
1305            // Safety:
1306            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1307            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1308            //   envelope_size bytes, there is always sufficient room.
1309            fidl::encoding::encode_in_envelope_optional::<i32, D>(
1310                self.write_compression_level
1311                    .as_ref()
1312                    .map(<i32 as fidl::encoding::ValueTypeMarker>::borrow),
1313                encoder,
1314                offset + cur_offset,
1315                depth,
1316            )?;
1317
1318            _prev_end_offset = cur_offset + envelope_size;
1319            if 6 > max_ordinal {
1320                return Ok(());
1321            }
1322
1323            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1324            // are envelope_size bytes.
1325            let cur_offset: usize = (6 - 1) * envelope_size;
1326
1327            // Zero reserved fields.
1328            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1329
1330            // Safety:
1331            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1332            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1333            //   envelope_size bytes, there is always sufficient room.
1334            fidl::encoding::encode_in_envelope_optional::<EvictionPolicyOverride, D>(
1335                self.cache_eviction_policy_override
1336                    .as_ref()
1337                    .map(<EvictionPolicyOverride as fidl::encoding::ValueTypeMarker>::borrow),
1338                encoder,
1339                offset + cur_offset,
1340                depth,
1341            )?;
1342
1343            _prev_end_offset = cur_offset + envelope_size;
1344            if 7 > 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 = (7 - 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::<u32, D>(
1360                self.startup_profiling_seconds
1361                    .as_ref()
1362                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1363                encoder,
1364                offset + cur_offset,
1365                depth,
1366            )?;
1367
1368            _prev_end_offset = cur_offset + envelope_size;
1369            if 8 > max_ordinal {
1370                return Ok(());
1371            }
1372
1373            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1374            // are envelope_size bytes.
1375            let cur_offset: usize = (8 - 1) * envelope_size;
1376
1377            // Zero reserved fields.
1378            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1379
1380            // Safety:
1381            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1382            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1383            //   envelope_size bytes, there is always sufficient room.
1384            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1385                self.inline_crypto_enabled
1386                    .as_ref()
1387                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1388                encoder,
1389                offset + cur_offset,
1390                depth,
1391            )?;
1392
1393            _prev_end_offset = cur_offset + envelope_size;
1394            if 9 > max_ordinal {
1395                return Ok(());
1396            }
1397
1398            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1399            // are envelope_size bytes.
1400            let cur_offset: usize = (9 - 1) * envelope_size;
1401
1402            // Zero reserved fields.
1403            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1404
1405            // Safety:
1406            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1407            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1408            //   envelope_size bytes, there is always sufficient room.
1409            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1410                self.barriers_enabled
1411                    .as_ref()
1412                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1413                encoder,
1414                offset + cur_offset,
1415                depth,
1416            )?;
1417
1418            _prev_end_offset = cur_offset + envelope_size;
1419
1420            Ok(())
1421        }
1422    }
1423
1424    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for StartOptions {
1425        #[inline(always)]
1426        fn new_empty() -> Self {
1427            Self::default()
1428        }
1429
1430        unsafe fn decode(
1431            &mut self,
1432            decoder: &mut fidl::encoding::Decoder<'_, D>,
1433            offset: usize,
1434            mut depth: fidl::encoding::Depth,
1435        ) -> fidl::Result<()> {
1436            decoder.debug_check_bounds::<Self>(offset);
1437            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1438                None => return Err(fidl::Error::NotNullable),
1439                Some(len) => len,
1440            };
1441            // Calling decoder.out_of_line_offset(0) is not allowed.
1442            if len == 0 {
1443                return Ok(());
1444            };
1445            depth.increment()?;
1446            let envelope_size = 8;
1447            let bytes_len = len * envelope_size;
1448            let offset = decoder.out_of_line_offset(bytes_len)?;
1449            // Decode the envelope for each type.
1450            let mut _next_ordinal_to_read = 0;
1451            let mut next_offset = offset;
1452            let end_offset = offset + bytes_len;
1453            _next_ordinal_to_read += 1;
1454            if next_offset >= end_offset {
1455                return Ok(());
1456            }
1457
1458            // Decode unknown envelopes for gaps in ordinals.
1459            while _next_ordinal_to_read < 1 {
1460                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1461                _next_ordinal_to_read += 1;
1462                next_offset += envelope_size;
1463            }
1464
1465            let next_out_of_line = decoder.next_out_of_line();
1466            let handles_before = decoder.remaining_handles();
1467            if let Some((inlined, num_bytes, num_handles)) =
1468                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1469            {
1470                let member_inline_size =
1471                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1472                if inlined != (member_inline_size <= 4) {
1473                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1474                }
1475                let inner_offset;
1476                let mut inner_depth = depth.clone();
1477                if inlined {
1478                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1479                    inner_offset = next_offset;
1480                } else {
1481                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1482                    inner_depth.increment()?;
1483                }
1484                let val_ref = self.read_only.get_or_insert_with(|| fidl::new_empty!(bool, D));
1485                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1486                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1487                {
1488                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1489                }
1490                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1491                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1492                }
1493            }
1494
1495            next_offset += envelope_size;
1496            _next_ordinal_to_read += 1;
1497            if next_offset >= end_offset {
1498                return Ok(());
1499            }
1500
1501            // Decode unknown envelopes for gaps in ordinals.
1502            while _next_ordinal_to_read < 2 {
1503                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1504                _next_ordinal_to_read += 1;
1505                next_offset += envelope_size;
1506            }
1507
1508            let next_out_of_line = decoder.next_out_of_line();
1509            let handles_before = decoder.remaining_handles();
1510            if let Some((inlined, num_bytes, num_handles)) =
1511                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1512            {
1513                let member_inline_size =
1514                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1515                if inlined != (member_inline_size <= 4) {
1516                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1517                }
1518                let inner_offset;
1519                let mut inner_depth = depth.clone();
1520                if inlined {
1521                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1522                    inner_offset = next_offset;
1523                } else {
1524                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1525                    inner_depth.increment()?;
1526                }
1527                let val_ref = self.verbose.get_or_insert_with(|| fidl::new_empty!(bool, D));
1528                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1529                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1530                {
1531                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1532                }
1533                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1534                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1535                }
1536            }
1537
1538            next_offset += envelope_size;
1539            _next_ordinal_to_read += 1;
1540            if next_offset >= end_offset {
1541                return Ok(());
1542            }
1543
1544            // Decode unknown envelopes for gaps in ordinals.
1545            while _next_ordinal_to_read < 3 {
1546                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1547                _next_ordinal_to_read += 1;
1548                next_offset += envelope_size;
1549            }
1550
1551            let next_out_of_line = decoder.next_out_of_line();
1552            let handles_before = decoder.remaining_handles();
1553            if let Some((inlined, num_bytes, num_handles)) =
1554                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1555            {
1556                let member_inline_size =
1557                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1558                if inlined != (member_inline_size <= 4) {
1559                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1560                }
1561                let inner_offset;
1562                let mut inner_depth = depth.clone();
1563                if inlined {
1564                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1565                    inner_offset = next_offset;
1566                } else {
1567                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1568                    inner_depth.increment()?;
1569                }
1570                let val_ref = self
1571                    .fsck_after_every_transaction
1572                    .get_or_insert_with(|| fidl::new_empty!(bool, D));
1573                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1574                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1575                {
1576                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1577                }
1578                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1579                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1580                }
1581            }
1582
1583            next_offset += envelope_size;
1584            _next_ordinal_to_read += 1;
1585            if next_offset >= end_offset {
1586                return Ok(());
1587            }
1588
1589            // Decode unknown envelopes for gaps in ordinals.
1590            while _next_ordinal_to_read < 4 {
1591                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1592                _next_ordinal_to_read += 1;
1593                next_offset += envelope_size;
1594            }
1595
1596            let next_out_of_line = decoder.next_out_of_line();
1597            let handles_before = decoder.remaining_handles();
1598            if let Some((inlined, num_bytes, num_handles)) =
1599                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1600            {
1601                let member_inline_size =
1602                    <CompressionAlgorithm as fidl::encoding::TypeMarker>::inline_size(
1603                        decoder.context,
1604                    );
1605                if inlined != (member_inline_size <= 4) {
1606                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1607                }
1608                let inner_offset;
1609                let mut inner_depth = depth.clone();
1610                if inlined {
1611                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1612                    inner_offset = next_offset;
1613                } else {
1614                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1615                    inner_depth.increment()?;
1616                }
1617                let val_ref = self
1618                    .write_compression_algorithm
1619                    .get_or_insert_with(|| fidl::new_empty!(CompressionAlgorithm, D));
1620                fidl::decode!(
1621                    CompressionAlgorithm,
1622                    D,
1623                    val_ref,
1624                    decoder,
1625                    inner_offset,
1626                    inner_depth
1627                )?;
1628                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1629                {
1630                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1631                }
1632                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1633                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1634                }
1635            }
1636
1637            next_offset += envelope_size;
1638            _next_ordinal_to_read += 1;
1639            if next_offset >= end_offset {
1640                return Ok(());
1641            }
1642
1643            // Decode unknown envelopes for gaps in ordinals.
1644            while _next_ordinal_to_read < 5 {
1645                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1646                _next_ordinal_to_read += 1;
1647                next_offset += envelope_size;
1648            }
1649
1650            let next_out_of_line = decoder.next_out_of_line();
1651            let handles_before = decoder.remaining_handles();
1652            if let Some((inlined, num_bytes, num_handles)) =
1653                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1654            {
1655                let member_inline_size =
1656                    <i32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1657                if inlined != (member_inline_size <= 4) {
1658                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1659                }
1660                let inner_offset;
1661                let mut inner_depth = depth.clone();
1662                if inlined {
1663                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1664                    inner_offset = next_offset;
1665                } else {
1666                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1667                    inner_depth.increment()?;
1668                }
1669                let val_ref =
1670                    self.write_compression_level.get_or_insert_with(|| fidl::new_empty!(i32, D));
1671                fidl::decode!(i32, D, val_ref, decoder, inner_offset, inner_depth)?;
1672                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1673                {
1674                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1675                }
1676                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1677                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1678                }
1679            }
1680
1681            next_offset += envelope_size;
1682            _next_ordinal_to_read += 1;
1683            if next_offset >= end_offset {
1684                return Ok(());
1685            }
1686
1687            // Decode unknown envelopes for gaps in ordinals.
1688            while _next_ordinal_to_read < 6 {
1689                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1690                _next_ordinal_to_read += 1;
1691                next_offset += envelope_size;
1692            }
1693
1694            let next_out_of_line = decoder.next_out_of_line();
1695            let handles_before = decoder.remaining_handles();
1696            if let Some((inlined, num_bytes, num_handles)) =
1697                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1698            {
1699                let member_inline_size =
1700                    <EvictionPolicyOverride as fidl::encoding::TypeMarker>::inline_size(
1701                        decoder.context,
1702                    );
1703                if inlined != (member_inline_size <= 4) {
1704                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1705                }
1706                let inner_offset;
1707                let mut inner_depth = depth.clone();
1708                if inlined {
1709                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1710                    inner_offset = next_offset;
1711                } else {
1712                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1713                    inner_depth.increment()?;
1714                }
1715                let val_ref = self
1716                    .cache_eviction_policy_override
1717                    .get_or_insert_with(|| fidl::new_empty!(EvictionPolicyOverride, D));
1718                fidl::decode!(
1719                    EvictionPolicyOverride,
1720                    D,
1721                    val_ref,
1722                    decoder,
1723                    inner_offset,
1724                    inner_depth
1725                )?;
1726                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1727                {
1728                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1729                }
1730                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1731                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1732                }
1733            }
1734
1735            next_offset += envelope_size;
1736            _next_ordinal_to_read += 1;
1737            if next_offset >= end_offset {
1738                return Ok(());
1739            }
1740
1741            // Decode unknown envelopes for gaps in ordinals.
1742            while _next_ordinal_to_read < 7 {
1743                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1744                _next_ordinal_to_read += 1;
1745                next_offset += envelope_size;
1746            }
1747
1748            let next_out_of_line = decoder.next_out_of_line();
1749            let handles_before = decoder.remaining_handles();
1750            if let Some((inlined, num_bytes, num_handles)) =
1751                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1752            {
1753                let member_inline_size =
1754                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1755                if inlined != (member_inline_size <= 4) {
1756                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1757                }
1758                let inner_offset;
1759                let mut inner_depth = depth.clone();
1760                if inlined {
1761                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1762                    inner_offset = next_offset;
1763                } else {
1764                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1765                    inner_depth.increment()?;
1766                }
1767                let val_ref =
1768                    self.startup_profiling_seconds.get_or_insert_with(|| fidl::new_empty!(u32, D));
1769                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1770                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1771                {
1772                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1773                }
1774                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1775                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1776                }
1777            }
1778
1779            next_offset += envelope_size;
1780            _next_ordinal_to_read += 1;
1781            if next_offset >= end_offset {
1782                return Ok(());
1783            }
1784
1785            // Decode unknown envelopes for gaps in ordinals.
1786            while _next_ordinal_to_read < 8 {
1787                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1788                _next_ordinal_to_read += 1;
1789                next_offset += envelope_size;
1790            }
1791
1792            let next_out_of_line = decoder.next_out_of_line();
1793            let handles_before = decoder.remaining_handles();
1794            if let Some((inlined, num_bytes, num_handles)) =
1795                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1796            {
1797                let member_inline_size =
1798                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1799                if inlined != (member_inline_size <= 4) {
1800                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1801                }
1802                let inner_offset;
1803                let mut inner_depth = depth.clone();
1804                if inlined {
1805                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1806                    inner_offset = next_offset;
1807                } else {
1808                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1809                    inner_depth.increment()?;
1810                }
1811                let val_ref =
1812                    self.inline_crypto_enabled.get_or_insert_with(|| fidl::new_empty!(bool, D));
1813                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1814                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1815                {
1816                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1817                }
1818                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1819                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1820                }
1821            }
1822
1823            next_offset += envelope_size;
1824            _next_ordinal_to_read += 1;
1825            if next_offset >= end_offset {
1826                return Ok(());
1827            }
1828
1829            // Decode unknown envelopes for gaps in ordinals.
1830            while _next_ordinal_to_read < 9 {
1831                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1832                _next_ordinal_to_read += 1;
1833                next_offset += envelope_size;
1834            }
1835
1836            let next_out_of_line = decoder.next_out_of_line();
1837            let handles_before = decoder.remaining_handles();
1838            if let Some((inlined, num_bytes, num_handles)) =
1839                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1840            {
1841                let member_inline_size =
1842                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1843                if inlined != (member_inline_size <= 4) {
1844                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1845                }
1846                let inner_offset;
1847                let mut inner_depth = depth.clone();
1848                if inlined {
1849                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1850                    inner_offset = next_offset;
1851                } else {
1852                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1853                    inner_depth.increment()?;
1854                }
1855                let val_ref =
1856                    self.barriers_enabled.get_or_insert_with(|| fidl::new_empty!(bool, D));
1857                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1858                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1859                {
1860                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1861                }
1862                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1863                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1864                }
1865            }
1866
1867            next_offset += envelope_size;
1868
1869            // Decode the remaining unknown envelopes.
1870            while next_offset < end_offset {
1871                _next_ordinal_to_read += 1;
1872                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1873                next_offset += envelope_size;
1874            }
1875
1876            Ok(())
1877        }
1878    }
1879}