kfl

Crates.iokfl
lib.rskfl
version0.3.0
sourcesrc
created_at2023-02-12 06:43:47.532929
updated_at2024-09-11 11:42:40.152575
descriptionAnother KDL language implementation
homepagehttps://gitlab.com/synthetic/kfl/kfl
repository
max_upload_size
id782871
size2,480,186
Rin Arakaki (rinarakaki)

documentation

https://docs.rs/kfl

README

KFL

mdbook

  • Nominal Typing
  • Trait-Based
  • Two-Level
  • Decode-Encode Dual
  • Literal

A KDL file format parser with great error reporting and convenient derive macros.

About KDL

To give you some background on the KDL format. Here is a small example:

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

Here is what are annotations for all the datum as described by the specification and this guide:

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"       │
}                                                   ╯

Usage

Most common usage of this library is using derive and [decode] or [decode_children] function:

use kfl::{Decode, DecodePartial, Encode};
use std::path::PathBuf;
#[cfg(feature = "http")]
use http::Uri;

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

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

#[derive(Decode, Encode)]
struct Plugin {
    #[kfl(argument)]
    name: String,
    #[cfg(feature = "http")]
    #[kfl(property)]
    url: Uri,
}

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

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Commit count: 0

cargo fmt