2 个版本

0.2.1 2024 年 3 月 16 日
0.2.0 2024 年 2 月 14 日

#493开发工具

MIT 许可证

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