diff options
author | Csaba Hruska <csaba.hruska@gmail.com> | 2015-09-10 16:19:51 +0200 |
---|---|---|
committer | Csaba Hruska <csaba.hruska@gmail.com> | 2015-09-10 16:19:51 +0200 |
commit | 93f747e7836cb3d15976a8608a453e3396c0d428 (patch) | |
tree | 05aeb86b5493af4d8994ace3a3cd9e611ecd9f1c | |
parent | f3b37b12d00bb98dd08cd13acd304a5dd6046ec5 (diff) |
purescript has all in one modules
-rw-r--r-- | Generate.hs | 4 | ||||
-rw-r--r-- | templates/data.purs.ede | 30 | ||||
-rw-r--r-- | templates/decode.purs.ede | 19 | ||||
-rw-r--r-- | templates/encode.purs.ede | 15 |
4 files changed, 30 insertions, 38 deletions
diff --git a/Generate.hs b/Generate.hs index a701b22..71302cc 100644 --- a/Generate.hs +++ b/Generate.hs | |||
@@ -25,8 +25,6 @@ main = do | |||
25 | irEncodeHs <- eitherParseFile "templates/encode.hs.ede" | 25 | irEncodeHs <- eitherParseFile "templates/encode.hs.ede" |
26 | irDecodeHs <- eitherParseFile "templates/decode.hs.ede" | 26 | irDecodeHs <- eitherParseFile "templates/decode.hs.ede" |
27 | irPs <- eitherParseFile "templates/data.purs.ede" | 27 | irPs <- eitherParseFile "templates/data.purs.ede" |
28 | irEncodePs <- eitherParseFile "templates/encode.purs.ede" | ||
29 | irDecodePs <- eitherParseFile "templates/decode.purs.ede" | ||
30 | let generate name def = do | 28 | let generate name def = do |
31 | dt <- getCurrentTime | 29 | dt <- getCurrentTime |
32 | let env = fromPairs | 30 | let env = fromPairs |
@@ -52,6 +50,4 @@ main = do | |||
52 | either error (\x -> writeFile ("out/" ++ name ++ "Decode.hs") $ LText.unpack x) $ irDecodeHs >>= (\t -> eitherRenderWith mylib t env) | 50 | either error (\x -> writeFile ("out/" ++ name ++ "Decode.hs") $ LText.unpack x) $ irDecodeHs >>= (\t -> eitherRenderWith mylib t env) |
53 | -- Purescript | 51 | -- Purescript |
54 | either error (\x -> writeFile ("out/" ++ name ++ ".purs") $ LText.unpack x) $ irPs >>= (\t -> eitherRenderWith mylib t env) | 52 | either error (\x -> writeFile ("out/" ++ name ++ ".purs") $ LText.unpack x) $ irPs >>= (\t -> eitherRenderWith mylib t env) |
55 | either error (\x -> writeFile ("out/" ++ name ++ "Encode.purs") $ LText.unpack x) $ irEncodePs >>= (\t -> eitherRenderWith mylib t env) | ||
56 | either error (\x -> writeFile ("out/" ++ name ++ "Decode.purs") $ LText.unpack x) $ irDecodePs >>= (\t -> eitherRenderWith mylib t env) | ||
57 | generate "IR" ir | 53 | generate "IR" ir |
diff --git a/templates/data.purs.ede b/templates/data.purs.ede index a26f292..957fff4 100644 --- a/templates/data.purs.ede +++ b/templates/data.purs.ede | |||
@@ -10,6 +10,12 @@ import Data.Map (Map(..)) | |||
10 | import Data.List (List(..)) | 10 | import Data.List (List(..)) |
11 | import Linear | 11 | import Linear |
12 | 12 | ||
13 | import Data.Argonaut.Combinators ((~>), (:=), (.?)) | ||
14 | import Data.Argonaut.Core (jsonEmptyObject) | ||
15 | import Data.Argonaut.Printer (printJson) | ||
16 | import Data.Argonaut.Encode (EncodeJson, encodeJson) | ||
17 | import Data.Argonaut.Decode (DecodeJson, decodeJson) | ||
18 | |||
13 | {% for t in dataAndType %} | 19 | {% for t in dataAndType %} |
14 | {% case t.value | constType %} | 20 | {% case t.value | constType %} |
15 | {% when "DataDef" %} | 21 | {% when "DataDef" %} |
@@ -32,3 +38,27 @@ derive instance generic{{ t.value.dataName }} :: Generic {{ t.value.dataName }} | |||
32 | instance show{{ t.value.dataName }} :: Show {{ t.value.dataName }} where show = gShow | 38 | instance show{{ t.value.dataName }} :: Show {{ t.value.dataName }} where show = gShow |
33 | instance eq{{ t.value.dataName }} :: Eq {{ t.value.dataName }} where eq = gEq | 39 | instance eq{{ t.value.dataName }} :: Eq {{ t.value.dataName }} where eq = gEq |
34 | {% endif %}{% endlet %}{% endfor %} | 40 | {% endif %}{% endlet %}{% endfor %} |
41 | |||
42 | {# JSON Encode and Decode #} | ||
43 | {% for t in definitions %} | ||
44 | instance encodeJson{{ t.value.dataName }} :: EncodeJson {{ t.value.dataName }} where | ||
45 | encodeJson v = case v of{% for c in t.value.constructors %}{% if c.value.fields | hasFieldNames %} | ||
46 | {{ c.value.name }} r -> | ||
47 | "tag" := "{{ c.value.name }}" ~>{% for f in c.value.fields %} | ||
48 | "{{ f.value.fieldName }}" := r.{{ f.value.fieldName }} ~>{% endfor %} | ||
49 | jsonEmptyObject{% else %} | ||
50 | {{ c.value.name }}{% for f in c.value.fields %} arg{{ f.index0 }}{% endfor %} -> "tag" := "{{ c.value.name }}"{% for f in c.value.fields %} ~> "arg{{ f.index0 }}" := arg{{ f.index0 }}{% endfor %} ~> jsonEmptyObject{% endif %}{% endfor %} | ||
51 | |||
52 | instance decodeJson{{ t.value.dataName }} :: DecodeJson {{ t.value.dataName }} where | ||
53 | decodeJson json = do | ||
54 | obj <- decodeJson json | ||
55 | tag <- obj .? "tag" | ||
56 | case tag of{% for c in t.value.constructors %}{% if c.value.fields | hasFieldNames %} | ||
57 | "{{ c.value.name }}" -> do{% for f in c.value.fields %} | ||
58 | {{ f.value.fieldName }} <- obj .? "{{ f.value.fieldName }}"{% endfor %} | ||
59 | pure $ {{ c.value.name }}{% for f in c.value.fields %} | ||
60 | {% if f.first %}{ {% else %}, {%endif%}{{ f.value.fieldName }}:{{ f.value.fieldName }}{% endfor %} | ||
61 | } {% else %} | ||
62 | "{{ 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 %} | ||
63 | |||
64 | {% endfor %} \ No newline at end of file | ||
diff --git a/templates/decode.purs.ede b/templates/decode.purs.ede deleted file mode 100644 index d5390a9..0000000 --- a/templates/decode.purs.ede +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | -- generated file, do not modify! | ||
2 | -- {{ dateTime }} | ||
3 | |||
4 | module {{ moduleName }}Decode where | ||
5 | |||
6 | {% for t in definitions %} | ||
7 | instance decodeJson{{ t.value.dataName }} :: DecodeJson {{ t.value.dataName }} where | ||
8 | decodeJson json = do | ||
9 | obj <- decodeJson json | ||
10 | tag <- obj .? "tag" | ||
11 | case tag of{% for c in t.value.constructors %}{% if c.value.fields | hasFieldNames %} | ||
12 | "{{ c.value.name }}" -> do{% for f in c.value.fields %} | ||
13 | {{ f.value.fieldName }} <- obj .? "{{ f.value.fieldName }}"{% endfor %} | ||
14 | pure $ {{ c.value.name }}{% for f in c.value.fields %} | ||
15 | {% if f.first %}{ {% else %}, {%endif%}{{ f.value.fieldName }}:{{ f.value.fieldName }}{% endfor %} | ||
16 | } {% else %} | ||
17 | "{{ c.value.name }}" -> {{ c.value.name }}{% for f in c.value.fields %} {% if f.first %}<$>{% else %}<*>{% endif %} obj .? "arg{{ f.index0 }}"{% endfor %}{% endif %}{% endfor %} | ||
18 | |||
19 | {% endfor %} \ No newline at end of file | ||
diff --git a/templates/encode.purs.ede b/templates/encode.purs.ede deleted file mode 100644 index e2cfcac..0000000 --- a/templates/encode.purs.ede +++ /dev/null | |||
@@ -1,15 +0,0 @@ | |||
1 | -- generated file, do not modify! | ||
2 | -- {{ dateTime }} | ||
3 | |||
4 | module {{ moduleName }}Encode where | ||
5 | |||
6 | {% for t in definitions %} | ||
7 | instance encodeJson{{ t.value.dataName }} :: EncodeJson {{ t.value.dataName }} where | ||
8 | encodeJson v = case v of{% for c in t.value.constructors %}{% if c.value.fields | hasFieldNames %} | ||
9 | {{ c.value.name }} r -> | ||
10 | "tag" := "{{ c.value.name }}" ~>{% for f in c.value.fields %} | ||
11 | "{{ f.value.fieldName }}" := r.{{ f.value.fieldName }} ~>{% endfor %} | ||
12 | jsonEmptyObject{% else %} | ||
13 | {{ c.value.name }}{% for f in c.value.fields %} arg{{ f.index0 }}{% endfor %} -> "tag" := "{{ c.value.name }}"{% for f in c.value.fields %} ~> "arg{{ f.index0 }}" := arg{{ f.index0 }}{% endfor %} ~> jsonEmptyObject{% endif %}{% endfor %} | ||
14 | |||
15 | {% endfor %} \ No newline at end of file | ||