/
Enum.purs
65 lines (51 loc) · 1.9 KB
/
Enum.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
module GraphQL.Client.CodeGen.Template.Enum where
import Prelude
import Data.Foldable (intercalate)
import Data.String (toUpper)
import Data.String as String
template ::
String ->
{ name :: String
, values :: Array String
} ->
String
template modulePrefix { name, values } =
"""module """ <> modulePrefix <> """Enum.""" <> name <> """ where
import Prelude
import Data.Argonaut.Decode (class DecodeJson, JsonDecodeError(..), decodeJson)
import Data.Argonaut.Encode (class EncodeJson, encodeJson)
import Data.Either (Either(..))
import Data.Function (on)
import GraphQL.Client.Args (class ArgGql)
import GraphQL.Client.ToGqlString (class GqlArgString)
data """ <> name <> """
= """ <> enumCtrs <> """
instance eq""" <> name <> """ :: Eq """ <> name <> """ where
eq = eq `on` show
instance ord""" <> name <> """ :: Ord """ <> name <> """ where
compare = compare `on` show
instance argToGql""" <> name <> """ :: ArgGql """ <> name <> """ """ <> name <> """
instance gqlArgString""" <> name <> """ :: GqlArgString """ <> name <> """ where
toGqlArgStringImpl = show
instance decodeJson""" <> name <> """ :: DecodeJson """ <> name <> """ where
decodeJson = decodeJson >=> case _ of
""" <> decodeMember <> """
s -> Left $ TypeMismatch $ "Not a """ <> name <> """: " <> s
instance encodeJson""" <> name <> """ :: EncodeJson """ <> name <> """ where
encodeJson = show >>> encodeJson
instance show""" <> name <> """ :: Show """ <> name <> """ where
show a = case a of
""" <> showMember <> """
"""
where
enumCtrs = intercalate "\n | " (map upper1st values)
decodeMember =
values
<#> (\v -> " \"" <> v <> "\" -> pure " <> upper1st v <> "")
# intercalate "\n"
showMember =
values
<#> (\v -> " " <> upper1st v <> " -> \"" <> v <> "\"")
# intercalate "\n"
upper1st :: String -> String
upper1st s = toUpper (String.take 1 s) <> String.drop 1 s