#macro-derive #display #error-derive #traits #derive #docs #comments

no-std docsplay

通过文档注释和字符串插值实现显示 trait 的 derive 宏。displaydoc 的分支

2 个版本

0.1.1 2024 年 2 月 27 日
0.1.0 2024 年 2 月 27 日

#375Rust 模式

Download history 156/week @ 2024-03-13 284/week @ 2024-03-20 240/week @ 2024-03-27 242/week @ 2024-04-03 269/week @ 2024-04-10 426/week @ 2024-04-17 289/week @ 2024-04-24 378/week @ 2024-05-01 260/week @ 2024-05-08 299/week @ 2024-05-15 616/week @ 2024-05-22 565/week @ 2024-05-29 486/week @ 2024-06-05 527/week @ 2024-06-12 493/week @ 2024-06-19 978/week @ 2024-06-26

2,588 每月下载量
用于 4 个包(2 个直接使用)

MIT/Apache

19KB
105

docsplay:文档注释 - 显示

Latest Version

这个库是 displaydoc 的分支,提供了一个方便的 derive 宏,用于为标准库的 core::fmt::Display trait 实现。

[dependencies]
docsplay = "0.1"

编译器支持:需要 rustc 1.56+

示例

与来自 Error derive 宏的 thiserror 的展示一起,以传播来自 io::Error 的源位置,使用 #[source] 属性

use std::io;
use docsplay::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 实现。 Display derive 宏支持从错误中插值字段的简写
    • /// {var}write!("{}", self.var)
    • /// {0}write!("{}", self.0)
    • /// {var:?}write!("{:?}", self.var)
    • /// {0:?}write!("{:?}", self.0)
    • /// {0.foo()}write!("{}", self.0.foo())
    • /// {0.foo():?}write!("{:?}", self.0.foo())
  • 这同样适用于结构体和泛型类型
/// 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] 将您的枚举本身的文档注释消息与每个变体的消息合并,格式为 enum: variant。当添加到枚举时,枚举的文档注释成为必填。当添加到任何其他类型时,它没有效果。

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

常见问题解答

  1. 这个包与 no_std 兼容吗?

    • 是的!这个包实现了 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 License, Version 2.0MIT许可证许可。
除非您明确声明,否则您根据Apache-2.0许可证定义的任何有意提交以包含在此crate中的贡献,都将根据上述条款进行双重许可,而无需任何额外的条款或条件。

依赖项

约300–760KB
~18K SLoC