#proc-macro #duplicates #substitution #attributes #u16 #variables #syntax

duplicate

提供用于代码复制的宏,具有变量替换功能

21 个版本 (1 个稳定版)

1.0.0 2023年3月10日
0.4.1 2022年7月17日
0.4.0 2022年2月20日
0.3.0 2021年6月8日
0.2.6 2020年7月13日

#88开发工具

Download history 31579/week @ 2024-03-14 27679/week @ 2024-03-21 27456/week @ 2024-03-28 33811/week @ 2024-04-04 32273/week @ 2024-04-11 32396/week @ 2024-04-18 36209/week @ 2024-04-25 42140/week @ 2024-05-02 39549/week @ 2024-05-09 56915/week @ 2024-05-16 57149/week @ 2024-05-23 57319/week @ 2024-05-30 55892/week @ 2024-06-06 60609/week @ 2024-06-13 53282/week @ 2024-06-20 44163/week @ 2024-06-27

226,304 每月下载次数
110 个crate(42 个直接) 中使用

MIT/Apache

90KB
1.5K SLoC

duplicate

用于轻松实现带替换的代码复制的crate。

动机

如果您发现自己需要复制一段代码并对新用例进行一些小改动,那么这个crate就适合您。

duplicate_item 属性宏可以在任何数量的重复中复制一个项目,同时在每个重复的位置插入自定义代码。类似函数的 duplicate 宏可以对您提供的任何代码执行相同的操作。

有关语法和功能的详细介绍,请参阅文档

示例

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());

展开为

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 策略

本crate的最低支持Rust版本(MSRV)取决于启用了哪些功能。

基本MSRV为1.42。当没有启用任何功能时适用,是最低可能的MSRV。启用以下功能将MSRV提高至指定版本

当前没有功能会增加MSRV超过基本版本。

启用上述列表之外的功能不会增加MSRV。

提高基本MSRV或任何特定现有功能的MSRV将是一个破坏性变更,并将伴随着主要版本的升级。添加新功能不算作破坏性变更,即使它们默认启用并因此提高了默认功能的累积MSRV。

只能保证本crate的直接和传递依赖项的最小版本与MSRV兼容。

变更日志

本项目遵循语义化版本控制。在初始开发过程中(版本为0.y.z),次要版本(y)的升级表示破坏性变更。

变更

  • 重写了pretty_errors功能,以更一致地提供有用的提示和代码高亮。请参阅#19

修复

  • duplicate现在还替换了嵌套duplicate的调用。请参阅#48
  • 现在忘记将替换参数括起来会报告合理的错误。请参阅 #30
  • 简短语法不再接受在标识符列表之后不提供替换组。请参阅 #29
  • 修复了多个应该不被接受的代码接受的问题。

此更改日志格式基于 Keep a Changelog,并仅显示自上一版本以来的更改。 查看完整的更改日志以了解所有发布版本的更改。

许可证

根据您的选择,许可协议为 Apache License, Version 2.0MIT 许可证

依赖项