我正在编写一个解析OVPN配置文件的小型库。OVPN配置文件具有以下格式:
command arg1 arg2
othercommand arg1 arg2
有一组固定的命令,其中一些具有可选参数。我想将解析后的命令表示为枚举类型。因此,以上内容可能会被表示为:
enum ConfigDirective{
Command{arg1: String},
OtherCommand{arg1: String, optinal_arg1: Option<String>},
}
fn parse_line(command: String, args: Vec<String>) -> ConfigDirective {
match command {
"command" => ConfigDirective::Command{arg1: args[0]},
"other_command" => ConfigDirective:OtherCommand{arg1: args[0], optional_arg1: args.get(1),
}
}
我喜欢这种结构,但有很多可能的命令(大约有280个)。所以我想写一个宏来生成大部分样板代码。理想情况下,我会写出以下内容:
define_config_directive!{
{command => "command1", rust_name => CommandOne, args => [arg1], optional_args => []},
{command => "other_command", rust_name => OtherCommand, args => [arg1], optional_args => [optional_arg1]},
}
到目前为止,我能够找到的最接近的翻译是这个:
macro_rules! define_config_directives {
($({
rust_name => $rust_name:ident,
required => [$($required:ident),*],
optional => [$($optional:ident),*]
}),*) => {
#[derive(PartialEq, Eq, Debug)]
pub enum ConfigDirective {
$($rust_name{
$($required: String),*,
$($optional: Option<String>),*,
}),*
}
};
}
我有几个问题:
- 我不知道如何在这个宏中实现
parse_line
函数,我需要迭代每个必需参数,编写一些代码以从行中提取相应的参数,并对可选参数执行相同的操作。 - 我不知道如何处理没有任何参数的情况,理想情况下,那将是一个没有字段的简单枚举变体。
有人知道是否有办法在稳定的Rust上解决这个问题吗?还是我应该使用Python脚本生成代码?
build.rs
文件。当使用cargo build
命令时,cargo会首先编译并执行build.rs
文件(如果存在),然后再编译整个crate的其余部分,因此您可以轻松地使用build.rs
文件生成Rust代码,而无需涉及任何第三方工具或makefile。 - undefined