{{/*
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
*/}}

{{- define "BitsDeclaration" }}
bitflags! {
    {{- range .DocComments }}
    ///{{ . }}
    {{- end }}
    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
    pub struct {{ .Name }}: {{ .UnderlyingType }} {
        {{- range .Members }}
        {{- range .DocComments }}
        ///{{ . }}
        {{- end }}
        const {{ .Name }} = {{ .Value }};
        {{- end }}
    }
}

impl {{ .Name }} {
    {{- if not .IsStrict }}
    #[inline(always)]
    pub fn from_bits_allow_unknown(bits: {{ .UnderlyingType }}) -> Self {
        Self::from_bits_retain(bits)
    }

    #[inline(always)]
    pub fn has_unknown_bits(&self) -> bool {
        self.get_unknown_bits() != 0
    }

    #[inline(always)]
    pub fn get_unknown_bits(&self) -> {{ .UnderlyingType }} {
        self.bits() & !Self::all().bits()
    }
    {{- end }}
}
{{ end }}

{{- define "BitsInternal" -}}
unsafe impl fidl::encoding::TypeMarker for {{ .Name }} {
    type Owned = Self;

    #[inline(always)]
    fn inline_align(_context: fidl::encoding::Context) -> usize {
        {{ .Type.TypeShapeV2.Alignment }}
    }

    #[inline(always)]
    fn inline_size(_context: fidl::encoding::Context) -> usize {
        {{ .Type.TypeShapeV2.InlineSize }}
    }
}

impl fidl::encoding::ValueTypeMarker for {{ .Name }} {
    type Borrowed<'a> = Self;
    #[inline(always)]
    fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
        *value
    }
}

unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for {{ .Name }} {
    #[inline]
    unsafe fn encode(self, encoder: &mut fidl::encoding::Encoder<'_, D>, offset: usize, _depth: fidl::encoding::Depth) -> fidl::Result<()> {
        encoder.debug_check_bounds::<Self>(offset);
        {{- if .IsStrict }}
        if self.bits() & Self::all().bits() != self.bits() {
            return Err(fidl::Error::InvalidBitsValue);
        }
        {{- end }}
        encoder.write_num(self.bits(), offset);
        Ok(())
    }
}

impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for {{ .Name }} {
    #[inline(always)]
    fn new_empty() -> Self {
        Self::empty()
    }

    #[inline]
    unsafe fn decode(&mut self, decoder: &mut fidl::encoding::Decoder<'_, D>, offset: usize, _depth: fidl::encoding::Depth) -> fidl::Result<()> {
        decoder.debug_check_bounds::<Self>(offset);
        let prim = decoder.read_num::<{{ .UnderlyingType }}>(offset);
        {{- if .IsStrict }}
        *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
        {{- else }}
        *self = Self::from_bits_allow_unknown(prim);
        {{- end }}
        Ok(())
    }
}
{{- end }}
