Skip to main content

wx_rust_common/util/
data_utils.rs

1//! 数据处理工具类。
2//!
3//! 对应 Java `me.chanjar.weixin.common.util.DataUtils`。
4
5/// 数据处理工具。
6pub struct DataUtils;
7
8impl DataUtils {
9    /// 将数据中包含的 secret 字符使用星号替换,防止日志打印时被输出。
10    ///
11    /// 对应 Java `handleDataWithSecret`:对字符串中 `&secret=xxxx&` 的
12    /// 敏感参数做脱敏(替换为 `&secret=******&`)。
13    ///
14    /// # 参数
15    /// - `data`:需要脱敏的数据(字符串)
16    ///
17    /// # 返回
18    /// 脱敏后的字符串。
19    pub fn handle_data_with_secret(data: &str) -> String {
20        // 使用正则替换 &secret=word& 为 &secret=******&
21        regex_lite(data)
22    }
23}
24
25/// 轻量正则替换(避免引入 regex 依赖;语义与 Java `&secret=\\w+&` 一致)。
26fn regex_lite(data: &str) -> String {
27    // 逐段查找 "&secret=" 与下一个 "&" 之间的内容并替换
28    let marker = "&secret=";
29    let mut result = String::with_capacity(data.len());
30    let mut rest = data;
31    loop {
32        match rest.find(marker) {
33            Some(pos) => {
34                result.push_str(&rest[..pos + marker.len()]);
35                let after = &rest[pos + marker.len()..];
36                match after.find('&') {
37                    Some(end) => {
38                        result.push_str("******");
39                        result.push_str(&after[end..]);
40                        rest = &after[end..];
41                    }
42                    None => {
43                        // 无结尾 &:替换到末尾
44                        result.push_str("******");
45                        return result;
46                    }
47                }
48            }
49            None => {
50                result.push_str(rest);
51                return result;
52            }
53        }
54    }
55}