Skip to content


Repository files navigation


A Haskell library for the KDL document language, featuring a Parser and a Formatter.



This is the source code for the provided Main.hs program, it reformats a KDL document received through stdin.

main :: IO ()
main = do
  input <- T.pack <$> getContents
  case parse document "" input of
    Left  e -> putStrLn (errorBundlePretty e)
    Right d -> print d

The KDL module hence exports document :: Parser Document, which you can run using Megaparsec's parse.

Moreover, Document's show class instance is backed by Prettyprinter's Pretty type class, this allows for control over the document's layout options and using the various available rendering backends.

A Document is simply a list of Nodess:

data Node = Node
  { nodeAnn      :: Maybe Identifier
  , nodeName     :: Identifier
  , nodeArgs     :: [Value]
  , nodeProps    :: Map Identifier Value
  , nodeChildren :: [Node]

The following is an example of a KDL document and its resulting Haskell representation:

author "Alex Monad" email="" active=true
  { docNodes =
    [ Node
      { nodeAnn      = Nothing
      , nodeName     = Identifier "author"
      , nodeArgs     = [ Value { valueAnn = Nothing
                               , valueExp = StringValue "Alex Monad" } ]
      , nodeProps    = fromList
        [ ( Identifier "active"
          , Value { valueAnn = Nothing
                  , valueExp = BooleanValue True } )
        , ( Identifier "email"
          , Value { valueAnn = Nothing
                  , valueExp = StringValue "" } ) ]
      , nodeChildren = [] } ] }


This is a Stack project, you can build it using stack build, the test suite is described in the test/Spec.hs file and can be run with stack test.


Aside from Megaparsec and Prettyprinter, this library makes use of:

  • text: An efficient packed Unicode text type.
  • scientific: Convenience representation of numbers using scientific notation.
  • containers: Provides the Map data type used for representing a node's set of properties.


As it stands, this library is not anywhere near a battle-tested trusty tool; this is further aggravated by the ongoing discussions on the specification.

  • More extensive Unit/Property-based tests.
  • Full support for the reserved Type Annotations in the specification.
  • Support for the Query and Schema specifications.


Feel free to open issues and/or pull requests on fuzzypixelz/Hustle; the kdl-org Code of Conduct applies.


As an uninitiated Haskell programmer, I can happily bear witness to the friendliness of the Haskell community. I may have asked a bit too many questions on the Libera IRC #haskell channel, but the people over there never failed to deliver crystal clear explanations; thank you.


Hustle is open-source software under the terms of the permissive MIT License.


Haskell implementation of the KDL Document Language







No packages published