rust_wechat_core/
utils.rs

1use 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}