Skip to content

Commit 74a949d

Browse files
Implement KDL.render (#13)
1 parent cb80c1a commit 74a949d

2 files changed

Lines changed: 52 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## Unreleased
22

3+
* Implement `KDL.render`, which is format-preserving
34
* Improve rendering parse errors
45
* Include filepath in error messages when `decodeFileWith` fails
56

src/KDL/Render.hs

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ module KDL.Render (
77
render,
88

99
-- * Rendering components
10+
renderNodeList,
11+
renderNode,
12+
renderEntry,
1013
renderAnn,
1114
renderValue,
1215
renderValueData,
@@ -20,16 +23,62 @@ import KDL.Types (
2023
Ann (..),
2124
AnnFormat (..),
2225
Document,
26+
Entry (..),
27+
EntryFormat (..),
2328
Identifier (..),
2429
IdentifierFormat (..),
30+
Node (..),
31+
NodeFormat (..),
32+
NodeList (..),
33+
NodeListFormat (..),
2534
Value (..),
2635
ValueData (..),
2736
ValueFormat (..),
2837
)
2938

30-
-- TODO: Implement render after parsing Document with formatting information
3139
render :: Document -> Text
32-
render = error "render is not implemented yet"
40+
render = renderNodeList
41+
42+
renderNodeList :: NodeList -> Text
43+
renderNodeList NodeList{..} =
44+
Text.concat
45+
[ maybe "" (.leading) format
46+
, foldMap renderNode nodes
47+
, maybe "" (.trailing) format
48+
]
49+
50+
renderNode :: Node -> Text
51+
renderNode Node{..} =
52+
Text.concat
53+
[ maybe "" (.leading) format
54+
, maybe "" renderAnn ann
55+
, renderIdentifier name
56+
, foldMap renderEntry entries
57+
, maybe "" (.before_children) format
58+
, case children of
59+
Nothing -> ""
60+
Just nodes -> "{" <> renderNodeList nodes <> "}"
61+
, maybe "" (.before_terminator) format
62+
, maybe "" (.terminator) format
63+
, maybe "" (.trailing) format
64+
]
65+
66+
renderEntry :: Entry -> Text
67+
renderEntry Entry{..} =
68+
Text.concat
69+
[ maybe "" (.leading) format
70+
, case name of
71+
Nothing -> renderValue value
72+
Just nameId ->
73+
Text.concat
74+
[ renderIdentifier nameId
75+
, maybe "" (.after_key) format
76+
, "="
77+
, maybe "" (.after_eq) format
78+
, renderValue value
79+
]
80+
, maybe "" (.trailing) format
81+
]
3382

3483
renderAnn :: Ann -> Text
3584
renderAnn Ann{..} =

0 commit comments

Comments
 (0)