2 个版本
0.2.1 | 2024 年 3 月 16 日 |
---|---|
0.2.0 | 2024 年 2 月 14 日 |
#493 在 开发工具 中
30KB
831 行
Confiner - 类似树的配置语言。
/\
< >
\/
CONF
CONF
CONF||CONF
CONF||CONF
CONF||||CONF
CONF CONF CONF
CONF CONF CONF
CONF CONF CONF CONF
CONF |||| CONF
||||
(配置 + Conifer,明白了吗?)
例如
一个简单的 web 服务器配置...
my_server: server
{
addr = "127.0.0.1:80",
my_uri_handler: uri
{
mount = "/files",
pattern = [ "" ],
file_service: raw_files
{
path = ./files
}
}
}
功能
块
Confiner 文件包含一系列块,每个块包含一组键值属性和子块。这类似于 HTML 或设备树文件。
块有一个类型,以及一个可选的全局唯一名称。块的语法以可选的名称标识符开始,后跟冒号和块类型,然后是一个包含逗号分隔的属性和子块的括号对。例如。
block_name: block_kind
{
property="expr",
: child_1_kind
{
property="expr",
subchild: subchild_kind {}
},
child_2: child_2_kind {}
}
表达式类型
基本数据类型可以用合理的方式表达
- 整数 (
1
,-2
,0x03
, ...) - 浮点数 (
1.0
,1e-3
, ...) - 字符串 (
"hello world"
,"Line 1\nLine 2"
,"\"quoted\""
, ...) - 列表 (
[1, 2, 3]
, ...) - 带有字符串键的映射 (
{ key = "value" } )
, ...)
还有一些独特的表达式类型。
枚举
这些有助于明确地序列化 Rust 的枚举类型。它由一个以感叹号开头的枚举标识符组成,后跟该枚举变体的数据(可选)。
例如,考虑以下枚举
enum MyEnum
{
Unit,
NewType(String),
Tuple(i32, i32),
Struct { field: bool }
}
它可以按以下方式序列化
!单元
!新类型"值"
!元组[i32, i32]
!结构体{字段= true }
路径
路径表达式可以展开为相对于配置器文件位置的文件绝对路径。这些表达式遵循@include
指令,并且无论文件是直接包含还是反序列化,始终评估为相同的字节。
它们以相对路径的形式编写,前面带有.
。它们未加引号,并且不能包含未转义的空格。例如
.
(包含配置器文件的目录)./file.txt
(与配置器文件相同的目录中的文件)./directory\ 与\ spaces/file.txt
参考
在配置器文件的最高级别,可以定义引用。而不是直接创建一个块,可以通过“使用”引用将这些块放置在其他位置。相同的块可以放置在多个位置,从而允许比简单的树结构更复杂的结构。
定义引用的语法与定义正常顶级块的语法相同,但带有前缀"&"。引用块必须命名。
使用引用的语法只是一个"&"后跟引用的名称。
&my_reference: kind { }
normal_block: kind
{
&my_reference,
child_block: kind
{
&my_reference
}
}
包含的文件
可以使用@include <path>
语法包含文件。每个包含的文件最多评估一次,包含文件中的任何引用或顶级块都等同于包含@include <path>
的文件中的引用或顶级块。
@include <path>
语法使用与路径表达式相同的相对路径逻辑。
@include ./other_file.conf
@include ./subdir/file.conf
依赖关系
~0.4–1MB
~24K SLoC