Packages

Kuddle is a KDL Decoder, Encoder and utility library for Elixir.

Current section

Files

Jump to
kuddle lib kuddle.ex
Raw

lib/kuddle.ex

defmodule Kuddle do
@moduledoc """
Kuddle is a KDL (https://github.com/kdl-org/kdl) encoder and decoder.
It is compliant with both the 1.x and 2.x specifications, simply use the appropriately versioned
module for your needs.
And yes UTF-8 still works.
V2 is the default.
"""
@type document :: Kuddle.V2.Decoder.document()
@type tokens :: Kuddle.V2.Tokenizer.tokens()
@doc """
Decode a KDL document into kuddle nodes
## Usage
Kuddle.decode(blob)
{:ok, [%Kuddle.Node{name: "node"}], []} = Kuddle.decode("node")
## Examples
iex> Kuddle.decode("node { node2 1; }")
{:ok, [%Kuddle.Node{name: "node", children: [%Kuddle.Node{name: "node2", attributes: [%Kuddle.Value{type: :integer, value: 1, format: :dec}]}]}], []}
"""
@spec decode(String.t()) ::
{:ok, document(), rest::tokens()}
| {:error, term()}
defdelegate decode(blob), to: Kuddle.V2.Decoder
@doc """
Decode a KDL blob into kuddle nodes, if the blob is not a valid KDL document this will raise
a Kuddle.DecodeError.
## Usage
Kuddle.decode!(blob)
[%Kuddle.Node{name: "node"}] = Kuddle.decode!("node")
## Examples
iex> Kuddle.decode!("node")
[%Kuddle.Node{name: "node"}]
"""
@spec decode!(String.t()) :: document()
defdelegate decode!(blob), to: Kuddle.V2.Decoder
@doc """
Encode a kuddle document as serialized KDL
## Usage
Kuddle.encode(kdl_document)
"node" = Kuddle.encode([%Kuddle.Node{name: "node"}])
## Examples
iex> Kuddle.encode([%Kuddle.Node{name: "node"}])
{:ok, "node\\n"}
"""
@spec encode(document(), Keyword.t()) ::
{:ok, String.t()}
| {:error, term()}
defdelegate encode(doc, options \\ []), to: Kuddle.V2.Encoder
@doc """
Encode a kuddle document as serialized KDL, if the document cannot be encoded a Kuddle.EncodeError
will be raised.
## Usage
"node" = Kuddle.encode!([%Kuddle.Node{name: "node"}])
## Examples
iex> Kuddle.encode!([%Kuddle.Node{name: "node"}])
"node\\n"
"""
@spec encode!(document(), Keyword.t()) :: String.t()
defdelegate encode!(doc, options \\ []), to: Kuddle.V2.Encoder
@doc """
Select allows searching a document for particular nodes by name, and or attributes.
## Usage
Kuddle.select(kdl_document, path)
[%Kuddle.Node{name: "node"}] = Kuddle.select(document, ["node"])
## Examples
iex> document = Kuddle.decode!("node; node2; node3")
[%Kuddle.Node{name: "node"}, %Kuddle.Node{name: "node2"}, %Kuddle.Node{name: "node3"}]
iex> Kuddle.select(document, ["node"])
[%Kuddle.Node{name: "node"}]
"""
@spec select(document(), Kuddle.Path.path()) :: document()
defdelegate select(doc, path), to: Kuddle.Path
end