pub mod msg_sec_check;
use serde::{Deserialize, Serialize};
use serde_repr::Deserialize_repr;
use strum::Display;
pub use msg_sec_check::{Args, MsgSecCheckResult, Scene};
use crate::client::WechatMinappSDK;
#[derive(Debug, Deserialize_repr, Display, Serialize, PartialEq, Clone)]
#[repr(i32)]
pub enum Label {
#[strum(serialize = "正常")]
Normal = 100,
#[strum(serialize = "广告")]
Ad = 10001,
#[strum(serialize = "时政")]
Politics = 20001,
#[strum(serialize = "色情")]
Porn = 20002,
#[strum(serialize = "辱骂")]
Abuse = 20003,
#[strum(serialize = "违法犯罪")]
Illegal = 20006,
#[strum(serialize = "欺诈")]
Fraud = 20008,
#[strum(serialize = "低俗")]
Vulgar = 20012,
#[strum(serialize = "版权")]
Copyright = 20013,
#[strum(serialize = "其他")]
Other = 21000,
}
impl Label {
pub fn from_value(value: i32) -> Option<Self> {
match value {
100 => Some(Label::Normal),
10001 => Some(Label::Ad),
20001 => Some(Label::Politics),
20002 => Some(Label::Porn),
20003 => Some(Label::Abuse),
20006 => Some(Label::Illegal),
20008 => Some(Label::Fraud),
20012 => Some(Label::Vulgar),
20013 => Some(Label::Copyright),
21000 => Some(Label::Other),
_ => None,
}
}
pub fn is_normal(&self) -> bool {
matches!(self, Label::Normal)
}
pub fn is_violation(&self) -> bool {
!self.is_normal()
}
}
#[derive(Debug, Deserialize, Serialize, Display, PartialEq, Clone)]
pub enum Suggest {
#[strum(serialize = "risky")]
#[serde(rename = "risky")]
Risky,
#[strum(serialize = "pass")]
#[serde(rename = "pass")]
Pass,
#[strum(serialize = "review")]
#[serde(rename = "review")]
Review,
}
impl Suggest {
pub fn is_pass(&self) -> bool {
matches!(self, Suggest::Pass)
}
pub fn is_risky(&self) -> bool {
matches!(self, Suggest::Risky)
}
pub fn needs_review(&self) -> bool {
matches!(self, Suggest::Review)
}
pub fn priority(&self) -> u8 {
match self {
Suggest::Risky => 1, Suggest::Review => 2, Suggest::Pass => 3, }
}
}
impl From<&str> for Suggest {
fn from(s: &str) -> Self {
match s.to_lowercase().as_str() {
"risky" => Suggest::Risky,
"pass" => Suggest::Pass,
"review" => Suggest::Review,
_ => Suggest::Review,
}
}
}
pub struct MinappSecurity {
pub client: WechatMinappSDK,
}
impl MinappSecurity {
pub fn new(client: WechatMinappSDK) -> Self {
MinappSecurity { client }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_suggest_enum() {
assert_eq!(Suggest::Risky.to_string(), "risky");
assert_eq!(Suggest::Pass.to_string(), "pass");
assert_eq!(Suggest::Review.to_string(), "review");
assert_eq!(Suggest::from("risky"), Suggest::Risky);
assert_eq!(Suggest::from("PASS"), Suggest::Pass);
assert_eq!(Suggest::from("ReViEw"), Suggest::Review);
assert_eq!(Suggest::from("invalid"), Suggest::Review);
assert!(Suggest::Pass.is_pass());
assert!(Suggest::Risky.is_risky());
assert!(Suggest::Review.needs_review());
assert_eq!(Suggest::Risky.priority(), 1);
assert_eq!(Suggest::Review.priority(), 2);
assert_eq!(Suggest::Pass.priority(), 3);
}
#[test]
fn test_serialization() {
let risky_json = serde_json::to_string(&Suggest::Risky).unwrap();
assert_eq!(risky_json, "\"risky\"");
let pass_json = serde_json::to_string(&Suggest::Pass).unwrap();
assert_eq!(pass_json, "\"pass\"");
let review: Suggest = serde_json::from_str("\"review\"").unwrap();
assert_eq!(review, Suggest::Review);
}
}