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 Nodes
s:
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="alex@example.com" active=true
Document
{ 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 "alex@example.com" } ) ]
, 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.