-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Serialize.purs
49 lines (42 loc) · 1.98 KB
/
Serialize.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
module Flame.Serialization (class SerializeState, serialize, class UnserializeState, unserialize, unsafeUnserialize) where
import Data.Argonaut.Core as DAC
import Data.Argonaut.Decode (JsonDecodeError)
import Data.Argonaut.Decode as DAD
import Data.Argonaut.Decode.Class (class GDecodeJson)
import Data.Argonaut.Decode.Generic (class DecodeRep)
import Data.Argonaut.Decode.Generic as DADEG
import Data.Argonaut.Encode as DAE
import Data.Argonaut.Encode.Class (class GEncodeJson)
import Data.Argonaut.Encode.Generic (class EncodeRep)
import Data.Argonaut.Encode.Generic as DAEG
import Data.Bifunctor as DB
import Data.Either (Either(..))
import Data.Generic.Rep (class Generic)
import Partial as P
import Partial.Unsafe as PU
import Prelude (bind, show, (<<<), ($))
import Prim.RowList (class RowToList)
class UnserializeState m where
unserialize :: String -> Either String m
instance recordUnserializeState :: (GDecodeJson m list, RowToList m list) => UnserializeState (Record m) where
unserialize model = jsonStringError do
json <- DAD.parseJson model
DAD.decodeJson json
else
instance genericUnserializeState :: (Generic m r, DecodeRep r) => UnserializeState m where
unserialize model = jsonStringError do
json <- DAD.parseJson model
DADEG.genericDecodeJson json
class SerializeState m where
serialize :: m -> String
instance encodeJsonSerializeState :: (GEncodeJson m list, RowToList m list) => SerializeState (Record m) where
serialize = DAC.stringify <<< DAE.encodeJson
else
instance genericSerializeState :: (Generic m r, EncodeRep r) => SerializeState m where
serialize = DAC.stringify <<< DAEG.genericEncodeJson
jsonStringError :: forall a. Either JsonDecodeError a -> Either String a
jsonStringError = DB.lmap DAD.printJsonDecodeError
unsafeUnserialize :: forall m. UnserializeState m => String -> m
unsafeUnserialize str = PU.unsafePartial case unserialize str of
Right m -> m
Left err -> P.crashWith $ show err