use bitflags::bitflags;
use field_names::FieldNames;
use serde::Serialize;
use crate::do_flat_serialization;
bitflags! {
#[derive(FieldNames)]
pub (crate) struct UserAccountControl : u32 {
const ADS_UF_SCRIPT = 0x0000_0001;
const ADS_UF_ACCOUNTDISABLE = 0x0000_0002;
const ADS_UF_HOMEDIR_REQUIRED = 0x0000_0008;
const ADS_UF_LOCKOUT = 0x0000_0010;
const ADS_UF_PASSWD_NOTREQD = 0x0000_0020;
const ADS_UF_PASSWD_CANT_CHANGE = 0x0000_0040;
const ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0x0000_0080;
const ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0x0000_0100;
const ADS_UF_NORMAL_ACCOUNT = 0x0000_0200;
const ADS_UF_INTERDOMAIN_TRUST_ACCOUNT = 0x0000_0800;
const ADS_UF_WORKSTATION_TRUST_ACCOUNT = 0x0000_1000;
const ADS_UF_SERVER_TRUST_ACCOUNT = 0x0000_2000;
const ADS_UF_DONT_EXPIRE_PASSWD = 0x0001_0000;
const ADS_UF_MNS_LOGON_ACCOUNT = 0x0002_0000;
const ADS_UF_SMARTCARD_REQUIRED = 0x0004_0000;
const ADS_UF_TRUSTED_FOR_DELEGATION = 0x0008_0000;
const ADS_UF_NOT_DELEGATED = 0x0010_0000;
const ADS_UF_USE_DES_KEY_ONLY = 0x0020_0000;
const ADS_UF_DONT_REQUIRE_PREAUTH = 0x0040_0000;
const ADS_UF_PASSWORD_EXPIRED = 0x0080_0000;
const ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0x0100_0000;
}
}
impl Serialize for UserAccountControl {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer {
let mut flags = Vec::new();
if self.contains(Self::ADS_UF_SCRIPT) { flags.push("ADS_UF_SCRIPT") }
if self.contains(Self::ADS_UF_ACCOUNTDISABLE) { flags.push("ADS_UF_ACCOUNTDISABLE") }
if self.contains(Self::ADS_UF_HOMEDIR_REQUIRED) { flags.push("ADS_UF_HOMEDIR_REQUIRED") }
if self.contains(Self::ADS_UF_LOCKOUT) { flags.push("ADS_UF_LOCKOUT") }
if self.contains(Self::ADS_UF_PASSWD_NOTREQD) { flags.push("ADS_UF_PASSWD_NOTREQD") }
if self.contains(Self::ADS_UF_PASSWD_CANT_CHANGE) { flags.push("ADS_UF_PASSWD_CANT_CHANGE") }
if self.contains(Self::ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED) { flags.push("ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED") }
if self.contains(Self::ADS_UF_TEMP_DUPLICATE_ACCOUNT) { flags.push("ADS_UF_TEMP_DUPLICATE_ACCOUNT") }
if self.contains(Self::ADS_UF_NORMAL_ACCOUNT) { flags.push("ADS_UF_NORMAL_ACCOUNT") }
if self.contains(Self::ADS_UF_INTERDOMAIN_TRUST_ACCOUNT) { flags.push("ADS_UF_INTERDOMAIN_TRUST_ACCOUNT") }
if self.contains(Self::ADS_UF_WORKSTATION_TRUST_ACCOUNT) { flags.push("ADS_UF_WORKSTATION_TRUST_ACCOUNT") }
if self.contains(Self::ADS_UF_SERVER_TRUST_ACCOUNT) { flags.push("ADS_UF_SCRIPT") }
if self.contains(Self::ADS_UF_DONT_EXPIRE_PASSWD) { flags.push("ADS_UF_DONT_EXPIRE_PASSWD") }
if self.contains(Self::ADS_UF_MNS_LOGON_ACCOUNT) { flags.push("ADS_UF_MNS_LOGON_ACCOUNT") }
if self.contains(Self::ADS_UF_SMARTCARD_REQUIRED) { flags.push("ADS_UF_SMARTCARD_REQUIRED") }
if self.contains(Self::ADS_UF_TRUSTED_FOR_DELEGATION) { flags.push("ADS_UF_TRUSTED_FOR_DELEGATION") }
if self.contains(Self::ADS_UF_NOT_DELEGATED) { flags.push("ADS_UF_NOT_DELEGATED") }
if self.contains(Self::ADS_UF_USE_DES_KEY_ONLY) { flags.push("ADS_UF_USE_DES_KEY_ONLY") }
if self.contains(Self::ADS_UF_DONT_REQUIRE_PREAUTH) { flags.push("ADS_UF_DONT_REQUIRE_PREAUTH") }
if self.contains(Self::ADS_UF_PASSWORD_EXPIRED) { flags.push("ADS_UF_PASSWORD_EXPIRED") }
if self.contains(Self::ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION) { flags.push("ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION") }
if do_flat_serialization() {
flags.join("|").serialize(serializer)
} else {
flags.serialize(serializer)
}
}
}