use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum VerificationMode {
#[default]
Strict,
Warn,
Silent,
}
impl std::str::FromStr for VerificationMode {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"strict" => Ok(Self::Strict),
"warn" => Ok(Self::Warn),
"silent" => Ok(Self::Silent),
_ => Err(()),
}
}
}
impl VerificationMode {
pub const fn as_str(&self) -> &str {
match *self {
Self::Strict => "strict",
Self::Warn => "warn",
Self::Silent => "silent",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct VerificationOptions {
pub verify_signature: bool,
pub verify_hash: bool,
pub signature_verification_mode: VerificationMode,
pub empty_signature_mode: VerificationMode,
pub hash_verification_mode: VerificationMode,
}
impl Default for VerificationOptions {
fn default() -> Self {
Self {
verify_signature: true,
verify_hash: true,
signature_verification_mode: VerificationMode::Strict,
empty_signature_mode: VerificationMode::Warn,
hash_verification_mode: VerificationMode::Strict,
}
}
}
impl VerificationOptions {
pub const fn strict() -> Self {
Self {
verify_signature: true,
verify_hash: true,
signature_verification_mode: VerificationMode::Strict,
empty_signature_mode: VerificationMode::Strict,
hash_verification_mode: VerificationMode::Strict,
}
}
pub const fn disabled() -> Self {
Self {
verify_signature: false,
verify_hash: false,
signature_verification_mode: VerificationMode::Silent,
empty_signature_mode: VerificationMode::Silent,
hash_verification_mode: VerificationMode::Silent,
}
}
pub const fn warn() -> Self {
Self {
verify_signature: true,
verify_hash: true,
signature_verification_mode: VerificationMode::Warn,
empty_signature_mode: VerificationMode::Warn,
hash_verification_mode: VerificationMode::Warn,
}
}
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use super::*;
#[test]
fn test_verification_mode_from_str() {
assert_eq!(
VerificationMode::from_str("strict"),
Ok(VerificationMode::Strict)
);
assert_eq!(
VerificationMode::from_str("warn"),
Ok(VerificationMode::Warn)
);
assert_eq!(
VerificationMode::from_str("silent"),
Ok(VerificationMode::Silent)
);
assert_eq!(
"STRICT".parse::<VerificationMode>(),
Ok(VerificationMode::Strict)
);
assert!("invalid".parse::<VerificationMode>().is_err());
}
#[test]
fn test_verification_mode_as_str() {
assert_eq!(VerificationMode::Strict.as_str(), "strict");
assert_eq!(VerificationMode::Warn.as_str(), "warn");
assert_eq!(VerificationMode::Silent.as_str(), "silent");
}
#[test]
fn test_verification_options_default() {
let opts = VerificationOptions::default();
assert!(opts.verify_signature);
assert!(opts.verify_hash);
assert_eq!(opts.signature_verification_mode, VerificationMode::Strict);
assert_eq!(opts.empty_signature_mode, VerificationMode::Warn);
assert_eq!(opts.hash_verification_mode, VerificationMode::Strict);
}
#[test]
fn test_verification_options_strict() {
let opts = VerificationOptions::strict();
assert!(opts.verify_signature);
assert!(opts.verify_hash);
assert_eq!(opts.signature_verification_mode, VerificationMode::Strict);
assert_eq!(opts.empty_signature_mode, VerificationMode::Strict);
assert_eq!(opts.hash_verification_mode, VerificationMode::Strict);
}
#[test]
fn test_verification_options_disabled() {
let opts = VerificationOptions::disabled();
assert!(!opts.verify_signature);
assert!(!opts.verify_hash);
assert_eq!(opts.signature_verification_mode, VerificationMode::Silent);
assert_eq!(opts.empty_signature_mode, VerificationMode::Silent);
assert_eq!(opts.hash_verification_mode, VerificationMode::Silent);
}
#[test]
fn test_verification_options_warn() {
let opts = VerificationOptions::warn();
assert!(opts.verify_signature);
assert!(opts.verify_hash);
assert_eq!(opts.signature_verification_mode, VerificationMode::Warn);
assert_eq!(opts.empty_signature_mode, VerificationMode::Warn);
assert_eq!(opts.hash_verification_mode, VerificationMode::Warn);
}
}