10 个版本
0.2.1 | 2020 年 8 月 15 日 |
---|---|
0.2.0 | 2019 年 9 月 5 日 |
0.1.7 | 2019 年 8 月 26 日 |
0.1.4 | 2019 年 7 月 23 日 |
0.1.1 | 2018 年 10 月 11 日 |
#1285 in 数据结构
52 每月下载量
在 3 crates 中使用
495KB
14K SLoC
kg-tree
具有 Opath 查询语言,类似于 XPath 的泛型对象树。
为 Rust 频道构建状态
稳定 | beta | nightly |
---|---|---|
Opath
用于对象树查找和转换的简单语言,类似于 XPath 的功能。
数据类型
支持通过 json
、yaml
和 toml
格式传输的所有数据类型。
- null - 空值
- number - 内部存储为 64 位整数或 64 位浮点数
- boolean -
true
或false
- string - 字符串以 UTF-8 编码的数据存储。
- binary - 二进制数据。
- object - 对象或映射,可以包含字符串键属性
- array - 数组或元素序列
- date - 待实现!!
文字
123
,-2
- 64 位整数值1.13
,.e10
,-1E-2
,.3
- 64 位浮点值'id'
,"id"
- 字符串值true
,false
- 布尔值null
- null 值
类型转换
与 ECMAScript 相同,混合操作数时整数提升为浮点数(待完善)
数学运算符
支持典型数学运算符和括号。
2 + 3
,@.count + 1
- 数值加法2 - 3
,@.count - 1
- 数值减法2 * 3
,@.count * 2
- 数值乘法2 / 3
,@.count / 2
- 数值除法2 + 6 / 2
- 返回值5
,符合预期(2 + 6) / 2
- 返回值4
内部,尽可能避免类型转换,即两个整数相加将返回整数和。
字符串连接
如果加法运算符中的任何一个具有字符串值,则加法将成为字符串连接
2 + "3"
,"2" + 3
- 两个表达式都返回字符串值"23"
"John" + " " + 'Doe'
- 返回"John Doe"
比较运算符
2 > 3
2 >= 3
2 < 3
2 <= 3
2 == 3
2 != 3
'aaabbb' ^= 'aa'
- 如果左字符串操作符以右字符串操作符开头,则返回true
'aaabbb' *= 'aa'
- 如果左字符串操作符包含右字符串操作符,则返回true
'aaabbb' $= 'bb'
- 如果左字符串操作符以右字符串操作符结尾,则返回true
逻辑运算符
not true
,!true
true and true
,true && true
true 或 true
,true || true
数字范围
:10
- 范围从0
(包含)到10
(包含)1:10
- 范围从1
(包含)到10
(包含)0:2:10
- 范围从0
(包含)到10
(包含)以2
为增量5:-0.1:-1.4
- 支持范围中的浮点数1..10
- 范围从1
(包含)到10
(包含)..10
- 范围从0
(包含)到10
(包含)
上下文
每个 Opath
表达式都在 根(表示为 $
)和 当前(表示为 @
)元素的上下文中执行。要访问对象树中的任何元素,需要定义它与 当前(@
)或 根($
)元素的关系,就像文件系统的路径相对于当前目录或文件系统根一样。对于基于 当前 元素的表达式,通常可以省略对 @
的显式表示。
@.name
- 从 当前 元素返回“name”属性的值name
- 与上面相同$.name
- 从 根 元素返回“name”属性的值
数组索引
可以使用 []
符号访问数组元素。数组从 0
开始索引。
@[0]
- 返回 当前 数组的第一个元素@[0, 1..3, 5]
- 数组可以由多个以逗号分隔的索引以及索引范围进行索引@[-1,-2]
- 负索引从数组的末尾开始计算,-1
表示数组的最后一个元素@[3..]
- 在数组索引表达式中使用范围时(在[]
内),可以省略范围的结束值,它将等于数组的长度(数组元素的数量)
使用越界索引值访问数组会得到空结果。在非数组和非对象类型上访问数组元素也会得到空结果。
对象的属性访问
对象中的属性可以使用典型的 .
或 []
语法进行访问。
"name"
- 返回当前元素的 "name" 属性的值@[name]
- 与上面相同,使用[]
语法[name]
- 这是非法的!@."name"
,@["name"]
- 属性名可以加引号,如果是这样,则可以包含空格和特殊字符"name"
- 这是一个字符串字面量,不是属性访问!@.(first_name, last_name, age)
- 可以使用单个表达式选择几个属性,使用括号
访问不存在的属性会得到空结果。在非对象类型上访问属性也会得到空结果。
对象的属性索引
每个对象也可以作为数组进行索引,其中索引值将对应于对象中属性的顺序。例如,如果 当前 对象将是
{
"first_name": "John",
"last_name": "Doe"
}
表达式 @[1]
将产生字符串值 "Doe"
(第二个属性的值)。对象具有严格定义且稳定的属性插入顺序。
属性/元素过滤
对象中的属性或数组中的元素也可以在 []
语法内的逻辑表达式中进行过滤。
@[@.@key $= "name"]
- 返回以"name"
结尾的 当前 元素属性值。@[@.@index >= 3]
- 返回索引大于或等于3
的 当前 元素属性或元素。
注意,在 []
表达式内部,当前 元素(@
)成为外部元素的子元素。
属性/元素访问通配符操作符 *
@.*
,@[*]
- 返回 当前 对象的所有属性或 当前 数组的所有元素,或者根据 当前 类型返回空结果。@.(@.star)
- 如果 当前 有一个值为"*"
的"star"
属性,这将与上面相同工作(FIXME 可能需要更改行为)
属性/元素访问递归下降操作符 **
@.**
,@[**]
- 返回 当前 对象的所有属性,并递归地以深度优先降序返回它们的属性。@."**"
,@['**']
- 这也将与上面相同工作。@.(@.starstar)
- 如果 当前 有一个值为"**"
的"starstar"
属性,这将与上面相同工作(FIXME 可能需要更改行为)@.**{1,4}
,@.**{,4}
,@.**{2}
,@.**{0,2}
- 可选深度级别范围可以指定。深度级别相对于被访问的元素(在这些例子中的是 当前 元素)指定。如果省略最小深度级别值,则假定1
。如果省略最大深度级别,则降级操作将从顶部解绑,即将继续对所有后代执行。如果最小深度级别值为0
,则结果还将包括被访问的元素本身。
父级访问操作符 ^
@^
- 这会返回 当前 元素的父级元素。@.name^
- 如果 当前 元素是对象并且包含 "name" 属性,则此表达式将返回 当前 元素。
祖先访问递归操作符 ^**
@^**
- 按降序深度顺序返回 当前 元素的全部祖先。最后一个元素将是 根。@^**{1,4}
,@^**{,4}
,@^**{2}
- 可选递归距离范围可以指定,类似于**
。距离相对于被访问的元素指定。@^(@.starstar)
- 如果 当前 有一个值为"starstar"
的属性,且该值为"**"
,则此行为将与上述相同(FIXME 可能需要更改该行为)
元数据(属性)
所有元素都包含可读元数据(属性)。这些属性可以像常规属性一样访问,但需要在名称前加上@
字符。
@.@index
- 当前元素在其父元素中的索引(如果父元素是对象,这将是指定属性的索引位置)@.@key
- 当前元素在其父元素中的属性名(对于数组,这将是指索引的字符串值)@.@level
- 当前元素与根元素的距离@.@kind
- 当前元素类型的字符串值,可以是以下之一:"null"
、"boolean"
、"number"
、"string"
、"object"
、"array"
FIXME (日期、二进制)@.@file
- 描述文件或文件结构的字符串,当前元素从中读取(如果有),例如"file<yaml>:./data.yml"
。@.@file_type
- 包含文件类型(如果有)的字符串,可以是以下之一:"file"
或"dir"
@.@file_format
- 包含文件格式(如果有)的字符串,支持以下值:"json"
、"yaml"
、"toml"
、"text"
、"binary"
@.@file_path
- 包含文件路径(如果有)的字符串,例如"./data.yml"
@.@file_name
- 包含文件名(如果有)的字符串,例如"data.yml"
@.@file_stem
- 包含文件名主干的字符串(如果有),例如"data"
。对于以"."
开头的文件名,例如".data.yml"
,主干将是".data"
@.@file_ext
- 带有文件扩展名(如果有)的字符串,例如"yml"
@.@path
- 从 根目录 到 当前 元素的路径,例如"$.nested.array[3]"
许可
许可协议为以下之一
- Apache License, Version 2.0, (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
您可选择其中之一。
贡献
除非您明确声明,否则您有意提交的任何贡献,按照 Apache-2.0 许可证的界定,应如上双重许可,不附加任何额外条款或条件。
版权
版权所有 (c) 2018 Kodegenix Sp. z o.o. http://www.kodegenix.pl
依赖项
~13MB
~245K SLoC