use std::str::FromStr;
use enumflags2::make_bitflags;
use crate::Error;
use crate::constants;
use crate::AccessMask;
use crate::AccessMaskFlag;
grammar;
extern {
type Error = Error;
}
pub AccessMask: crate::AccessMask = {
<s:SingleAccessMask*> => s.into_iter().fold(crate::AccessMask::empty(), |v, a| v|a ),
<n:Number> =>? Ok(crate::AccessMask::try_from(n).map_err(|e| Error::from(e))?),
};
SingleAccessMask: crate::AccessMask = {
"GR" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::GENERIC_READ)),
"GW" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::GENERIC_WRITE)),
"GX" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::GENERIC_EXECUTE)),
"GA" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::GENERIC_ALL)),
"MA" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::MAXIMUM_ALLOWED)),
"AS" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::ACCESS_SYSTEM_SECURITY)),
"WO" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::WRITE_OWNER)),
"WD" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::WRITE_DACL)),
"RC" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::READ_CONTROL)),
"SD" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::STANDARD_DELETE)),
"CR" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::CONTROL_ACCESS)),
"CA" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_CONTROL_ACCESS),
"LO" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_LIST_OBJECT),
"DT" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_DELETE_TREE),
"WP" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_WRITE_PROP),
"RP" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_READ_PROP),
"SW" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_SELF),
"LC" => AccessMask::from_bitflag(constants::ADS_RIGHT_ACTRL_DS_LIST),
"DC" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_DELETE_CHILD),
"CC" => AccessMask::from_bitflag(constants::ADS_RIGHT_DS_CREATE_CHILD),
"NW" => AccessMask::from_bitflag(constants::SYSTEM_MANDATORY_LABEL_NO_WRITE_UP),
"NR" => AccessMask::from_bitflag(constants::SYSTEM_MANDATORY_LABEL_NO_READ_UP),
"NX" => AccessMask::from_bitflag(constants::SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP),
"FA" => constants::FILE_ALL,
"FR" => constants::FILE_READ,
"FW" => constants::FILE_WRITE,
"FX" => constants::FILE_EXECUTE,
"KA" => constants::KEY_ALL,
"KR" => constants::KEY_READ,
"KW" => constants::KEY_WRITE,
"KX" => constants::KEY_EXECUTE,
"SY" => AccessMask::from_bitflags(make_bitflags!(AccessMaskFlag::SYNCHRONIZE))
}
Number: u32 = {
<s:r#"0x[0-9a-fA-F]+"#> => {
u32::from_str_radix(&s[2..], 16).unwrap()
},
<s:r#"0[0-7]+"#> => {
u32::from_str_radix(s, 8).unwrap()
},
<s:r#"[1-9][0-9]*"#> => {
u32::from_str(s).unwrap()
}
}