#macro-derive #macro-helpers #enums #proc-macro #macro #derive

derive_utils

为枚举编写 derive 宏的进程宏辅助工具

29个版本

新版本 0.14.2 2024年8月23日
0.14.1 2024年1月27日
0.13.2 2023年7月27日
0.13.0 2023年3月26日
0.5.3 2018年12月27日

#33 in 进程宏

Download history 50857/week @ 2024-05-03 55085/week @ 2024-05-10 52496/week @ 2024-05-17 49345/week @ 2024-05-24 54559/week @ 2024-05-31 59629/week @ 2024-06-07 64821/week @ 2024-06-14 64091/week @ 2024-06-21 57713/week @ 2024-06-28 53653/week @ 2024-07-05 51678/week @ 2024-07-12 53311/week @ 2024-07-19 57640/week @ 2024-07-26 50457/week @ 2024-08-02 58431/week @ 2024-08-09 56615/week @ 2024-08-16

233,923 每月下载量
用于 336 个crate(9 个直接使用)

Apache-2.0 OR MIT

38KB
475

derive_utils

crates.io docs.rs license msrv github actions

一个进程宏辅助工具,用于轻松编写枚举的 derive 宏。

使用方法

将以下内容添加到您的 Cargo.toml

[dependencies]
derive_utils = "0.14"

示例

quick_derive! 宏使得像实现 derive 特性到枚举这样的操作变得简单,只要所有变体都实现了该特性。

use derive_utils::quick_derive;
use proc_macro::TokenStream;

#[proc_macro_derive(Iterator)]
pub fn derive_iterator(input: TokenStream) -> TokenStream {
    quick_derive! {
        input,
        // trait path
        std::iter::Iterator,
        // trait definition
        trait Iterator {
            type Item;
            fn next(&mut self) -> Option<Self::Item>;
            fn size_hint(&self) -> (usize, Option<usize>);
        }
    }
}

#[proc_macro_derive(ExactSizeIterator)]
pub fn derive_exact_size_iterator(input: TokenStream) -> TokenStream {
    quick_derive! {
        input,
        // trait path
        std::iter::ExactSizeIterator,
        // super trait's associated types
        <Item>,
        // trait definition
        trait ExactSizeIterator: Iterator {
            fn len(&self) -> usize;
        }
    }
}

生成的代码

对于以下类似的枚举 derive

#[derive(Iterator, ExactSizeIterator, Future)]
enum Enum<A, B> {
    A(A),
    B(B),
}

将生成如下代码

enum Enum<A, B> {
    A(A),
    B(B),
}

impl<A, B> std::iter::Iterator for Enum<A, B>
where
    A: std::iter::Iterator,
    B: std::iter::Iterator<Item = <A as std::iter::Iterator>::Item>,
{
    type Item = <A as std::iter::Iterator>::Item;
    fn next(&mut self) -> Option<Self::Item> {
        match self {
            Enum::A(x) => x.next(),
            Enum::B(x) => x.next(),
        }
    }
    fn size_hint(&self) -> (usize, Option<usize>) {
        match self {
            Enum::A(x) => x.size_hint(),
            Enum::B(x) => x.size_hint(),
        }
    }
}

impl<A, B> std::iter::ExactSizeIterator for Enum<A, B>
where
    A: std::iter::ExactSizeIterator,
    B: std::iter::ExactSizeIterator<Item = <A as Iterator>::Item>,
{
    fn len(&self) -> usize {
        match self {
            Enum::A(x) => x.len(),
            Enum::B(x) => x.len(),
        }
    }
}
  • auto_enums:一个允许通过自动生成枚举实现多个返回类型的库。
  • io-enum:#[derive(Read, Write, Seek, BufRead)] 用于枚举。
  • iter-enum:#[derive(Iterator, DoubleEndedIterator, ExactSizeIterator, FusedIterator, Extend)] 用于枚举。

许可证

根据您的选择,在 Apache License, Version 2.0MIT许可证 下许可。

除非您明确说明,否则您提交的任何旨在包含在作品中的贡献,根据Apache-2.0许可证的定义,应如上双许可,不附加任何额外条款或条件。

依赖

~270–720KB
~17K SLoC