MCPcopy Index your code
hub / github.com/dtolnay/remain

github.com/dtolnay/remain @0.2.15

Chat with this repo
repository ↗ · DeepWiki ↗ · release 0.2.15 ↗ · + Follow
86 symbols 117 edges 26 files 0 documented · 0%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Remain sorted

github crates.io docs.rs build status

This crate provides an attribute macro to check at compile time that the variants of an enum or the arms of a match expression are written in sorted order.

[dependencies]
remain = "0.2"

Syntax

Place a #[remain::sorted] attribute on enums, structs, match-expressions, or let-statements whose value is a match-expression.

Alternatively, import as use remain::sorted; and use #[sorted] as the attribute.

#[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),
        }
    }
}

If an enum variant, struct field, or match arm is inserted out of order,

      NetDeviceNew(virtio::NetError),
      SpawnVcpu(io::Error),
+     AaaUhOh(Box<dyn StdError>),
  }

then the macro produces a compile error.

error: AaaUhOh should sort before BlockSignal
  --> tests/stable.rs:49:5
   |
49 |     AaaUhOh(Box<dyn StdError>),
   |     ^^^^^^^

Compiler support

The attribute on enums and structs is supported on any rustc version 1.31+.

Rust does not yet have stable support for user-defined attributes within a function body, so the attribute on match-expressions and let-statements requires a nightly compiler and the following two features enabled:

#![feature(proc_macro_hygiene, stmt_expr_attributes)]

As a stable alternative, this crate provides a function-level attribute called #[remain::check] which makes match-expression and let-statement attributes work on any rustc version 1.31+. Place this attribute on any function containing #[sorted] to make them work on a stable compiler.

impl Display for Error {
    #[remain::check]
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        use self::Error::*;

        #[sorted]
        match self {
            /* ... */
        }
    }
}

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Extension points exported contracts — how you extend this code

Sortable (Interface)
(no doc) [3 implementers]
src/check.rs

Core symbols most depended-on inside this repo

cmp
called by 9
src/atom.rs
next
called by 5
src/atom.rs
unexpected
called by 3
src/parse.rs
collect_paths
called by 3
src/check.rs
idents_of_path
called by 3
src/check.rs
cmp
called by 2
src/compare.rs
find_misordered
called by 2
src/check.rs
take_sorted_attr
called by 2
src/visit.rs

Shape

Function 42
Enum 22
Method 12
Class 9
Interface 1

Languages

Rust100%

Modules by API surface

src/check.rs9 symbols
src/atom.rs9 symbols
tests/order.rs7 symbols
tests/unstable.rs6 symbols
tests/stable.rs6 symbols
src/visit.rs6 symbols
src/parse.rs5 symbols
src/compare.rs4 symbols
tests/ui/unnamed-fields.rs3 symbols
tests/ui/unsorted-struct.rs2 symbols
tests/ui/unsorted-match-unstable.rs2 symbols
tests/ui/unsorted-match-stable.rs2 symbols

For agents

$ claude mcp add remain \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact