diff options
Diffstat (limited to 'templates/data.hs.ede')
-rw-r--r-- | templates/data.hs.ede | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/templates/data.hs.ede b/templates/data.hs.ede index b2ad9de..fccd7dc 100644 --- a/templates/data.hs.ede +++ b/templates/data.hs.ede | |||
@@ -1,13 +1,20 @@ | |||
1 | -- generated file, do not modify! | 1 | -- generated file, do not modify! |
2 | -- {{ dateTime }} | 2 | -- {{ dateTime }} |
3 | 3 | ||
4 | {-# LANGUAGE OverloadedStrings, RecordWildCards #-} | ||
4 | module {{ moduleName }} where | 5 | module {{ moduleName }} where |
5 | 6 | ||
6 | import Data.Int | 7 | import Data.Int |
7 | import Data.Word | 8 | import Data.Word |
8 | import Data.Map | 9 | import Data.Map |
10 | import Data.Vector (Vector(..)) | ||
9 | import Linear | 11 | import Linear |
10 | 12 | ||
13 | import Data.Text | ||
14 | import Data.Aeson hiding (Value,Bool) | ||
15 | import Data.Aeson.Types hiding (Value,Bool) | ||
16 | import Control.Monad | ||
17 | |||
11 | {% for t in dataAndType %} | 18 | {% for t in dataAndType %} |
12 | {% case t.value | constType %} | 19 | {% case t.value | constType %} |
13 | {% when "DataDef" %} | 20 | {% when "DataDef" %} |
@@ -25,3 +32,29 @@ type {{ t.value.aliasName }} = {{ t.value.aliasType | hsType }} | |||
25 | {% endcase %} | 32 | {% endcase %} |
26 | 33 | ||
27 | {% endfor %} | 34 | {% endfor %} |
35 | |||
36 | (.-) :: Text -> Text -> Pair | ||
37 | a .- b = a .= b | ||
38 | |||
39 | {% for t in definitions %} | ||
40 | instance ToJSON {{ t.value.dataName }} where | ||
41 | toJSON v = case v of{% for c in t.value.constructors %}{% if c.value.fields | hasFieldNames %} | ||
42 | {{ c.value.name }}{..} -> object | ||
43 | [ "tag" .- "{{ c.value.name }}"{% for f in c.value.fields %} | ||
44 | , "{{ f.value.fieldName }}" .= {{ f.value.fieldName }}{% endfor %} | ||
45 | ]{% else %} | ||
46 | {{ c.value.name }}{% for f in c.value.fields %} arg{{ f.index0 }}{% endfor %} -> object [ "tag" .- "{{ c.value.name }}"{% for f in c.value.fields %}, "arg{{ f.index0 }}" .= arg{{ f.index0 }}{% endfor %}]{% endif %}{% endfor %} | ||
47 | |||
48 | instance FromJSON {{ t.value.dataName }} where | ||
49 | parseJSON (Object obj) = do | ||
50 | tag <- obj .: "tag" | ||
51 | case tag :: Text of{% for c in t.value.constructors %}{% if c.value.fields | hasFieldNames %} | ||
52 | "{{ c.value.name }}" -> do{% for f in c.value.fields %} | ||
53 | {{ f.value.fieldName }} <- obj .: "{{ f.value.fieldName }}"{% endfor %} | ||
54 | pure $ {{ c.value.name }}{% for f in c.value.fields %} | ||
55 | {% if f.first %}{ {% else %}, {%endif%}{{ f.value.fieldName }} = {{ f.value.fieldName }}{% endfor %} | ||
56 | } {% else %} | ||
57 | "{{ c.value.name }}" -> {% for f in c.value.fields %}{% if f.first %}{{ c.value.name }} <$>{% else %} <*>{% endif %} obj .: "arg{{ f.index0 }}"{%else%}pure {{ c.value.name }}{% endfor %}{% endif %}{% endfor %} | ||
58 | parseJSON _ = mzero | ||
59 | |||
60 | {% endfor %} \ No newline at end of file | ||