Rust宏为enum数组生成构建器方法

7vhp5slm  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(92)

假设我有一个这样的枚举:

enum Option {
    A,
    B(String),
    C(usize)
}

和一个包含多个选项的结构体:

#[derive(Default)]
struct Options {
    options: Vec<Option>
}

我想写一个宏,根据枚举变量为该结构体生成构建器方法:

// I want the macro to generate these methods
   Options::default()
        .a()
        .b(String::from("Hey"))
        .c(123);

我见过像derive_builder这样的板条箱,但我不确定它是否适用于这个特定的示例。

2ledvvac

2ledvvac1#

你可以创建一个宏放在枚举上。

#[consume(Consumer)]
enum Option {
    A,
    B(String),
    C(usize)
}

这将扩展成一种特质。

trait Consumer: Sized {
    fn consume(self, opt: Option) -> Self;
    fn a(self) -> Self {
        self.consume(Option::A)
    }
    fn b(self, b: String) -> Self {
        self.consume(Option::B(b))
    }
    fn c(self, c: usize) -> Self {
        self.consume(Option::C(c))
    }
}

然后你可以为Options实现这个trait。

impl Consumer for Options {
    fn consume(mut self, opt: Option) -> Self {
        self.options.push(opt);
        self
    }
}

您可以执行类似thiserror的操作,通过为每个变量添加属性来为方法添加文档。您也许可以将变量的doc注解作为方法的文档来重用,但我不确定。
对于简单类型,derive_builder可以生成一个没有任何这些类型/特征的构建器。

相关问题