rust_wechat_core/
utils.rs1use md5::Digest;
2use std::fs;
3use base64ct::Encoding;
4use hmac::{Hmac, Mac};
5use md5::Md5;
6use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
7use serde::de::Unexpected;
8use sha2::Sha256;
9use crate::WechatError::CommonError;
10
11pub type HmacSha256 = Hmac<Sha256>;
12
13pub fn hmac_sha256(key: &[u8], data: &str) -> crate::Result<Vec<u8>> {
14 let mut mac = HmacSha256::new_from_slice(key)
15 .map_err(|err| CommonError(format!("{}", err)))?;
16 mac.update(data.as_bytes());
17
18 Ok(mac.finalize().into_bytes().to_vec())
19}
20
21pub fn base64(path: &str) -> crate::Result<String> {
22 let bytes = fs::read(path)?;
23 let data = base64ct::Base64::encode_string(&bytes);
24 Ok(data)
25}
26
27pub fn md5(data: &str) -> crate::Result<String> {
28 let mut hasher = Md5::new();
29 hasher.update(data.as_bytes());
30 let result = hasher.finalize();
31 Ok(String::from_utf8_lossy(&result).into_owned())
32}
33
34pub fn bool_from_u8<'de, D>(deserializer: D) -> Result<bool, D::Error>
35where
36 D: Deserializer<'de>,
37{
38 match u8::deserialize(deserializer)? {
39 0 => Ok(false),
40 _ => Ok(true),
41 }
42}
43
44pub fn option_bool_from_u8<'de, D>(deserializer: D) -> Result<Option<bool>, D::Error>
45where
46 D: Deserializer<'de>,
47{
48 match u8::deserialize(deserializer)? {
49 0 => Ok(Some(false)),
50 1 => Ok(Some(true)),
51 _ => Ok(None),
52 }
53}
54pub fn bool_from_str<'de, D>(deserializer: D) -> Result<bool, D::Error>
55where
56 D: Deserializer<'de>,
57{
58 match String::deserialize(deserializer)?.as_ref() {
59 "0" => Ok(false),
60 "1" => Ok(true),
61 other => Err(de::Error::invalid_value(
62 Unexpected::Str(other),
63 &"0 or 1",
64 )),
65 }
66}
67pub fn bool_to_u8<S>(value: &bool, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, {
68 serializer.serialize_u8(if *value { 1u8 } else { 0u8 })
69}
70pub fn option_bool_to_u8<S>(value: &Option<bool>, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, {
71 serializer.serialize_u8(
72 if let Some(v) = value.as_ref() {
73 if *v { 1u8 } else { 0u8 }
74 } else {
75 0u8
76 }
77 )
78}
79pub fn bool_to_str<S>(value: &bool, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, {
80 serializer.serialize_str(if *value { "1" } else { "0" })
81}