#ini-parser #minimalist #section #escaping #identifier #programming-language #value

mininip

一个极简INI文件解析器(MinIniP代表Minimalist Ini Parser)。它用Rust编写,但我将把它导出为C语言编程语言的API,以便创建各种绑定。

7个稳定版本

1.3.1 2020年4月9日
1.3.0 2020年3月21日
1.2.3 2020年1月19日
1.2.2 2019年12月28日

#626 in 数据库接口

MPL-2.0 许可证

91KB
2K SLoC

MinIniP

什么是MinIniP ?

介绍

MinIniP代表Minimalist INI解析器。它是一个用Rust编写的解析器,用于以简单和安全的方式存储数据。目前,它并不追求极致的速度,也没有进行任何基准测试。你可以在任何项目中按照自己的意愿使用它。任何提供的文件的更改都必须在MPL-2.0下发布。

为什么选择MinIniP ?

老实说,选择MinIniP并没有特别的原因。我只是为了玩Rust编写的,我是在几个月前开始学习Rust的。我将在我的个人项目中使用它,所以它将得到长期积极维护。

你说服了我!如何使用它 ?

只需将以下内容添加到你的Cargo.toml中的dependencies部分即可:

mininip="1.2"

...

有效的INI文件是什么?

缺乏标准化

由于没有INI标准的规范,每个实现者都编写了自己的。以下是我的。如果你认为缺少某些内容,可以为此项目做出贡献,扩展这个规范。唯一要遵循的规则是不破坏向下兼容性,除非在一种情况下:添加新的INI类型可能会破坏Raw类型的某些用例,通过将变量的声明移动到新类型。

例如,你可以创建一个类似于数学中的集合的Set INI类型,并用花括号{}括起来。这样,解析此行

an INI key = { Hello, world, ! }

在解析时将不再产生一个Value::Raw值,而是产生一个Value::Set值。

MinIniP遵循的规范

标识符

一个标识符指代以下之一

  • 一个节名称
  • 一个键名称

标识符必须以以下之一开头:.$:a-zA-Z。从第二个字符开始,以下所有字符都是允许的:_~-.:$a-zA-Z0-9。在API中,一个 Identifier 指的是部分名称和键名称的组合,所以请注意 它不仅仅是键名称

上述规范可能已过时,请参考生成的文档(Identifier::is_valid)以了解有效的INI标识符。

声明一个值

值可以是表达式中的第一个 = 符号之后的任何内容。它必须分配给一个键而不是一个部分。在下面的代码中

key=value

key 必须是一个有效的标识符,而 value 被定义为值。

类型

值可以是以下之一

  • Raw 一个有效的值,不匹配以下任何类型
  • Str 一个有效的值,位于两个引号 '" 之间
  • Int 一个64位整数
  • Float 一个64位浮点数
  • Bool 一个布尔值(可以是 trueonenabledyyes)或 falseoffdisablednno

最高优先级是类型 Str。由于引号在所有其他用例中都是禁止的,因此带引号的价值只能是 Str。然后是 Bool 类型,它只允许几个值(见上文)。然后是 Int,如果在将其解释为整数时失败,则 Float。如果给定值与这些类型都不匹配,则该值是 Raw,这是文件中(在转义后,定义如下)写入的值。

转义序列

在INI文件中,所有可能值都 不接受。例如,您不能将表情符号(如☺或♥)或其他非ASCII字符 直接 存储在文件中。即使是一些可能构成INI语法的字符也是如此,例如分号 ;、冒号 :、等号 = 等。然而,您无需处理这些字符,因为 MinIniP 会为您处理。这些字符是 转义 的。以下是一个已知的转义序列的完整列表。

未转义 已转义
\ \\
' \'
" \"
null字符 \0
响铃/警报 \a
退格 \b
制表符 \t
换行符 \r
换行符 \n
; \;
# \#
= \=
: \:
unicode字符 \xxxxxx,其中 xxxxxx 与其十六进制代码对应(六位数字)

请注意,转义序列 不适用于标识符

部分

部分可以指Rust中的模块,或者C++中的命名空间。简而言之,它是一组命名或匿名的键。部分标识符必须是有效的标识符或什么都不写。部分通过在行上的标识符周围放置方括号[]来声明。

key_1 = value_1
key_2 = value_2

[section 1]
key_1 = value_3
key_2 = value_4

[section 2]
key_1 = value_5
key_2 = value_6

在这段代码中,每个key_1key_2的出现都是不同的键,因为它们不在同一个部分。前两个在全局/匿名部分,接下来的两个在名为section 1的部分,最后的两个在名为section 2的部分。

在这个API中,部分名称是Identifier存储的第一个值。它是一个Option<String>,因为部分可能是匿名的(在第一个部分之前声明的键位于对应于None的匿名部分)。所有命名部分都表示为Some(name)。第二个值是键,它是一个String,必须是一个有效的标识符。

无运行时依赖