#debugging #info #values #omit #helper #default #impls

no_debug

辅助类型,用于跳过某些值的调试信息

4 个稳定版本

3.1.0 2022 年 4 月 12 日
3.0.0 2022 年 4 月 5 日
2.0.1 2022 年 3 月 28 日
1.0.2 2022 年 3 月 28 日
0.1.0 2022 年 3 月 28 日

#2#impls

MIT 许可证

10KB
186

no_debug

no_debug license docs.rs crates.io

辅助类型,用于跳过某些值的调试信息。

提供具有默认 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>>"#);

无运行时依赖