fidl_fuchsia_settings_policy_common/
fidl_fuchsia_settings_policy_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 type PolicyId = u32;
12
13/// Common error code used across policies.
14#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
15#[repr(u32)]
16pub enum Error {
17    /// Generic internal failure.
18    Failed = 1,
19    /// The specified policy ID is not known.
20    ///
21    /// This may happen if another client removed a policy between a Get call
22    /// and a RemovePolicy call.
23    UnknownPolicy = 2,
24    /// The specified policy contradicts an existing policy.
25    ///
26    /// This may happen if another client added a policy between a Get call
27    /// and an AddPolicy call.
28    InvalidPolicy = 3,
29}
30
31impl Error {
32    #[inline]
33    pub fn from_primitive(prim: u32) -> Option<Self> {
34        match prim {
35            1 => Some(Self::Failed),
36            2 => Some(Self::UnknownPolicy),
37            3 => Some(Self::InvalidPolicy),
38            _ => None,
39        }
40    }
41
42    #[inline]
43    pub const fn into_primitive(self) -> u32 {
44        self as u32
45    }
46}
47
48/// Possible transforms for a policy target.
49///
50/// A transform is an operation that is applied to a policy property when the
51/// fuchsia.settings.Audio API is used. Multiple transforms of the same time can
52/// be active for a single property.
53#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
54#[repr(u8)]
55pub enum Transform {
56    /// Limits the maximum value of an audio stream to a certain level.
57    ///
58    /// Max volume limits are transparent to clients of fuchsia.settings.Audio.
59    /// Clients will always be able to set the volume to 1.0 (max) to prevent
60    /// user confusion about not being able to set the volume to max. The
61    /// internal volume, which is communicated to AudioCore to set the true
62    /// volume level, will always be clamped to the specified maximum.
63    ///
64    /// Externally, the volume percentage will always be a percentage of the max
65    /// allowed by policy. For example, if the max limit is set to 0.8, a client
66    /// setting the volume to 1.0 translates to 0.8 internally. An external
67    /// volume of 0.5 would be scaled to 0.4 internally.
68    ///
69    /// If a min volume limit is present, the minimum external volume will be
70    /// the min volume limit divided by the max volume limit. For example, if
71    /// the max volume limit is 0.8 and the min volume limit is 0.2, the lowest
72    /// possible external volume is 0.25, since 0.2 is 25% of 0.8. The min range
73    /// is not transparent to clients to prevent the confusion of volume being
74    /// at 0% but still being able to hear audio.
75    Max = 1,
76    /// Limits the minimum value of an audio stream to a certain level.
77    ///
78    /// If the volume is below the specified minimum level when the policy is
79    /// added, it will automatically be raised to the specified minimum. Calls
80    /// to set the volume below the minimum level will not fail, but the actual
81    /// volume will stay above the specified minimum level.
82    ///
83    /// Note that the minimum volume limit is a limit on the internal "true"
84    /// volume level. If a maximum volume policy is set, the minimum that
85    /// clients of fuchsia.settings.Audio will see is higher. See the
86    /// documentation of the MAX volume transform for more information.
87    Min = 2,
88}
89
90impl Transform {
91    #[inline]
92    pub fn from_primitive(prim: u8) -> Option<Self> {
93        match prim {
94            1 => Some(Self::Max),
95            2 => Some(Self::Min),
96            _ => None,
97        }
98    }
99
100    #[inline]
101    pub const fn into_primitive(self) -> u8 {
102        self as u8
103    }
104}
105
106/// Definition for a policy that is applied to the fuchsia.settings.Audio API.
107#[derive(Clone, Debug, Default, PartialEq)]
108pub struct Policy {
109    /// Unique identifier for this policy.
110    ///
111    /// Returned from AddPolicy and also used by RemovePolicy.
112    pub policy_id: Option<u32>,
113    /// Parameters for this policy.
114    pub parameters: Option<PolicyParameters>,
115    #[doc(hidden)]
116    pub __source_breaking: fidl::marker::SourceBreaking,
117}
118
119impl fidl::Persistable for Policy {}
120
121/// A controllable property of the fuchsia.settings.Audio API that can have
122/// transforms applied to it.
123#[derive(Clone, Debug, Default, PartialEq)]
124pub struct Property {
125    /// Unique aspect of settings that this property controls.
126    ///
127    /// Only one property may control any given target.
128    pub target: Option<Target>,
129    /// List of available transform types for this property.
130    pub available_transforms: Option<Vec<Transform>>,
131    /// List of active policies for this property.
132    pub active_policies: Option<Vec<Policy>>,
133    #[doc(hidden)]
134    pub __source_breaking: fidl::marker::SourceBreaking,
135}
136
137impl fidl::Persistable for Property {}
138
139#[derive(Clone, Debug, Default, PartialEq)]
140pub struct Volume {
141    /// A volume between 0.0 and 1.0 inclusive.
142    pub volume: Option<f32>,
143    #[doc(hidden)]
144    pub __source_breaking: fidl::marker::SourceBreaking,
145}
146
147impl fidl::Persistable for Volume {}
148
149/// Specifies the type of policy transform and its arguments.
150///
151/// The chosen union field implies the type of transform that the arguments
152/// apply to.
153#[derive(Clone, Debug, PartialEq)]
154pub enum PolicyParameters {
155    /// This parameter should be included for the MIN transform and specifies
156    /// the volume level to clamp the audio stream to.
157    Min(Volume),
158    /// This parameter should be included for the MAX transform and specifies
159    /// the volume level to clamp the audio stream to.
160    Max(Volume),
161}
162
163impl PolicyParameters {
164    #[inline]
165    pub fn ordinal(&self) -> u64 {
166        match *self {
167            Self::Min(_) => 1,
168            Self::Max(_) => 2,
169        }
170    }
171}
172
173impl fidl::Persistable for PolicyParameters {}
174
175/// Specifies what aspect of the settings a property controls.
176#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
177pub enum Target {
178    /// An audio stream that can have policies applied to it.
179    Stream(fidl_fuchsia_media::AudioRenderUsage),
180}
181
182impl Target {
183    #[inline]
184    pub fn ordinal(&self) -> u64 {
185        match *self {
186            Self::Stream(_) => 1,
187        }
188    }
189}
190
191impl fidl::Persistable for Target {}
192
193mod internal {
194    use super::*;
195    unsafe impl fidl::encoding::TypeMarker for Error {
196        type Owned = Self;
197
198        #[inline(always)]
199        fn inline_align(_context: fidl::encoding::Context) -> usize {
200            std::mem::align_of::<u32>()
201        }
202
203        #[inline(always)]
204        fn inline_size(_context: fidl::encoding::Context) -> usize {
205            std::mem::size_of::<u32>()
206        }
207
208        #[inline(always)]
209        fn encode_is_copy() -> bool {
210            true
211        }
212
213        #[inline(always)]
214        fn decode_is_copy() -> bool {
215            false
216        }
217    }
218
219    impl fidl::encoding::ValueTypeMarker for Error {
220        type Borrowed<'a> = Self;
221        #[inline(always)]
222        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
223            *value
224        }
225    }
226
227    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for Error {
228        #[inline]
229        unsafe fn encode(
230            self,
231            encoder: &mut fidl::encoding::Encoder<'_, D>,
232            offset: usize,
233            _depth: fidl::encoding::Depth,
234        ) -> fidl::Result<()> {
235            encoder.debug_check_bounds::<Self>(offset);
236            encoder.write_num(self.into_primitive(), offset);
237            Ok(())
238        }
239    }
240
241    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Error {
242        #[inline(always)]
243        fn new_empty() -> Self {
244            Self::Failed
245        }
246
247        #[inline]
248        unsafe fn decode(
249            &mut self,
250            decoder: &mut fidl::encoding::Decoder<'_, D>,
251            offset: usize,
252            _depth: fidl::encoding::Depth,
253        ) -> fidl::Result<()> {
254            decoder.debug_check_bounds::<Self>(offset);
255            let prim = decoder.read_num::<u32>(offset);
256
257            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
258            Ok(())
259        }
260    }
261    unsafe impl fidl::encoding::TypeMarker for Transform {
262        type Owned = Self;
263
264        #[inline(always)]
265        fn inline_align(_context: fidl::encoding::Context) -> usize {
266            std::mem::align_of::<u8>()
267        }
268
269        #[inline(always)]
270        fn inline_size(_context: fidl::encoding::Context) -> usize {
271            std::mem::size_of::<u8>()
272        }
273
274        #[inline(always)]
275        fn encode_is_copy() -> bool {
276            true
277        }
278
279        #[inline(always)]
280        fn decode_is_copy() -> bool {
281            false
282        }
283    }
284
285    impl fidl::encoding::ValueTypeMarker for Transform {
286        type Borrowed<'a> = Self;
287        #[inline(always)]
288        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
289            *value
290        }
291    }
292
293    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for Transform {
294        #[inline]
295        unsafe fn encode(
296            self,
297            encoder: &mut fidl::encoding::Encoder<'_, D>,
298            offset: usize,
299            _depth: fidl::encoding::Depth,
300        ) -> fidl::Result<()> {
301            encoder.debug_check_bounds::<Self>(offset);
302            encoder.write_num(self.into_primitive(), offset);
303            Ok(())
304        }
305    }
306
307    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Transform {
308        #[inline(always)]
309        fn new_empty() -> Self {
310            Self::Max
311        }
312
313        #[inline]
314        unsafe fn decode(
315            &mut self,
316            decoder: &mut fidl::encoding::Decoder<'_, D>,
317            offset: usize,
318            _depth: fidl::encoding::Depth,
319        ) -> fidl::Result<()> {
320            decoder.debug_check_bounds::<Self>(offset);
321            let prim = decoder.read_num::<u8>(offset);
322
323            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
324            Ok(())
325        }
326    }
327
328    impl Policy {
329        #[inline(always)]
330        fn max_ordinal_present(&self) -> u64 {
331            if let Some(_) = self.parameters {
332                return 2;
333            }
334            if let Some(_) = self.policy_id {
335                return 1;
336            }
337            0
338        }
339    }
340
341    impl fidl::encoding::ValueTypeMarker for Policy {
342        type Borrowed<'a> = &'a Self;
343        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
344            value
345        }
346    }
347
348    unsafe impl fidl::encoding::TypeMarker for Policy {
349        type Owned = Self;
350
351        #[inline(always)]
352        fn inline_align(_context: fidl::encoding::Context) -> usize {
353            8
354        }
355
356        #[inline(always)]
357        fn inline_size(_context: fidl::encoding::Context) -> usize {
358            16
359        }
360    }
361
362    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Policy, D> for &Policy {
363        unsafe fn encode(
364            self,
365            encoder: &mut fidl::encoding::Encoder<'_, D>,
366            offset: usize,
367            mut depth: fidl::encoding::Depth,
368        ) -> fidl::Result<()> {
369            encoder.debug_check_bounds::<Policy>(offset);
370            // Vector header
371            let max_ordinal: u64 = self.max_ordinal_present();
372            encoder.write_num(max_ordinal, offset);
373            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
374            // Calling encoder.out_of_line_offset(0) is not allowed.
375            if max_ordinal == 0 {
376                return Ok(());
377            }
378            depth.increment()?;
379            let envelope_size = 8;
380            let bytes_len = max_ordinal as usize * envelope_size;
381            #[allow(unused_variables)]
382            let offset = encoder.out_of_line_offset(bytes_len);
383            let mut _prev_end_offset: usize = 0;
384            if 1 > max_ordinal {
385                return Ok(());
386            }
387
388            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
389            // are envelope_size bytes.
390            let cur_offset: usize = (1 - 1) * envelope_size;
391
392            // Zero reserved fields.
393            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
394
395            // Safety:
396            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
397            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
398            //   envelope_size bytes, there is always sufficient room.
399            fidl::encoding::encode_in_envelope_optional::<u32, D>(
400                self.policy_id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
401                encoder,
402                offset + cur_offset,
403                depth,
404            )?;
405
406            _prev_end_offset = cur_offset + envelope_size;
407            if 2 > max_ordinal {
408                return Ok(());
409            }
410
411            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
412            // are envelope_size bytes.
413            let cur_offset: usize = (2 - 1) * envelope_size;
414
415            // Zero reserved fields.
416            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
417
418            // Safety:
419            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
420            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
421            //   envelope_size bytes, there is always sufficient room.
422            fidl::encoding::encode_in_envelope_optional::<PolicyParameters, D>(
423                self.parameters
424                    .as_ref()
425                    .map(<PolicyParameters as fidl::encoding::ValueTypeMarker>::borrow),
426                encoder,
427                offset + cur_offset,
428                depth,
429            )?;
430
431            _prev_end_offset = cur_offset + envelope_size;
432
433            Ok(())
434        }
435    }
436
437    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Policy {
438        #[inline(always)]
439        fn new_empty() -> Self {
440            Self::default()
441        }
442
443        unsafe fn decode(
444            &mut self,
445            decoder: &mut fidl::encoding::Decoder<'_, D>,
446            offset: usize,
447            mut depth: fidl::encoding::Depth,
448        ) -> fidl::Result<()> {
449            decoder.debug_check_bounds::<Self>(offset);
450            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
451                None => return Err(fidl::Error::NotNullable),
452                Some(len) => len,
453            };
454            // Calling decoder.out_of_line_offset(0) is not allowed.
455            if len == 0 {
456                return Ok(());
457            };
458            depth.increment()?;
459            let envelope_size = 8;
460            let bytes_len = len * envelope_size;
461            let offset = decoder.out_of_line_offset(bytes_len)?;
462            // Decode the envelope for each type.
463            let mut _next_ordinal_to_read = 0;
464            let mut next_offset = offset;
465            let end_offset = offset + bytes_len;
466            _next_ordinal_to_read += 1;
467            if next_offset >= end_offset {
468                return Ok(());
469            }
470
471            // Decode unknown envelopes for gaps in ordinals.
472            while _next_ordinal_to_read < 1 {
473                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
474                _next_ordinal_to_read += 1;
475                next_offset += envelope_size;
476            }
477
478            let next_out_of_line = decoder.next_out_of_line();
479            let handles_before = decoder.remaining_handles();
480            if let Some((inlined, num_bytes, num_handles)) =
481                fidl::encoding::decode_envelope_header(decoder, next_offset)?
482            {
483                let member_inline_size =
484                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
485                if inlined != (member_inline_size <= 4) {
486                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
487                }
488                let inner_offset;
489                let mut inner_depth = depth.clone();
490                if inlined {
491                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
492                    inner_offset = next_offset;
493                } else {
494                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
495                    inner_depth.increment()?;
496                }
497                let val_ref = self.policy_id.get_or_insert_with(|| fidl::new_empty!(u32, D));
498                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
499                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
500                {
501                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
502                }
503                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
504                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
505                }
506            }
507
508            next_offset += envelope_size;
509            _next_ordinal_to_read += 1;
510            if next_offset >= end_offset {
511                return Ok(());
512            }
513
514            // Decode unknown envelopes for gaps in ordinals.
515            while _next_ordinal_to_read < 2 {
516                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
517                _next_ordinal_to_read += 1;
518                next_offset += envelope_size;
519            }
520
521            let next_out_of_line = decoder.next_out_of_line();
522            let handles_before = decoder.remaining_handles();
523            if let Some((inlined, num_bytes, num_handles)) =
524                fidl::encoding::decode_envelope_header(decoder, next_offset)?
525            {
526                let member_inline_size =
527                    <PolicyParameters as fidl::encoding::TypeMarker>::inline_size(decoder.context);
528                if inlined != (member_inline_size <= 4) {
529                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
530                }
531                let inner_offset;
532                let mut inner_depth = depth.clone();
533                if inlined {
534                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
535                    inner_offset = next_offset;
536                } else {
537                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
538                    inner_depth.increment()?;
539                }
540                let val_ref =
541                    self.parameters.get_or_insert_with(|| fidl::new_empty!(PolicyParameters, D));
542                fidl::decode!(PolicyParameters, D, val_ref, decoder, inner_offset, inner_depth)?;
543                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
544                {
545                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
546                }
547                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
548                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
549                }
550            }
551
552            next_offset += envelope_size;
553
554            // Decode the remaining unknown envelopes.
555            while next_offset < end_offset {
556                _next_ordinal_to_read += 1;
557                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
558                next_offset += envelope_size;
559            }
560
561            Ok(())
562        }
563    }
564
565    impl Property {
566        #[inline(always)]
567        fn max_ordinal_present(&self) -> u64 {
568            if let Some(_) = self.active_policies {
569                return 3;
570            }
571            if let Some(_) = self.available_transforms {
572                return 2;
573            }
574            if let Some(_) = self.target {
575                return 1;
576            }
577            0
578        }
579    }
580
581    impl fidl::encoding::ValueTypeMarker for Property {
582        type Borrowed<'a> = &'a Self;
583        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
584            value
585        }
586    }
587
588    unsafe impl fidl::encoding::TypeMarker for Property {
589        type Owned = Self;
590
591        #[inline(always)]
592        fn inline_align(_context: fidl::encoding::Context) -> usize {
593            8
594        }
595
596        #[inline(always)]
597        fn inline_size(_context: fidl::encoding::Context) -> usize {
598            16
599        }
600    }
601
602    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Property, D> for &Property {
603        unsafe fn encode(
604            self,
605            encoder: &mut fidl::encoding::Encoder<'_, D>,
606            offset: usize,
607            mut depth: fidl::encoding::Depth,
608        ) -> fidl::Result<()> {
609            encoder.debug_check_bounds::<Property>(offset);
610            // Vector header
611            let max_ordinal: u64 = self.max_ordinal_present();
612            encoder.write_num(max_ordinal, offset);
613            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
614            // Calling encoder.out_of_line_offset(0) is not allowed.
615            if max_ordinal == 0 {
616                return Ok(());
617            }
618            depth.increment()?;
619            let envelope_size = 8;
620            let bytes_len = max_ordinal as usize * envelope_size;
621            #[allow(unused_variables)]
622            let offset = encoder.out_of_line_offset(bytes_len);
623            let mut _prev_end_offset: usize = 0;
624            if 1 > max_ordinal {
625                return Ok(());
626            }
627
628            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
629            // are envelope_size bytes.
630            let cur_offset: usize = (1 - 1) * envelope_size;
631
632            // Zero reserved fields.
633            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
634
635            // Safety:
636            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
637            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
638            //   envelope_size bytes, there is always sufficient room.
639            fidl::encoding::encode_in_envelope_optional::<Target, D>(
640                self.target.as_ref().map(<Target as fidl::encoding::ValueTypeMarker>::borrow),
641                encoder,
642                offset + cur_offset,
643                depth,
644            )?;
645
646            _prev_end_offset = cur_offset + envelope_size;
647            if 2 > max_ordinal {
648                return Ok(());
649            }
650
651            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
652            // are envelope_size bytes.
653            let cur_offset: usize = (2 - 1) * envelope_size;
654
655            // Zero reserved fields.
656            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
657
658            // Safety:
659            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
660            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
661            //   envelope_size bytes, there is always sufficient room.
662            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<Transform>, D>(
663            self.available_transforms.as_ref().map(<fidl::encoding::UnboundedVector<Transform> as fidl::encoding::ValueTypeMarker>::borrow),
664            encoder, offset + cur_offset, depth
665        )?;
666
667            _prev_end_offset = cur_offset + envelope_size;
668            if 3 > max_ordinal {
669                return Ok(());
670            }
671
672            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
673            // are envelope_size bytes.
674            let cur_offset: usize = (3 - 1) * envelope_size;
675
676            // Zero reserved fields.
677            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
678
679            // Safety:
680            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
681            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
682            //   envelope_size bytes, there is always sufficient room.
683            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<Policy>, D>(
684            self.active_policies.as_ref().map(<fidl::encoding::UnboundedVector<Policy> as fidl::encoding::ValueTypeMarker>::borrow),
685            encoder, offset + cur_offset, depth
686        )?;
687
688            _prev_end_offset = cur_offset + envelope_size;
689
690            Ok(())
691        }
692    }
693
694    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Property {
695        #[inline(always)]
696        fn new_empty() -> Self {
697            Self::default()
698        }
699
700        unsafe fn decode(
701            &mut self,
702            decoder: &mut fidl::encoding::Decoder<'_, D>,
703            offset: usize,
704            mut depth: fidl::encoding::Depth,
705        ) -> fidl::Result<()> {
706            decoder.debug_check_bounds::<Self>(offset);
707            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
708                None => return Err(fidl::Error::NotNullable),
709                Some(len) => len,
710            };
711            // Calling decoder.out_of_line_offset(0) is not allowed.
712            if len == 0 {
713                return Ok(());
714            };
715            depth.increment()?;
716            let envelope_size = 8;
717            let bytes_len = len * envelope_size;
718            let offset = decoder.out_of_line_offset(bytes_len)?;
719            // Decode the envelope for each type.
720            let mut _next_ordinal_to_read = 0;
721            let mut next_offset = offset;
722            let end_offset = offset + bytes_len;
723            _next_ordinal_to_read += 1;
724            if next_offset >= end_offset {
725                return Ok(());
726            }
727
728            // Decode unknown envelopes for gaps in ordinals.
729            while _next_ordinal_to_read < 1 {
730                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
731                _next_ordinal_to_read += 1;
732                next_offset += envelope_size;
733            }
734
735            let next_out_of_line = decoder.next_out_of_line();
736            let handles_before = decoder.remaining_handles();
737            if let Some((inlined, num_bytes, num_handles)) =
738                fidl::encoding::decode_envelope_header(decoder, next_offset)?
739            {
740                let member_inline_size =
741                    <Target as fidl::encoding::TypeMarker>::inline_size(decoder.context);
742                if inlined != (member_inline_size <= 4) {
743                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
744                }
745                let inner_offset;
746                let mut inner_depth = depth.clone();
747                if inlined {
748                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
749                    inner_offset = next_offset;
750                } else {
751                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
752                    inner_depth.increment()?;
753                }
754                let val_ref = self.target.get_or_insert_with(|| fidl::new_empty!(Target, D));
755                fidl::decode!(Target, D, val_ref, decoder, inner_offset, inner_depth)?;
756                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
757                {
758                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
759                }
760                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
761                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
762                }
763            }
764
765            next_offset += envelope_size;
766            _next_ordinal_to_read += 1;
767            if next_offset >= end_offset {
768                return Ok(());
769            }
770
771            // Decode unknown envelopes for gaps in ordinals.
772            while _next_ordinal_to_read < 2 {
773                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
774                _next_ordinal_to_read += 1;
775                next_offset += envelope_size;
776            }
777
778            let next_out_of_line = decoder.next_out_of_line();
779            let handles_before = decoder.remaining_handles();
780            if let Some((inlined, num_bytes, num_handles)) =
781                fidl::encoding::decode_envelope_header(decoder, next_offset)?
782            {
783                let member_inline_size = <fidl::encoding::UnboundedVector<Transform> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
784                if inlined != (member_inline_size <= 4) {
785                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
786                }
787                let inner_offset;
788                let mut inner_depth = depth.clone();
789                if inlined {
790                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
791                    inner_offset = next_offset;
792                } else {
793                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
794                    inner_depth.increment()?;
795                }
796                let val_ref = self.available_transforms.get_or_insert_with(|| {
797                    fidl::new_empty!(fidl::encoding::UnboundedVector<Transform>, D)
798                });
799                fidl::decode!(
800                    fidl::encoding::UnboundedVector<Transform>,
801                    D,
802                    val_ref,
803                    decoder,
804                    inner_offset,
805                    inner_depth
806                )?;
807                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
808                {
809                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
810                }
811                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
812                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
813                }
814            }
815
816            next_offset += envelope_size;
817            _next_ordinal_to_read += 1;
818            if next_offset >= end_offset {
819                return Ok(());
820            }
821
822            // Decode unknown envelopes for gaps in ordinals.
823            while _next_ordinal_to_read < 3 {
824                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
825                _next_ordinal_to_read += 1;
826                next_offset += envelope_size;
827            }
828
829            let next_out_of_line = decoder.next_out_of_line();
830            let handles_before = decoder.remaining_handles();
831            if let Some((inlined, num_bytes, num_handles)) =
832                fidl::encoding::decode_envelope_header(decoder, next_offset)?
833            {
834                let member_inline_size = <fidl::encoding::UnboundedVector<Policy> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
835                if inlined != (member_inline_size <= 4) {
836                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
837                }
838                let inner_offset;
839                let mut inner_depth = depth.clone();
840                if inlined {
841                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
842                    inner_offset = next_offset;
843                } else {
844                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
845                    inner_depth.increment()?;
846                }
847                let val_ref = self.active_policies.get_or_insert_with(|| {
848                    fidl::new_empty!(fidl::encoding::UnboundedVector<Policy>, D)
849                });
850                fidl::decode!(
851                    fidl::encoding::UnboundedVector<Policy>,
852                    D,
853                    val_ref,
854                    decoder,
855                    inner_offset,
856                    inner_depth
857                )?;
858                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
859                {
860                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
861                }
862                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
863                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
864                }
865            }
866
867            next_offset += envelope_size;
868
869            // Decode the remaining unknown envelopes.
870            while next_offset < end_offset {
871                _next_ordinal_to_read += 1;
872                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
873                next_offset += envelope_size;
874            }
875
876            Ok(())
877        }
878    }
879
880    impl Volume {
881        #[inline(always)]
882        fn max_ordinal_present(&self) -> u64 {
883            if let Some(_) = self.volume {
884                return 1;
885            }
886            0
887        }
888    }
889
890    impl fidl::encoding::ValueTypeMarker for Volume {
891        type Borrowed<'a> = &'a Self;
892        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
893            value
894        }
895    }
896
897    unsafe impl fidl::encoding::TypeMarker for Volume {
898        type Owned = Self;
899
900        #[inline(always)]
901        fn inline_align(_context: fidl::encoding::Context) -> usize {
902            8
903        }
904
905        #[inline(always)]
906        fn inline_size(_context: fidl::encoding::Context) -> usize {
907            16
908        }
909    }
910
911    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Volume, D> for &Volume {
912        unsafe fn encode(
913            self,
914            encoder: &mut fidl::encoding::Encoder<'_, D>,
915            offset: usize,
916            mut depth: fidl::encoding::Depth,
917        ) -> fidl::Result<()> {
918            encoder.debug_check_bounds::<Volume>(offset);
919            // Vector header
920            let max_ordinal: u64 = self.max_ordinal_present();
921            encoder.write_num(max_ordinal, offset);
922            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
923            // Calling encoder.out_of_line_offset(0) is not allowed.
924            if max_ordinal == 0 {
925                return Ok(());
926            }
927            depth.increment()?;
928            let envelope_size = 8;
929            let bytes_len = max_ordinal as usize * envelope_size;
930            #[allow(unused_variables)]
931            let offset = encoder.out_of_line_offset(bytes_len);
932            let mut _prev_end_offset: usize = 0;
933            if 1 > max_ordinal {
934                return Ok(());
935            }
936
937            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
938            // are envelope_size bytes.
939            let cur_offset: usize = (1 - 1) * envelope_size;
940
941            // Zero reserved fields.
942            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
943
944            // Safety:
945            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
946            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
947            //   envelope_size bytes, there is always sufficient room.
948            fidl::encoding::encode_in_envelope_optional::<f32, D>(
949                self.volume.as_ref().map(<f32 as fidl::encoding::ValueTypeMarker>::borrow),
950                encoder,
951                offset + cur_offset,
952                depth,
953            )?;
954
955            _prev_end_offset = cur_offset + envelope_size;
956
957            Ok(())
958        }
959    }
960
961    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Volume {
962        #[inline(always)]
963        fn new_empty() -> Self {
964            Self::default()
965        }
966
967        unsafe fn decode(
968            &mut self,
969            decoder: &mut fidl::encoding::Decoder<'_, D>,
970            offset: usize,
971            mut depth: fidl::encoding::Depth,
972        ) -> fidl::Result<()> {
973            decoder.debug_check_bounds::<Self>(offset);
974            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
975                None => return Err(fidl::Error::NotNullable),
976                Some(len) => len,
977            };
978            // Calling decoder.out_of_line_offset(0) is not allowed.
979            if len == 0 {
980                return Ok(());
981            };
982            depth.increment()?;
983            let envelope_size = 8;
984            let bytes_len = len * envelope_size;
985            let offset = decoder.out_of_line_offset(bytes_len)?;
986            // Decode the envelope for each type.
987            let mut _next_ordinal_to_read = 0;
988            let mut next_offset = offset;
989            let end_offset = offset + bytes_len;
990            _next_ordinal_to_read += 1;
991            if next_offset >= end_offset {
992                return Ok(());
993            }
994
995            // Decode unknown envelopes for gaps in ordinals.
996            while _next_ordinal_to_read < 1 {
997                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
998                _next_ordinal_to_read += 1;
999                next_offset += envelope_size;
1000            }
1001
1002            let next_out_of_line = decoder.next_out_of_line();
1003            let handles_before = decoder.remaining_handles();
1004            if let Some((inlined, num_bytes, num_handles)) =
1005                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1006            {
1007                let member_inline_size =
1008                    <f32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1009                if inlined != (member_inline_size <= 4) {
1010                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1011                }
1012                let inner_offset;
1013                let mut inner_depth = depth.clone();
1014                if inlined {
1015                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1016                    inner_offset = next_offset;
1017                } else {
1018                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1019                    inner_depth.increment()?;
1020                }
1021                let val_ref = self.volume.get_or_insert_with(|| fidl::new_empty!(f32, D));
1022                fidl::decode!(f32, D, val_ref, decoder, inner_offset, inner_depth)?;
1023                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1024                {
1025                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1026                }
1027                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1028                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1029                }
1030            }
1031
1032            next_offset += envelope_size;
1033
1034            // Decode the remaining unknown envelopes.
1035            while next_offset < end_offset {
1036                _next_ordinal_to_read += 1;
1037                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1038                next_offset += envelope_size;
1039            }
1040
1041            Ok(())
1042        }
1043    }
1044
1045    impl fidl::encoding::ValueTypeMarker for PolicyParameters {
1046        type Borrowed<'a> = &'a Self;
1047        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1048            value
1049        }
1050    }
1051
1052    unsafe impl fidl::encoding::TypeMarker for PolicyParameters {
1053        type Owned = Self;
1054
1055        #[inline(always)]
1056        fn inline_align(_context: fidl::encoding::Context) -> usize {
1057            8
1058        }
1059
1060        #[inline(always)]
1061        fn inline_size(_context: fidl::encoding::Context) -> usize {
1062            16
1063        }
1064    }
1065
1066    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PolicyParameters, D>
1067        for &PolicyParameters
1068    {
1069        #[inline]
1070        unsafe fn encode(
1071            self,
1072            encoder: &mut fidl::encoding::Encoder<'_, D>,
1073            offset: usize,
1074            _depth: fidl::encoding::Depth,
1075        ) -> fidl::Result<()> {
1076            encoder.debug_check_bounds::<PolicyParameters>(offset);
1077            encoder.write_num::<u64>(self.ordinal(), offset);
1078            match self {
1079                PolicyParameters::Min(ref val) => fidl::encoding::encode_in_envelope::<Volume, D>(
1080                    <Volume as fidl::encoding::ValueTypeMarker>::borrow(val),
1081                    encoder,
1082                    offset + 8,
1083                    _depth,
1084                ),
1085                PolicyParameters::Max(ref val) => fidl::encoding::encode_in_envelope::<Volume, D>(
1086                    <Volume as fidl::encoding::ValueTypeMarker>::borrow(val),
1087                    encoder,
1088                    offset + 8,
1089                    _depth,
1090                ),
1091            }
1092        }
1093    }
1094
1095    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PolicyParameters {
1096        #[inline(always)]
1097        fn new_empty() -> Self {
1098            Self::Min(fidl::new_empty!(Volume, D))
1099        }
1100
1101        #[inline]
1102        unsafe fn decode(
1103            &mut self,
1104            decoder: &mut fidl::encoding::Decoder<'_, D>,
1105            offset: usize,
1106            mut depth: fidl::encoding::Depth,
1107        ) -> fidl::Result<()> {
1108            decoder.debug_check_bounds::<Self>(offset);
1109            #[allow(unused_variables)]
1110            let next_out_of_line = decoder.next_out_of_line();
1111            let handles_before = decoder.remaining_handles();
1112            let (ordinal, inlined, num_bytes, num_handles) =
1113                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
1114
1115            let member_inline_size = match ordinal {
1116                1 => <Volume as fidl::encoding::TypeMarker>::inline_size(decoder.context),
1117                2 => <Volume as fidl::encoding::TypeMarker>::inline_size(decoder.context),
1118                _ => return Err(fidl::Error::UnknownUnionTag),
1119            };
1120
1121            if inlined != (member_inline_size <= 4) {
1122                return Err(fidl::Error::InvalidInlineBitInEnvelope);
1123            }
1124            let _inner_offset;
1125            if inlined {
1126                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
1127                _inner_offset = offset + 8;
1128            } else {
1129                depth.increment()?;
1130                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1131            }
1132            match ordinal {
1133                1 => {
1134                    #[allow(irrefutable_let_patterns)]
1135                    if let PolicyParameters::Min(_) = self {
1136                        // Do nothing, read the value into the object
1137                    } else {
1138                        // Initialize `self` to the right variant
1139                        *self = PolicyParameters::Min(fidl::new_empty!(Volume, D));
1140                    }
1141                    #[allow(irrefutable_let_patterns)]
1142                    if let PolicyParameters::Min(ref mut val) = self {
1143                        fidl::decode!(Volume, D, val, decoder, _inner_offset, depth)?;
1144                    } else {
1145                        unreachable!()
1146                    }
1147                }
1148                2 => {
1149                    #[allow(irrefutable_let_patterns)]
1150                    if let PolicyParameters::Max(_) = self {
1151                        // Do nothing, read the value into the object
1152                    } else {
1153                        // Initialize `self` to the right variant
1154                        *self = PolicyParameters::Max(fidl::new_empty!(Volume, D));
1155                    }
1156                    #[allow(irrefutable_let_patterns)]
1157                    if let PolicyParameters::Max(ref mut val) = self {
1158                        fidl::decode!(Volume, D, val, decoder, _inner_offset, depth)?;
1159                    } else {
1160                        unreachable!()
1161                    }
1162                }
1163                ordinal => panic!("unexpected ordinal {:?}", ordinal),
1164            }
1165            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
1166                return Err(fidl::Error::InvalidNumBytesInEnvelope);
1167            }
1168            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1169                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1170            }
1171            Ok(())
1172        }
1173    }
1174
1175    impl fidl::encoding::ValueTypeMarker for Target {
1176        type Borrowed<'a> = &'a Self;
1177        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1178            value
1179        }
1180    }
1181
1182    unsafe impl fidl::encoding::TypeMarker for Target {
1183        type Owned = Self;
1184
1185        #[inline(always)]
1186        fn inline_align(_context: fidl::encoding::Context) -> usize {
1187            8
1188        }
1189
1190        #[inline(always)]
1191        fn inline_size(_context: fidl::encoding::Context) -> usize {
1192            16
1193        }
1194    }
1195
1196    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Target, D> for &Target {
1197        #[inline]
1198        unsafe fn encode(
1199            self,
1200            encoder: &mut fidl::encoding::Encoder<'_, D>,
1201            offset: usize,
1202            _depth: fidl::encoding::Depth,
1203        ) -> fidl::Result<()> {
1204            encoder.debug_check_bounds::<Target>(offset);
1205            encoder.write_num::<u64>(self.ordinal(), offset);
1206            match self {
1207            Target::Stream(ref val) => {
1208                fidl::encoding::encode_in_envelope::<fidl_fuchsia_media::AudioRenderUsage, D>(
1209                    <fidl_fuchsia_media::AudioRenderUsage as fidl::encoding::ValueTypeMarker>::borrow(val),
1210                    encoder, offset + 8, _depth
1211                )
1212            }
1213        }
1214        }
1215    }
1216
1217    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Target {
1218        #[inline(always)]
1219        fn new_empty() -> Self {
1220            Self::Stream(fidl::new_empty!(fidl_fuchsia_media::AudioRenderUsage, D))
1221        }
1222
1223        #[inline]
1224        unsafe fn decode(
1225            &mut self,
1226            decoder: &mut fidl::encoding::Decoder<'_, D>,
1227            offset: usize,
1228            mut depth: fidl::encoding::Depth,
1229        ) -> fidl::Result<()> {
1230            decoder.debug_check_bounds::<Self>(offset);
1231            #[allow(unused_variables)]
1232            let next_out_of_line = decoder.next_out_of_line();
1233            let handles_before = decoder.remaining_handles();
1234            let (ordinal, inlined, num_bytes, num_handles) =
1235                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
1236
1237            let member_inline_size = match ordinal {
1238            1 => <fidl_fuchsia_media::AudioRenderUsage as fidl::encoding::TypeMarker>::inline_size(decoder.context),
1239            _ => return Err(fidl::Error::UnknownUnionTag),
1240        };
1241
1242            if inlined != (member_inline_size <= 4) {
1243                return Err(fidl::Error::InvalidInlineBitInEnvelope);
1244            }
1245            let _inner_offset;
1246            if inlined {
1247                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
1248                _inner_offset = offset + 8;
1249            } else {
1250                depth.increment()?;
1251                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1252            }
1253            match ordinal {
1254                1 => {
1255                    #[allow(irrefutable_let_patterns)]
1256                    if let Target::Stream(_) = self {
1257                        // Do nothing, read the value into the object
1258                    } else {
1259                        // Initialize `self` to the right variant
1260                        *self = Target::Stream(fidl::new_empty!(
1261                            fidl_fuchsia_media::AudioRenderUsage,
1262                            D
1263                        ));
1264                    }
1265                    #[allow(irrefutable_let_patterns)]
1266                    if let Target::Stream(ref mut val) = self {
1267                        fidl::decode!(
1268                            fidl_fuchsia_media::AudioRenderUsage,
1269                            D,
1270                            val,
1271                            decoder,
1272                            _inner_offset,
1273                            depth
1274                        )?;
1275                    } else {
1276                        unreachable!()
1277                    }
1278                }
1279                ordinal => panic!("unexpected ordinal {:?}", ordinal),
1280            }
1281            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
1282                return Err(fidl::Error::InvalidNumBytesInEnvelope);
1283            }
1284            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1285                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1286            }
1287            Ok(())
1288        }
1289    }
1290}