A Haskell library for the KDL document language, featuring a Parser and a Formatter.
This is the source code for the provided hustle-fmt 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 dThe 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="[email protected]" active=trueDocument
{ 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 "[email protected]" } ) ]
, nodeChildren = [] } ] }This is a Cabal project, you can build it using cabal build, the test suite is described
in the test/Spec.hs file and can be run with cabal 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
Mapdata 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.