use binrw::{BinRead, BinReaderExt, BinWrite, BinWriterExt};
use enumflags2::{bitflags, BitFlags};
use serde::Serialize;
use crate::*;
#[bitflags]
#[derive(Eq, PartialEq, Clone, Copy, Debug, Serialize)]
#[repr(u32)]
#[allow(non_camel_case_types)]
pub enum Flag {
ACE_OBJECT_TYPE_PRESENT = 0x00000001,
ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x00000002,
}
#[derive(Eq, PartialEq, Clone, Copy, Debug, Serialize)]
pub struct Flags(BitFlags<Flag, u32>);
impl Flags {
pub const EMPTY: Flags = Self(BitFlags::<Flag, u32>::EMPTY);
}
impl From<BitFlags<Flag, u32>> for Flags {
fn from(value: BitFlags<Flag, u32>) -> Self {
Self(value)
}
}
impl AsRef<BitFlags<Flag, u32>> for Flags {
fn as_ref(&self) -> &BitFlags<Flag, u32> {
&self.0
}
}
impl RawSize for Flags {
fn raw_size(&self) -> u16 {
std::mem::size_of::<Flags>() as u16
}
}
impl BinRead for Flags {
type Args<'a> = ();
fn read_options<R: std::io::Read + std::io::Seek>(
reader: &mut R,
endian: binrw::Endian,
args: Self::Args<'_>,
) -> binrw::BinResult<Self> {
let raw_value: u32 = reader.read_type_args(endian, args)?;
Ok(Self(BitFlags::<Flag, u32>::from_bits(raw_value).unwrap()))
}
}
impl BinWrite for Flags {
type Args<'a> = ();
fn write_options<W: std::io::Write + std::io::Seek>(
&self,
writer: &mut W,
endian: binrw::Endian,
args: Self::Args<'_>,
) -> binrw::BinResult<()> {
let raw_value = self.0.bits();
writer.write_type_args(&raw_value, endian, args)
}
}