#macro-derive #traits #standard #version #debugging #default-value #clone-from #add-assign

macro derive-ex

Improved version of the macro to implement the traits defined in the standard library

9 releases

0.1.8 May 5, 2024
0.1.7 Oct 2, 2023
0.1.6 Sep 25, 2023
0.1.5 Aug 25, 2023
0.1.1 May 5, 2022

#2775 in Rust patterns

Download history 25504/week @ 2025-10-25 23931/week @ 2025-11-01 20985/week @ 2025-11-08 15610/week @ 2025-11-15 21981/week @ 2025-11-22 29496/week @ 2025-11-29 24911/week @ 2025-12-06 29560/week @ 2025-12-13 15222/week @ 2025-12-20 15505/week @ 2025-12-27 16989/week @ 2026-01-03 24622/week @ 2026-01-10 28737/week @ 2026-01-17 24963/week @ 2026-01-24 26721/week @ 2026-01-31 28267/week @ 2026-02-07

113,601 downloads per month
Used in 85 crates (10 directly)

MIT/Apache

145KB
3K SLoC

derive-ex

Crates.io Docs.rs Actions Status

Improved version of the macro to implement the traits defined in the standard library.

Documentation

See #[derive_ex] documentation for details.

Differences from standard derive macros

  • A trait bound that is automatically generated is smarter.
  • You can specify trait bound manually.
  • You can specify default values for each field.
  • You can specify comparison method for each field.
  • You can specify ignored field with the derivation of Debug.
  • Support derive Clone::clone_from.
  • Support derive operators. (Add, AddAssign, Not, Deref, etc.)

Supported traits

  • Copy
  • Clone
  • Debug
  • Default
  • Ord, PartialOrd, Eq, PartialEq, Hash
  • operators
    • Add-like (Add, Sub, Mul, Shl, etc.)
    • AddAssign-like (AddAssign, SubAssign, MulAssign, ShlAssign, etc.)
    • Not-like (Not, Neg)
    • Deref, DerefMut

Unsupported traits

The following traits are not supported as more suitable crates exist.

trait crate
Display, FromStr parse-display
Error thiserror

Install

Add this to your Cargo.toml:

[dependencies]
derive-ex = "0.1.7"

Example

use derive_ex::derive_ex;

#[derive(Eq, PartialEq, Debug)]
#[derive_ex(Add, AddAssign, Clone, Default)]
struct X {
    #[default(10)]
    a: u32,
}
assert_eq!(X { a: 1 } + X { a: 2 }, X { a: 3 });
assert_eq!(X::default(), X { a: 10 });

#[derive(Eq, PartialEq, Debug)]
#[derive_ex(Clone, Default)]
enum Y {
    A,
    #[default]
    B,
}
assert_eq!(Y::default(), Y::B);

License

This project is dual licensed under Apache-2.0/MIT. See the two LICENSE-* files for details.

Contribution

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

Dependencies

~185–580KB
~13K SLoC