# 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 ```rust #[derive(Clone, Copy)] struct TaggedIndex { index: usize, _tag: PhantomData, } let a = TaggedIndex:: { 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` implements `Copy` regardless of the type of `T`, `iderive(Copy)` will implement `Copy` for `TaggedIndex`: ```rust #[iderive(Clone, Copy)] struct TaggedIndex { index: usize, _tag: PhantomData, } let a = TaggedIndex:: { 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`. ## Version history - 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 - 1.1.2 - Remove the non-exhaustive support added in 1.1.1 as it doesn't make sense when all fields are displayed anyway. This matches the output of `#[derive(Debug)]` - 1.1.1 - Indicate non-exhausiveness in the output of the `Debug` trait for named structs - Guard against redefinitions of the `bool` type - Don't require syn's `full` feature - Add more license options - 1.1.0 - Use canonical implementations of `Clone`/`PartialOrd` if `Copy`/`Ord` is also derived - Update to syn 2.0 - 1.0.0 - Remove debug output that was left in by accident - 0.1.0 - First release