Crate iderive

Source
Expand description

§iderive: Inner Derive

iderive is a drop-in replacement for derive that doesn’t directly depend on generic bounds. It only checks the types of a struct’s fields when deriving a trait.

§Example

#[derive(Clone, Copy)]
struct TaggedIndex<T: ?Sized> {
    index: usize,
    _tag: PhantomData<T>,
}

let a = TaggedIndex::<String> { index: 0, _tag: PhantomData };
let b = a;
let c = a; // Error: Value used after move

This won’t work because derive requires that T implements Copy for TaggedIndex to be able to derive it.

In contrast, iderive only checks the struct’s fields to determine if a trait can be derived. Because usize and PhantomData<T> implements Copy regardless of the type of T, iderive(Copy) will implement Copy for TaggedIndex:

#[iderive(Clone, Copy)]
struct TaggedIndex<T: ?Sized> {
    index: usize,
    _tag: PhantomData<T>,
}

let a = TaggedIndex::<String> { index: 0, _tag: PhantomData };
let b = a;
let c = a; // Works!

§Supported traits

iderive is currently implemented for Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord and Hash.

§Recent changes

  • 1.2.4

    • Fix parsing of where clauses
  • 1.2.3

    • Fix parsing of field visibility, attributes and function trait bounds
  • 1.2.0

    • Rewrite; iderive now has no dependencies
    • Don’t use canonical implementations, because this breaks if the other trait fails bounds

See CHANGELOG.md for older changes

Attribute Macros§

iderive
Inner derive. Used like derive. See the crate documentation for details.