我正在尝试编写将接受 Rust 枚举的程序宏,例如
#[repr(u8)]
enum Ty {
A,
B
}
Run Code Online (Sandbox Code Playgroud)
并为枚举生成一个方法,让我将 u8 转换为允许的变体,如下所示
fn from_byte(byte: u8) -> Ty {
match {
0 => Ty::A,
1 => Ty::B,
_ => unreachable!()
}
}
Run Code Online (Sandbox Code Playgroud)
这是我使用proc_macrolib实现的。(没有外部库)
#![feature(proc_macro_diagnostic)]
#![feature(proc_macro_quote)]
extern crate proc_macro;
use proc_macro::{TokenStream, Diagnostic, Level, TokenTree, Ident, Group, Literal};
use proc_macro::quote;
fn report_error(tt: TokenTree, msg: &str) {
Diagnostic::spanned(tt.span(), Level::Error, msg).emit();
}
fn variants_from_group(group: Group) -> Vec<Ident> {
let mut iter = group.stream().into_iter();
let mut res = vec![];
while let Some(TokenTree::Ident(id)) = …Run Code Online (Sandbox Code Playgroud)