4 个稳定版本
3.1.0 | 2022 年 4 月 12 日 |
---|---|
3.0.0 | 2022 年 4 月 5 日 |
2.0.1 | 2022 年 3 月 28 日 |
1.0.2 |
|
0.1.0 |
|
#2 在 #impls
10KB
186 行
no_debug
辅助类型,用于跳过某些值的调试信息。
提供具有默认 Debug
实现的包装结构体。这允许您对大型结构体使用 Debug
的默认实现,同时
- 避免使用
Debug
实现来遍历深层嵌套或过大的结构体, - 避免使用一个泄露不应记录信息的
Debug
实现。
这可以提高
- 可读性(日志可以关注您关心的信息),
- 调试性和安全性(日志可以更完整,而不会意外泄露私有信息),
- 以及性能(复杂的数据结构不需要在调试时遍历,除非通过
Deref
故意请求)。
示例用法:隐藏日志中的用户密码。
use no_debug::{NoDebug, WithTypeInfo, Ellipses};
#[derive(Debug)]
struct UserInfo {
username: String,
password: NoDebug<String>, // Defaults to WithTypeInfo
posts: NoDebug<Vec<String>, Ellipses>,
}
let user = UserInfo {
username: "Cypher1".to_string(),
password: "hunter2".to_string().into(),
posts: vec![
"long post 1...".to_string(),
"long post 2...".to_string(),
"long post 3...".to_string(),
].into()
};
// The password is hidden by default
assert_eq!(
format!("{:#?}", user),
r#"UserInfo {
username: "Cypher1",
password: <no debug: alloc::string::String>,
posts: ...,
}"#
);
// And when accessed
assert_eq!(format!("{:?}", user.password), r#"<no debug: alloc::string::String>"#);
// But it can be extracted easily for operating on the data inside, at which point it is
// visible again.
assert_eq!(format!("{:?}", *user.password), r#""hunter2""#);
// The debug output is based on the Msg type.
assert_eq!(format!("{:?}", user.posts), r#"..."#);
// Output can be changed easily with a type conversion
let post_with_type: NoDebug<Vec<String>, WithTypeInfo> = user.posts.take().into();
assert_eq!(format!("{:?}", post_with_type), r#"<no debug: alloc::vec::Vec<alloc::string::String>>"#);