#macro-derive #display #string-interpolation #error #error-derive #derive #docs

无std displaydoc

通过文档注释和字符串插值实现display Trait的过程宏

14个版本

0.2.5 2024年6月20日
0.2.4 2023年5月3日
0.2.3 2021年7月16日
0.2.1 2021年3月26日
0.1.4 2019年10月18日

#28过程宏 分类中

Download history 300987/week @ 2024-04-25 329004/week @ 2024-05-02 336045/week @ 2024-05-09 372016/week @ 2024-05-16 413245/week @ 2024-05-23 487319/week @ 2024-05-30 667952/week @ 2024-06-06 912656/week @ 2024-06-13 662505/week @ 2024-06-20 614954/week @ 2024-06-27 520209/week @ 2024-07-04 585701/week @ 2024-07-11 612930/week @ 2024-07-18 619775/week @ 2024-07-25 632167/week @ 2024-08-01 553663/week @ 2024-08-08

2,536,124 每月下载量
2,255 个crate中(197个直接使用) 使用

MIT/Apache

43KB
616 代码行

derive(Display) /// From<docs>

Latest Version Rust Documentation

此库提供了一个方便的过程宏,用于实现标准库的 core::fmt::Display 特性。

[dependencies]
displaydoc = "0.2"

编译器支持:需要rustc 1.56+


示例

Error 过程宏(来自 thiserror)一起演示,以通过具有 #[source] 属性的传播源位置

use std::io;
use displaydoc::Display;
use thiserror::Error;

#[derive(Display, Error, Debug)]
pub enum DataStoreError {
    /// data store disconnected
    Disconnect(#[source] io::Error),
    /// the data for key `{0}` is not available
    Redaction(String),
    /// invalid header (expected {expected:?}, found {found:?})
    InvalidHeader {
        expected: String,
        found: String,
    },
    /// unknown data store error
    Unknown,
}

let error = DataStoreError::Redaction("CLASSIFIED CONTENT".to_string());
assert!("the data for key `CLASSIFIED CONTENT` is not available" == &format!("{}", error));

请注意,尽管 io::Error 实现了 Display,但我们没有将其添加到为 DataStoreError::Disconnect 生成的消息中,因为它已经通过 #[source] 提供了。有关避免错误报告中重复的更多上下文,请参阅 Rust 博客 此处


详细信息

  • 如果您像示例中那样为枚举的每个变体提供文档字符串注释,将为您的枚举生成一个 fmt::Display 实现如果您提供文档字符串注释
    • /// {var}write!("{}", self.var)
    • /// {0}write!("{}", self.0)
    • /// {var:?}write!("{:?}", self.var)
    • /// {0:?}write!("{:?}", self.0)
  • 这也可以与结构和 泛型类型一起使用
/// oh no, an error: {0}
#[derive(Display)]
pub struct Error<E>(pub E);

let error: Error<&str> = Error("muahaha i am an error");
assert!("oh no, an error: muahaha i am an error" == &format!("{}", error));
  • 可以在 derive 旁边为您的类型添加两个可选属性

    • #[ignore_extra_doc_attributes] 使宏忽略第一个之后的任何文档注释属性(或 /// 行)。否则,多行注释使用 /// 被视为错误,因此请使用此属性或考虑切换到块文档注释(/** */)。

    • #[prefix_enum_doc_attributes] 将枚举本身的文档注释消息与每个变体的消息合并,格式为“枚举:变体”。当添加到枚举时,枚举的文档注释变为强制性的。当添加到任何其他类型时,它没有任何效果。

  • 如果您想要一个独立的文档注释,可以在变体或结构体上使用 #[displaydoc("...") 属性来覆盖它。


常见问题解答

  1. 这个crate兼容no_std吗?

    • 是的!这个crate实现了 core::fmt::Display 特性,而不是 std::fmt::Display 特性,所以它应该在stdno_std环境中工作。只需添加 default-features = false 即可。
  2. 这个crate通过Display特性与PathPathBuf一起工作吗?

    • 是的。这个crate使用 @dtolnay 的 自动引用特化技术 为类型添加一个特殊的特性来获取显示实现。然后它特化为PathPathBuf,当这两个类型中的任何一个被找到时,它调用 self.display() 来获取一个可以与Display格式说明符一起使用的 std::path::Display<'_> 类型!

许可证

根据您的选择,受Apache许可证第2版MIT许可证许可。
除非您明确声明,否则根据 Apache-2.0 许可证的定义,您提交给该 crate 的任何贡献,都应如上所述双许可,而不附加任何额外条款或条件。

依赖关系

~280–730KB
~17K SLoC