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 数据库接口
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-Z
和 0-9
。在API中,一个 Identifier
指的是部分名称和键名称的组合,所以请注意 它不仅仅是键名称!
上述规范可能已过时,请参考生成的文档(Identifier::is_valid
)以了解有效的INI标识符。
值
声明一个值
值可以是表达式中的第一个 =
符号之后的任何内容。它必须分配给一个键而不是一个部分。在下面的代码中
key=value
key
必须是一个有效的标识符,而 value
被定义为值。
类型
值可以是以下之一
Raw
一个有效的值,不匹配以下任何类型Str
一个有效的值,位于两个引号'
或"
之间Int
一个64位整数Float
一个64位浮点数Bool
一个布尔值(可以是true
(on
、enabled
、y
或yes
)或false
(off
、disabled
、n
或no
)
最高优先级是类型 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_1
和key_2
的出现都是不同的键,因为它们不在同一个部分。前两个在全局/匿名部分,接下来的两个在名为section 1
的部分,最后的两个在名为section 2
的部分。
在这个API中,部分名称是Identifier
存储的第一个值。它是一个Option<String>
,因为部分可能是匿名的(在第一个部分之前声明的键位于对应于None
的匿名部分)。所有命名部分都表示为Some(name)
。第二个值是键,它是一个String
,必须是一个有效的标识符。