# ExKdl
A robust and efficient decoder and encoder for the [KDL Document Language](https://kdl.dev).
ExKdl conforms to the KDL 1.0.0 [spec](https://github.com/kdl-org/kdl/blob/main/SPEC.md) and is tested against the official [test suite](https://github.com/kdl-org/kdl/tree/main/tests).
## Basic Usage
```elixir
iex(1)> nodes = ExKdl.decode!("node 100 key=\"value\" 10_000 /* comment */ {\n child_1\n child_2\n}\n")
[
%ExKdl.Node{
children: [
%ExKdl.Node{
children: [],
name: "child_1",
properties: %{},
type: nil,
values: []
},
%ExKdl.Node{
children: [],
name: "child_2",
properties: %{},
type: nil,
values: []
}
],
name: "node",
properties: %{"key" => %ExKdl.Value{type: nil, value: "value"}},
type: nil,
values: [
%ExKdl.Value{type: nil, value: %Decimal{coef: 100}},
%ExKdl.Value{type: nil, value: %Decimal{coef: 10000}}
]
}
]
iex(2)> ExKdl.encode!(nodes)
"node 100 10000 key=\"value\" {\n child_1\n child_2\n}\n"
```
## Developing
This repo includes the [kdl-org/kdl](https://github.com/kdl-org/kdl) repo listed as a submodule for testing purposes.
```
git clone --recurse-submodules <this repo>
```
Or, if already cloned, initialize the submodule with:
```
git submodule update --init
```
### Dependencies
```
mix deps.get
```
### Running tests
```
mix test
```
To run a specific test from the kdl-org test suite, use the `--only` option and pass it the `path` (where `path` is `input/<filename>.kdl`). For example:
```
mix test --only input/raw_string_just_backslash.kdl
```
## License
ExKdl is released under the MIT license ([LICENSE.txt](LICENSE.txt)).