21 个版本
0.2.14 | 2024 年 5 月 7 日 |
---|---|
0.2.13 | 2024 年 2 月 19 日 |
0.2.12 | 2024 年 1 月 2 日 |
0.2.11 | 2023 年 7 月 21 日 |
0.1.2 | 2019 年 3 月 11 日 |
#150 in 开发工具
31,850 每月下载量
在 61 个开源软件包中使用 (直接使用 35 个)
28KB
507 行
剩余排序
此软件包提供了一个属性宏,用于在编译时检查枚举的变体或匹配表达式的臂是否按顺序编写。
[dependencies]
remain = "0.2"
语法
在枚举、结构体、匹配表达式或值为匹配表达式的 let-语句上放置 #[remain::sorted]
属性。
或者,导入 use remain::sorted;
并将 #[sorted]
用作属性。
#[remain::sorted]
#[derive(Debug)]
pub enum Error {
BlockSignal(signal::Error),
CreateCrasClient(libcras::Error),
CreateEventFd(sys_util::Error),
CreateSignalFd(sys_util::SignalFdError),
CreateSocket(io::Error),
DetectImageType(qcow::Error),
DeviceJail(io_jail::Error),
NetDeviceNew(virtio::NetError),
SpawnVcpu(io::Error),
}
#[remain::sorted]
#[derive(Debug)]
pub struct Registers {
ax: u16,
cx: u16,
di: u16,
si: u16,
sp: u16,
}
impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::Error::*;
#[remain::sorted]
match self {
BlockSignal(e) => write!(f, "failed to block signal: {}", e),
CreateCrasClient(e) => write!(f, "failed to create cras client: {}", e),
CreateEventFd(e) => write!(f, "failed to create eventfd: {}", e),
CreateSignalFd(e) => write!(f, "failed to create signalfd: {}", e),
CreateSocket(e) => write!(f, "failed to create socket: {}", e),
DetectImageType(e) => write!(f, "failed to detect disk image type: {}", e),
DeviceJail(e) => write!(f, "failed to jail device: {}", e),
NetDeviceNew(e) => write!(f, "failed to set up virtio networking: {}", e),
SpawnVcpu(e) => write!(f, "failed to spawn VCPU thread: {}", e),
}
}
}
如果插入枚举变体、结构体字段或匹配臂的顺序错误,
NetDeviceNew(virtio::NetError),
SpawnVcpu(io::Error),
+ AaaUhOh(Box<dyn StdError>),
}
则宏将产生编译错误。
error: AaaUhOh should sort before BlockSignal
--> tests/stable.rs:49:5
|
49 | AaaUhOh(Box<dyn StdError>),
| ^^^^^^^
编译器支持
枚举和结构体上的属性在 rustc 1.31+ 版本上得到支持。
Rust 尚未在函数体内部对用户定义的属性提供稳定的支持,因此匹配表达式和 let-语句上的属性需要夜间编译器并启用以下两个功能
#![feature(proc_macro_hygiene, stmt_expr_attributes)]
作为稳定的替代方案,此软件包提供了一个函数级属性 #[remain::check]
,它使匹配表达式和 let-语句属性能够在 rustc 1.31+ 的任何版本上工作。将此属性放置在包含 #[sorted]
的任何函数上,以使其在稳定编译器上工作。
impl Display for Error {
#[remain::check]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::Error::*;
#[sorted]
match self {
/* ... */
}
}
}
许可证
许可协议为Apache License, Version 2.0或MIT许可证,您可选择其一。除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在此软件包中的任何贡献,将如上双许可,不附加任何额外条款或条件。
依赖项
~275–720KB
~17K SLoC