7 个版本

0.1.0 2021年1月21日
0.1.0-alpha.62020年12月23日
0.1.0-alpha.42020年9月18日
0.1.0-alpha.32020年8月17日

#2140解析器实现

每月32 次下载

MIT/Apache

80KB
2K SLoC

curlyconf

Apache-2.0 licensed MIT licensed Released API docs

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__ 字段。该字段将设置为标签值。

标签类型可以是任何类型,不必是字符串 - 它也可以是,例如,PathBufIpAddr

因此,配置文件的基本结构如下

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-2.0 许可协议定义,应按上述双重许可,不附加任何额外条款或条件。

依赖项

~2.6–4.5MB
~79K SLoC