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}