#settings #configuration #macro

ini

在 configparser 上构建的简单宏,用于加载和解析 ini 文件。您可以使用它编写可以轻松由最终用户定制的 Rust 程序。

14 个稳定版本

1.3.0 2020 年 8 月 29 日
1.2.8 2020 年 7 月 22 日
1.2.5 2020 年 6 月 28 日

#215 in 配置

Download history 584/week @ 2024-03-14 515/week @ 2024-03-21 532/week @ 2024-03-28 414/week @ 2024-04-04 544/week @ 2024-04-11 565/week @ 2024-04-18 579/week @ 2024-04-25 626/week @ 2024-05-02 559/week @ 2024-05-09 599/week @ 2024-05-16 592/week @ 2024-05-23 618/week @ 2024-05-30 375/week @ 2024-06-06 478/week @ 2024-06-13 523/week @ 2024-06-20 359/week @ 2024-06-27

1,843 个月下载量
8 crates 中使用

MIT OR LGPL-3.0-or-later

18KB

ini

Build Status Crates.io Crates.io Released API docs Maintenance

此 crate 提供了 ini! 宏,它实现了一种基本的配置语言,提供类似于 Windows ini 文件中找到的结构。您可以使用它编写可以轻松由最终用户定制的 Rust 程序。

这是一个简单宏工具,基于 configparser 构建,没有其他基于 Rust 的依赖项。对于更高级的功能,您应使用 configparser crate。

快速入门

一个基本的 ini 语法文件(我们称其为 ini 语法文件,因为文件不一定是 .ini)看起来像这样

[DEFAULT]
key1 = value1
pizzatime = yes
cost = 9

[topsecrets]
nuclear launch codes = topsecret

[github.com]
User = QEDK

基本上,语法由部分组成,每个部分都可以包含键和值。

安装

您可以通过在 Cargo.toml 文件中包含它来轻松使用 cargo 安装此软件,如下所示

[dependencies]
ini = "1.3.0"

ini!

ini! 宏允许您简单地获取一个类型为 HashMap>>> 的哈希表,用于文件列表。计划在将来提供 shell 扩展和文件写入功能

#[macro_use]
extern crate ini;

fn main() {
  let map = ini!("...path/to/file");
  // Proceed to use normal HashMap functions on the map:
  let val = map["section"]["key"].clone().unwrap();

  // To load multiple files, just do:
  let (map1, map2, map3) = ini!("path/to/file1", "path/to/file2", "path/to/file3");
  // Each map is a cloned hashmap with no relation to other ones
}

如果加载文件失败或解析器无法解析文件,代码将使用适当的错误 panic。在这种情况下,如果您想优雅地处理它,建议您使用 safe 变量。这将确保您的代码不会崩溃,而是以 Result<HashMap, String> 类型退出,并允许您优雅地处理错误。

let map = ini!(safe "...path/to/file");
// Proceed to use normal HashMap functions on the map:
let val = map.unwrap()["section"]["key"].clone().unwrap();
// Note the extra unwrap here, which is required because our HashMap is inside a Result type.

inistr!

inistr! 宏允许您轻松地获取一个字符串列表的 HashMap<String, HashMap<String, Option<String>>> 类型哈希表。

#[macro_use]
extern crate ini;

fn main() {
  let configstring = "[section]
    key = value
    top = secret";
  let map = inistr!(configstring);
  // Proceed to use normal HashMap functions on the map:
  let val = map["section"]["top"].clone().unwrap();
  // The type of the map is HashMap<String, HashMap<String, Option<String>>>
  assert_eq!(val, "secret"); // value accessible!

  // To load multiple string, just do:
  let (map1, map2, map3) = inistr!(&String::from(configstring), configstring,  "[section]
    key = value
    top = secret");
  // Each map is a cloned hashmap with no relation to other ones
}

如果加载文件失败或解析器无法解析文件,代码将使用适当的错误 panic。在这种情况下,如果您想优雅地处理它,建议您使用 safe 变量。这将确保您的代码不会崩溃,而是以 Result<HashMap, String> 类型退出,并允许您优雅地处理错误。

let map = inistr!(safe strvariable_or_strliteral);
 // Proceed to use normal HashMap functions on the map:
let val = map.unwrap()["section"]["key"].clone().unwrap();
 // Note the extra unwrap here, which is required because our HashMap is inside a Result type.

支持的 数据类型

configparser 不会猜测配置文件中值的类型,并将所有内容存储为字符串,同样适用于 ini。如果您需要为您解析值的获取器,您可能希望使用 configparser crate。当然,您也可以自行解析字符串值。

let my_string = map["section"]["key"].clone().unwrap();
let my_int = my_string.parse::<i32>().unwrap();

支持的 ini 文件结构

配置文件可以由部分组成,每个部分以一个 [section-name] 标题开始,后面跟着用 = 分隔的键值条目。默认情况下,部分名称和键名称不区分大小写。从存储的键、值和部分名称中移除了所有前导和尾随空白。键值可以省略,在这种情况下,键值分隔符(=)也可以省略(但这与放置分隔符不同,我们将在后面解释)。您可以使用注释符号(;#)表示注释。请注意,键值对或部分标题不能跨多行。由于 ini 文件通常是这样,这意味着 []=;# 是特殊符号(此 crate 将允许您适当地使用 ])。

让我们举一个例子

[section headers are case-insensitive]
[   section headers are case-insensitive    ]
are the section headers above same? = yes
sectionheaders_and_keysarestored_in_lowercase? = yes
keys_are_also_case_insensitive = Values are case sensitive
;anything after a comment symbol is ignored
#this is also a comment
spaces in keys=allowed ;and everything before this is still valid!
spaces in values=allowed as well
spaces around the delimiter = also OK


[All values are strings]
values like this= 0000
or this= 0.999
are they treated as numbers? = no
integers, floats and booleans are held as= strings

[value-less?]
a_valueless_key_has_None
this key has an empty string value has Some("") =

    [indented sections]
        can_values_be_as_well = True
        purpose = formatting for readability
        is_this_same     =        yes
            is_this_same=yes

需要注意的是,具有相同键的值将得到更新,这意味着最后插入的键(无论是部分标题还是属性键)将保留在 HashMap 中。API 执行的唯一一点魔法是将无部分的属性放入名为 "default" 的部分。

许可证

根据您的选择,许可如下

贡献

除非您明确声明,否则根据 LGPL-3.0 许可证定义的,您提交的任何有意包含在作品中的贡献,都应如上所述双重许可,不附加任何其他条款或条件。

依赖关系

~73KB