use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum Disclosure {
Public,
Restricted,
Conformity,
Individual,
}
pub const PASSPORT_FIELD_DISCLOSURE: &[(&str, Disclosure)] = &[
("batchId", Disclosure::Restricted),
("lintResult", Disclosure::Restricted),
("jwsSignature", Disclosure::Conformity),
("publicJwsSignature", Disclosure::Conformity),
("disclosureSignatures", Disclosure::Conformity),
("seal", Disclosure::Conformity),
("retentionLocked", Disclosure::Conformity),
];
impl Disclosure {
const fn audience_count(self) -> u8 {
match self {
Self::Public => 3,
Self::Restricted => 2,
Self::Conformity | Self::Individual => 1,
}
}
#[must_use]
pub const fn most_restrictive(self, other: Self) -> Self {
if other.audience_count() <= self.audience_count() {
other
} else {
self
}
}
#[must_use]
pub const fn token(self) -> &'static str {
match self {
Self::Public => "public",
Self::Restricted => "restricted",
Self::Conformity => "conformity",
Self::Individual => "individual",
}
}
}
pub(super) const DISCLOSURE_ORDER: &[Disclosure] = &[
Disclosure::Public,
Disclosure::Restricted,
Disclosure::Conformity,
Disclosure::Individual,
];
#[must_use]
pub fn disclosure_key(classes: &[Disclosure]) -> String {
DISCLOSURE_ORDER
.iter()
.filter(|c| classes.contains(c))
.map(|c| c.token())
.collect::<Vec<_>>()
.join("+")
}