7 个版本
0.1.0 | 2021年1月21日 |
---|---|
0.1.0-alpha.6 | 2020年12月23日 |
0.1.0-alpha.4 | 2020年9月18日 |
0.1.0-alpha.3 | 2020年8月17日 |
#2140 在 解析器实现
每月32 次下载
80KB
2K SLoC
curlyconf
Curlyconf
Curlyconf 是用于命名.conf 和 dhcpd.conf 等配置文件格式的配置文件读取器。
示例配置(file.cfg)
person charlie {
fullname "Charlie Brown";
address 192.168.1.1;
}
person snoopy {
fullname "Snoopy";
}
示例代码
use serde::Deserialize;
// The initial section of any config is a rust struct.
#[derive(Debug, Deserialize)]
struct Config {
person: Vec<Person>,
}
#[derive(Debug, Deserialize)]
struct Person {
#[serde(rename = "__label__")]
name: String,
#[serde(default)]
fullname: Option<String>,
#[serde(default)]
address: Option<std::net::IpAddr>,
}
fn main() {
// Read the configuration file.
let config: Config = match curlyconf::from_file("file.cfg") {
Ok(cfg) => cfg,
Err(e) => {
eprintln!("{}", e);
std::process::exit(1);
}
};
// Print what we got (println!("{:?}", config) would be easier...).
for (i, p) in config.person.iter().enumerate() {
println!("{}: {} fullname {:?} addr {:?}", i, p.name, p.fullname, p.address);
}
}
这将打印
0: charlie fullname Some("Charlie Brown") addr Some(V4(192.168.1.1))
1: snoopy fullname Some("Snoopy") addr None
Curlyconf 使用 serde 将配置文件值反序列化为 Rust 类型,就像几乎每个做类似事情的 crate 一样。
部分和值。
配置文件包含部分名称、标签、部分、值名称和值
- 部分。它们具有部分名称、可选标签,并包含其他部分和值的列表。部分的 Rust 类型是结构。
- 值。这是一个值名称,后跟一个值。如果值是
Vec
,则可以有多种值,用逗号分隔。
如果部分是以下情况之一,则它可以有标签:
- 它是
HashMap<Key, Section>
的一部分,或 - 它是
Vec<Section>
的一部分,并且与该部分对应的 Rust 结构体具有__label__
字段。该字段将设置为标签值。
标签类型可以是任何类型,不必是字符串 - 它也可以是,例如,PathBuf
或 IpAddr
。
因此,配置文件的基本结构如下
section_name [label] {
value_name value [,value...];
value_name value [,value...];
section_name [label] {
value_name value [,value...];
}
}
Enum
也受支持(请参阅 serde
文档),因此您可以进行如下操作
#[derive(Debug, Deserialize)]
struct Config {
animal: Animal,
}
#[derive(Debug, Deserialize)]
enum Animal {
Cat {
purrs: bool,
},
Dog {
barks: bool,
},
}
然后拥有这样的配置
animal cat {
purrs;
}
包含。
在每个部分中,都可以包含另一个文件或多个文件。只需这样做
include otherconfig.cfg;
如果包含文件的路径名是相对的,它将被解释为相对于当前正在解析的文件。也可以使用通配符,例如
configs {
include conf.d/*.cfg;
}
存在一些限制,主要限制是不能在映射或子部分列表的中间使用 "包含" 语句。因为那个 "包含" 语句,解析器无法通过该语句向前查看列表是否继续。
许可证
许可协议为以下之一
- Apache License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 协议(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则任何您有意提交以包含在本工作中的贡献,根据 Apache-2.0 许可协议定义,应按上述双重许可,不附加任何额外条款或条件。
依赖项
~2.6–4.5MB
~79K SLoC