use super::Sensitivity;
#[derive(Clone, Copy)]
pub(crate) enum ResolvedField {
Sensitive {
sensitivity: Sensitivity,
},
PassThrough,
}
impl ResolvedField {
#[must_use]
#[cfg(any(feature = "http", test))]
pub(crate) fn stronger(self, context: Self) -> Self {
match (self, context) {
(Self::Sensitive { sensitivity: base }, Self::Sensitive { sensitivity: context }) => Self::Sensitive {
sensitivity: base.max(context),
},
(Self::Sensitive { sensitivity }, Self::PassThrough)
| (Self::PassThrough, Self::Sensitive { sensitivity }) => Self::Sensitive { sensitivity },
(Self::PassThrough, Self::PassThrough) => Self::PassThrough,
}
}
}
#[cfg(test)]
mod tests {
use super::ResolvedField;
use crate::Sensitivity;
#[test]
fn test_stronger_preserves_the_more_sensitive_base_decision() {
let base = ResolvedField::Sensitive {
sensitivity: Sensitivity::Secret,
};
let context = ResolvedField::Sensitive {
sensitivity: Sensitivity::Low,
};
assert!(matches!(
base.stronger(context),
ResolvedField::Sensitive {
sensitivity: Sensitivity::Secret
}
));
}
#[test]
fn test_stronger_accepts_context_enhancement_and_pass_through() {
let base = ResolvedField::Sensitive {
sensitivity: Sensitivity::Low,
};
let context = ResolvedField::Sensitive {
sensitivity: Sensitivity::High,
};
assert!(matches!(
base.stronger(context),
ResolvedField::Sensitive {
sensitivity: Sensitivity::High
}
));
assert!(matches!(
ResolvedField::PassThrough.stronger(ResolvedField::PassThrough),
ResolvedField::PassThrough
));
}
}