/
Encode.purs
82 lines (63 loc) · 2.39 KB
/
Encode.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
module GraphQL.Hasura.Encode (class EncodeHasura, EncodeHasuraProp, encodeHasura) where
import Prelude
import Data.Argonaut.Core (Json)
import Data.Argonaut.Encode (encodeJson)
import Data.Argonaut.Encode.Encoders (encodeString)
import Data.DateTime (Date, DateTime(..), Time(..), day, month, year)
import Data.Enum (class BoundedEnum, fromEnum)
import Data.Maybe (Maybe)
import Heterogeneous.Mapping (class HMap, class Mapping, hmap)
import Unsafe.Coerce (unsafeCoerce)
class EncodeHasura a where
encodeHasura :: a -> Json
instance encodeHasuraBoolean :: EncodeHasura Boolean where
encodeHasura = encodeJson
instance encodeHasuraString :: EncodeHasura String where
encodeHasura = encodeJson
instance encodeHasuraInt :: EncodeHasura Int where
encodeHasura = encodeJson
instance encodeHasuraNumber :: EncodeHasura Number where
encodeHasura = encodeJson
instance encodeHasuraJson :: EncodeHasura Json where
encodeHasura = encodeJson
instance encodeHasuraArray :: EncodeHasura a => EncodeHasura (Array a) where
encodeHasura = map encodeHasura >>> encodeJson
instance encodeHasuraMaybe :: EncodeHasura a => EncodeHasura (Maybe a) where
encodeHasura = map encodeHasura >>> encodeJson
instance encodeHasuraDateTime :: EncodeHasura DateTime where
encodeHasura (DateTime d t) = encodeString $ dateString d <> "T" <> timeString t
instance encodeHasuraDate :: EncodeHasura Date where
encodeHasura = dateString >>> encodeString
dateString :: Date -> String
dateString d =
showEnum (year d)
<> "-"
<> showEnum (month d)
<> "-"
<> showEnum (day d)
instance encodeHasuraTime :: EncodeHasura Time where
encodeHasura = timeString >>> encodeString
timeString :: Time -> String
timeString (Time h m s ms) =
showEnum h
<> ":"
<> showEnum m
<> ":"
<> showEnum s
<> "."
<> showEnum ms
showEnum :: forall b. BoundedEnum b => b -> String
showEnum = show <<< fromEnum
instance encodeHasuraRecord :: HMap EncodeHasuraProp { | r } jsonRecord => EncodeHasura { | r } where
encodeHasura = encodeRecordProps >>> recordToJson
where
recordToJson :: jsonRecord -> Json
recordToJson = unsafeCoerce
data EncodeHasuraProp
= EncodeHasuraProp
instance addOneAndShow ::
EncodeHasura a =>
Mapping EncodeHasuraProp a Json where
mapping EncodeHasuraProp = encodeHasura
encodeRecordProps :: forall r1 r2. HMap EncodeHasuraProp r1 r2 => r1 -> r2
encodeRecordProps = hmap EncodeHasuraProp