1个不稳定版本

0.0.16 2023年2月18日
0.0.15 2023年2月17日

#1507解析器实现

每月22次下载
用于 2 crates

MIT/Apache

1.5MB
4K SLoC

Rust 3K SLoC // 0.0% comments JavaScript 1K SLoC // 0.1% comments

包含 (WOFF字体,99KB) fontawesome-webfont.woff,(WOFF字体,78KB) fontawesome-webfont.woff2,(WOFF字体,45KB) open-sans-v17-all-charsets-300.woff2,(WOFF字体,41KB) open-sans-v17-all-charsets-300italic.woff2,(WOFF字体,45KB) open-sans-v17-all-charsets-600.woff2,(WOFF字体,43KB) open-sans-v17-all-charsets-600italic.woff27个更多

KFL

一个具有出色错误报告和方便的 derive 宏的 KDL 文件格式解析器。

关于KDL

为了给您一些关于KDL格式的背景信息。这里是一个小例子

foo 1 "three" key="val" {
    bar
    (role)baz 1 2
}

以下是所有数据注释的描述,这些数据由规范和本指南所描述

foo 1 "three" key="val" {                           ╮
─┬─ ┬ ───┬─── ────┬────                             │
 │  │    │        ╰───── property (can be multiple) │
 │  │    │                                          │
 │  ╰────┴────────────── arguments                  │
 │                                                  │
 ╰── node name                                      ├─ node "foo", with
                                                    │  "bar" and "baz"
    bar                                             │  being children
    (role)baz 1 2                                   │
     ──┬─                                           │
       ╰────── type name for node named "baz"       │
}                                                   ╯

(注意,属性的顺序并不重要,以及属性与参数的顺序,因此我将参数移动以减少箭头的交集)

用法

此库最常见的用法是使用 derive 和 [parse] 函数

use kfl::Decode;

#[derive(Decode)]
struct Config {
    #[kfl(children)]
    routes: Vec<Route>,
    #[kfl(children)]
    plugins: Vec<Plugin>,
}

#[derive(Decode)]
struct Route {
    #[kfl(argument)]
    path: String,
    #[kfl(children)]
    subroutes: Vec<Route>,
}

#[derive(Decode)]
struct Plugin {
    #[kfl(argument)]
    name: String,
    #[kfl(property)]
    url: String,
}

# fn main() -> miette::Result<()> {
let config = kfl::decode_children::<Config>("example.kdl", r#"
    route "/api" {
        route "/api/v1"
    }
    plugin "http" url="https://example.org/http"
"#)?;
# Ok(())
# }

这解析为一个枚举类型的节点向量 Config,但如果没有声明属性和参数,您也可以将某些节点用作文档的根

#[derive(Decode)]
struct Document {
    #[kfl(child, unwrap(argument))]
    version: Option<String>,
    #[kfl(children)]
    routes: Vec<Route>,
    #[kfl(children)]
    plugins: Vec<Plugin>,
}

let config = kfl::decode_children::<Document>("example.kdl", r#"
    version "2.0"
    route "/api" {
        route "/api/v1"
    }
    plugin "http" url="https://example.org/http"
"#)?;

有关允许的属性和解析模式的完整参考,请参阅DecodeDecodeScalar的描述。

许可证

根据以下之一获得许可

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在本作品中的任何贡献,应如上双许可,不附加任何额外条款或条件。

依赖项

~1.6–2.5MB
~43K SLoC