#proc-macro #duplicates #substitution #procedural #item #attributes #variables

macro duplicate

Provides macros for duplication of code with variable substitution

21 releases (1 stable)

1.0.0 Mar 10, 2023
0.4.1 Jul 17, 2022
0.4.0 Feb 20, 2022
0.3.0 Jun 8, 2021
0.2.6 Jul 13, 2020

#104 in Development tools

Download history 20390/week @ 2023-11-21 23263/week @ 2023-11-28 21926/week @ 2023-12-05 21050/week @ 2023-12-12 17596/week @ 2023-12-19 9090/week @ 2023-12-26 17162/week @ 2024-01-02 20572/week @ 2024-01-09 23451/week @ 2024-01-16 20833/week @ 2024-01-23 19466/week @ 2024-01-30 20997/week @ 2024-02-06 25616/week @ 2024-02-13 29721/week @ 2024-02-20 28042/week @ 2024-02-27 24905/week @ 2024-03-05

112,042 downloads per month
Used in 96 crates (37 directly)

MIT/Apache

90KB
1.5K SLoC

duplicate

Crate for easy code duplication with substitution.

Motivation

If you find yourself in need of copying a block of code and then making some small changes to fit the new use case, this crate is for you.

The duplicate_item attribute macro will duplicate an item any number of times while inserting custom code in the designated places in each duplicate. The duplicate function-like procedural macro will do the same for any code you give it.

For an in-depth explanation of the syntax and features, see the documentation.

Example

use duplicate::duplicate_item;

/// Trait we want to implement for u8, u16, and u32
trait IsMax {
  /// Returns true if self is its maximum possible value.
  fn is_max(&self) -> bool;
}

#[duplicate_item(
  int_type  max_value;
  [ u8 ]    [ 255 ];
  [ u16 ]   [ 65_535 ];
  [ u32 ]   [ 4_294_967_295 ];
)]
impl IsMax for int_type {
  fn is_max(&self) -> bool {
    *self == max_value
  }
}

assert!(!42u8.is_max());
assert!(!42u16.is_max());
assert!(!42u32.is_max());

Expands to:

use duplicate::duplicate_item;

/// Trait we want to implement for u8, u16, and u32
trait IsMax {
  /// Returns true if self is its maximum possible value.
  fn is_max(&self) -> bool;
}

impl IsMax for u8 {
  fn is_max(&self) -> bool {
    *self == 255
  }
}
impl IsMax for u16 {
  fn is_max(&self) -> bool {
    *self == 65_535
  }
}
impl IsMax for u32 {
  fn is_max(&self) -> bool {
    *self == 4_294_967_295
  }
}

assert!(!42u8.is_max());
assert!(!42u16.is_max());
assert!(!42u32.is_max());

MSRV Policy

This crate's Minimum Supported Rust Version (MSRV) depends on which features are enabled.

The Base MSRV is 1.42. It applies when no features are enabled and is the lowest possible MSRV. Enabling the following features increases the MSRV to the stated version:

No features currently increase the MSRV beyond the base.

Enabling features not on the above list doesn't increase the MSRV.

Increasing the Base MSRV or the MSRV of any specific existing feature is a breaking change and will be accompanied by a major version bump. Adding new features doesn't count as a breaking change, even if they are enabled by default and thereby increase the commulative MSRV of the default features.

Only the minimal versions of this crate's direct and transitive dependencies are guaranteed to work with the MSRV.

Changelog

This project adheres to Semantic Versioning. During initial development (with versions 0.y.z), bumps to the minor version (y) signify breaking changes.

Changed

  • Overhauled the pretty_errors feature to more consistently provide useful hints and code highlights. See #19.

Fixed

  • duplicate now also substitutes the invocations of nested duplicate's. See #48.
  • Forgetting to enclose subtitution parameters in brackets now reports sensible error. See #30.
  • Short syntax no longer accepts providing no substitution groups after the identifier list. See #29.
  • Fixed several issues where code was accepted which shouldn't have been.

This changelog format is based on Keep a Changelog and shows only the changes since the previous version. See the full changelog for changes to all released versions.

License

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

Dependencies