1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2016 年 5 月 1 日 |
---|
#103 in #枚举
43KB
828 行
这个包提供了解析各种 Rust 构造的高层宏。
具体来说,这些宏专注于将 Rust 源代码构造重写为更易于由 macro_rules!
宏消费的格式。
目录
parse_enum!
macro_rules! parse_enum {
(
then $cb:ident!( $($cb_arg:tt)* ),
$($body:tt)*
) => { ... };
}
将 $body
解析为 枚举
,使用结果调用宏 $cb
。展开的一般形式是
$cb! {
$($cb_arg)*
enum {
attrs: $attrs:tt,
vis: $vis:tt,
name: $name:ident,
generics: $generics:tt,
where: $where_:tt,
variants: $variants:tt,
num_variants: $num_variants:tt,
}
}
回调
$cb_name
和 $cb_arg
指定调用结果的宏。请注意,$cb_arg
可以包含在 ( .. )
、[ .. ]
或 { .. }
中的任何一种。
字段
展开包含以下字段
-
$attrs
:一个以[ .. ]
分隔的属性列表。例如:[ #[doc="Does a thing"] #[repr(u8)] ]
。 -
$vis
:一个以( .. )
为分隔符的可见性注释。例如:()
,(pub)
。 -
$name
:枚举的名称,作为一个标识符。例如:Option
。 -
$generics
:对枚举的{ .. }
输出的parse_generics_shim!
,包含constr
、params
、ltimes
和tnames
字段
generics: {
constr: $constr:tt,
params: $params:tt,
ltimes: $ltimes:tt,
tnames: $tnames:tt,
}
-
$constr
:一个以[ .. ]
为分隔符、以逗号分隔的泛型约束列表。例如:['a, 'b: 'a, T, U: 'a + Copy,]
。 -
$params
:一个以[ .. ]
为分隔符、以逗号分隔的泛型参数名称列表。例如:['a, 'b, T, U,]
。 -
$ltimes
:一个以[ .. ]
为分隔符、以逗号分隔的泛型生命周期参数列表。例如:['a, 'b,]
。 -
$tnames
:一个以[ .. ]
为分隔符、以逗号分隔的泛型类型参数列表。例如:[T, U,]
。 -
$where_
:对枚举的{ .. }
输出的parse_where_shim!
,包含clause
和preds
字段
where: {
clause: $clause:tt,
preds: $preds:tt,
}
-
$clause
:一个由[ .. ]
分隔的、以逗号结尾的子句,包括where
关键字。如果子句为空,则省略where
关键字,并且括号为空。 例如:[]
,[ where for<'a> T: Fn(&'a i32), ]
。 -
$preds
:一个由[ .. ]
分隔的、以逗号结尾的子句谓词列表。 例如:[]
,[ for<'a> T: Fn(&'a i32), ]
。 -
$variants
:一个由[ .. ]
分隔的、以逗号结尾的变体列表(以下将描述)。 -
$num_variants
:枚举中变体的数量。 例如:2
。
每个变体具有以下形式
{
ord: ($vord_index:tt, $vord_ident:ident),
attrs: $vattrs:tt,
kind: $vkind:ident,
name: $vname:ident,
fields: $vfields:tt,
num_fields: $vnum_fields:tt,
}
-
$vord_index
:此变体的0基于序号。 例如:1
。 -
$vord_ident
:相对于同一enum
的其他变体保证是唯一的标识符。标识符在 不同parse_enum!
调用之间不一定保证是唯一的。 例如:_ord_01
。 -
$vattrs
:附加到变体的属性列表。 例如:[ #[doc=""A variant unlike the rest.""] ]
。 -
$vkind
:其中之一为unitary
、tuple
或record
。 -
$vname
:变体的名称作为标识符。 例如:None
。 -
$vfields
:一个由[ .. ]
分隔的、以逗号结尾的字段列表(以下将描述)。 -
$vnum_fields
:变体中的字段数量。 例如:1
。
变体字段具有以下形式
{
ord: ($ford_index:tt, $ford_ident:ident),
attrs: $fattrs:tt,
vis: $fvis:tt,
ty: $fty:ty,
// **NOTE**: only exists for *record* variant fields:
name: $fname:ident,
}
-
$ford_index
:该变体字段的基于0的序号。例如1
。 -
$ford_ident
:一个相对于同一变体其他字段保证唯一的标识符。标识符在不同parse_enum!
调用之间,或在同一调用中的变体之间,不保证 是唯一的。例如_ord_01
。 -
$fattrs
:一个用[ .. ]
分隔的属性列表,附加到变体字段。例如[ #[doc="A part of the whole."] ]
。 -
$fvis
:一个用( .. )
分隔的可视性注解。例如:()
,(pub)
。 -
$fty
:变体字段的类型。 -
$fname
:变体字段名称作为标识符。例如part
。
示例
parse_enum! {
then stringify!(output:),
/// The `Option` type.
pub enum Option<T> {
/// No value.
None,
/// Some value `T`.
Some(T),
/// File could not be found.
FileNotFound { path: PathBuf },
}
}
// Expands to:
stringify!(