Skip to content

OCaml implementation of the KDL Document Language

License

Notifications You must be signed in to change notification settings

eilvelia/ocaml-kdl

Repository files navigation

ocaml-kdl   CI

An OCaml implementation of the KDL Document Language 2.0.0.

$ opam install kdl

Note: This is the working version for KDL v2. For the published version of ocaml-kdl for KDL v1, see the v0.1.0 tag.

Features

  • Parsing
  • Pretty-printing
  • Lenses
  • KDL Query Language (KQL)
  • KDL Schema Language
  • Preserve formatting when editing

Usage

Example:

# let kdl = Kdl.from_string {|
    contents {
      section "First section" {
        paragraph "This is the first paragraph"
        paragraph "This is the second paragraph"
      }
    }
  |}
val kdl : (Kdl.t, Kdl.error) result = Ok
 [{Kdl.name = "contents"; annot = None; args = []; props = [];
   children =
    [{Kdl.name = "section"; annot = None;
      args = [(None, `String "First section")]; props = [];
      children =
       [{Kdl.name = "paragraph"; annot = None;
         args = [(None, `String "This is the first paragraph")]; props = [];
         children = []};
        {Kdl.name = "paragraph"; annot = None;
         args = [(None, `String "This is the second paragraph")]; props = [];
         children = []}]}]}]

Convert to a sexp-expression (uses the sexplib0 library):

# Kdl.sexp_of_t kdl |> Sexplib0.Sexp.to_string_hum |> print_endline
(contents
 (children
  (section (string "First section")
   (children (paragraph (string "This is the first paragraph"))
    (paragraph (string "This is the second paragraph"))))))

Pretty-print the KDL document back:

# Kdl.to_string kdl |> print_endline
contents {
  section "First section" {
    paragraph "This is the first paragraph"
    paragraph "This is the second paragraph"
  }
}

Similar to to.ml, ocaml-kdl provides lenses. The lenses can be composed using // or |--:

# let open Kdl.L in
  kdl.@(top // child "section" // child_nth 1 // arg 0 // string_value)
- : string option = Some "This is the second paragraph"

Additionaly, type-annotated values can be "interpreted":

# let parsed = Kdl.from_string_exn "- (u8)220"
# Kdl.interpret Kdl.L.(parsed.@!(node "-" // arg 0))
- : [> Kdl.typed_value ] = `U8 220

For the full list of available functions, see the mli file.

About

OCaml implementation of the KDL Document Language

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages