#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CheckMethod {
Md5,
Sha1,
Sha256,
Sm3,
}
impl CheckMethod {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Md5 => "MD5",
Self::Sha1 => "SHA1",
Self::Sha256 => "SHA256",
Self::Sm3 => "SM3",
}
}
pub fn try_from_str(s: &str) -> Result<Self, String> {
match s.to_uppercase().as_str() {
"MD5" => Ok(Self::Md5),
"SHA1" => Ok(Self::Sha1),
"SHA256" => Ok(Self::Sha256),
"SM3" => Ok(Self::Sm3),
other => Err(format!("未知的摘要算法: {other}")),
}
}
}
impl std::fmt::Display for CheckMethod {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn as_str_matches_java() {
assert_eq!(CheckMethod::Md5.as_str(), "MD5");
assert_eq!(CheckMethod::Sha1.as_str(), "SHA1");
assert_eq!(CheckMethod::Sha256.as_str(), "SHA256");
assert_eq!(CheckMethod::Sm3.as_str(), "SM3");
}
#[test]
fn display_matches_as_str() {
for method in [
CheckMethod::Md5,
CheckMethod::Sha1,
CheckMethod::Sha256,
CheckMethod::Sm3,
] {
assert_eq!(method.to_string(), method.as_str());
}
}
#[test]
fn try_from_str_roundtrip() {
for method in [
CheckMethod::Md5,
CheckMethod::Sha1,
CheckMethod::Sha256,
CheckMethod::Sm3,
] {
let s = method.as_str();
let parsed = CheckMethod::try_from_str(s).unwrap();
assert_eq!(parsed, method);
}
}
#[test]
fn try_from_str_case_insensitive() {
assert_eq!(
CheckMethod::try_from_str("sha1").unwrap(),
CheckMethod::Sha1
);
assert_eq!(
CheckMethod::try_from_str("Sha256").unwrap(),
CheckMethod::Sha256
);
assert_eq!(CheckMethod::try_from_str("sm3").unwrap(), CheckMethod::Sm3);
assert_eq!(CheckMethod::try_from_str("md5").unwrap(), CheckMethod::Md5);
}
#[test]
fn try_from_str_unknown() {
assert!(CheckMethod::try_from_str("UNKNOWN").is_err());
assert!(CheckMethod::try_from_str("").is_err());
}
#[test]
fn copy_eq() {
let a = CheckMethod::Sm3;
let b = a;
assert_eq!(a, b);
}
#[test]
fn hash_works() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(CheckMethod::Md5);
set.insert(CheckMethod::Sha1);
set.insert(CheckMethod::Sha256);
set.insert(CheckMethod::Sm3);
assert_eq!(set.len(), 4);
assert!(set.contains(&CheckMethod::Sm3));
}
}