#排序 #枚举 #编译时 #匹配 #变体 #属性 #顺序

无 std remain

编译时检查枚举、结构体或匹配是否按顺序编写

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 开发工具

Download history 9784/week @ 2024-05-01 11257/week @ 2024-05-08 7317/week @ 2024-05-15 9471/week @ 2024-05-22 7909/week @ 2024-05-29 7481/week @ 2024-06-05 8383/week @ 2024-06-12 7240/week @ 2024-06-19 8098/week @ 2024-06-26 7323/week @ 2024-07-03 9068/week @ 2024-07-10 8521/week @ 2024-07-17 7612/week @ 2024-07-24 8339/week @ 2024-07-31 7588/week @ 2024-08-07 6774/week @ 2024-08-14

31,850 每月下载量
61 个开源软件包中使用 (直接使用 35 个)

MIT/Apache 协议

28KB
507

剩余排序

github crates.io docs.rs build status

此软件包提供了一个属性宏,用于在编译时检查枚举的变体或匹配表达式的臂是否按顺序编写。

[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