sddl 0.1.9

a library to parse and analyse SDDL Strings
Documentation
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)
    }
}