Skip to content

Commit c7f490a

Browse files
committed
Add nullarySumWith
1 parent b192e34 commit c7f490a

File tree

1 file changed

+44
-14
lines changed

1 file changed

+44
-14
lines changed

src/Data/Codec/Argonaut/Generic.purs

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,57 @@ import Type.Proxy (Proxy(..))
2323
-- | decode (nullarySum "MySum") (J.fromString "MoarCtors") == Right MoarCtors
2424
-- |```
2525
nullarySum a r. Generic a r NullarySumCodec r String CA.JsonCodec a
26-
nullarySum name =
26+
nullarySum name = nullarySumWith defaultNullarySumEncoding name
27+
28+
type NullarySumEncoding =
29+
{ mapTag String String
30+
}
31+
32+
defaultNullarySumEncoding NullarySumEncoding
33+
defaultNullarySumEncoding =
34+
{ mapTag: identity
35+
}
36+
37+
-- | Like nullarySum, but allows customizing the encoding with options.
38+
-- |
39+
-- | ```purescript
40+
-- | import Data.Argonaut as J
41+
-- |
42+
-- | data MySum = Ctor1 | Ctor2 | MoarCtors
43+
-- | derive instance genericMySum ∷ Generic MySum _
44+
-- |
45+
-- | let opts = { mapTag: \tag → "My" <> tag }
46+
-- |
47+
-- | encode (nullarySumWith opts "MySum") Ctor1 == J.fromString "MyCtor1"
48+
-- | decode (nullarySumWith opts "MySum") (J.fromString "MyMoarCtors") == Right MoarCtors
49+
-- |```
50+
nullarySumWith a r. Generic a r NullarySumCodec r NullarySumEncoding String CA.JsonCodec a
51+
nullarySumWith encoding name =
2752
C.codec'
28-
(map to <<< nullarySumDecode name)
29-
(nullarySumEncode <<< from)
53+
(map to <<< nullarySumDecode encoding name)
54+
(nullarySumEncode encoding <<< from)
3055

3156
class NullarySumCodec r where
32-
nullarySumEncode r J.Json
33-
nullarySumDecode String J.Json Either CA.JsonDecodeError r
57+
nullarySumEncode NullarySumEncoding r J.Json
58+
nullarySumDecode NullarySumEncoding String J.Json Either CA.JsonDecodeError r
3459

3560
instance nullarySumCodecSum ∷ (NullarySumCodec a, NullarySumCodec b) NullarySumCodec (Sum a b) where
36-
nullarySumEncode = case _ of
37-
Inl a → nullarySumEncode a
38-
Inr b → nullarySumEncode b
39-
nullarySumDecode name j = Inl <$> nullarySumDecode name j
40-
<|> Inr <$> nullarySumDecode name j
61+
nullarySumEncode encoding = case _ of
62+
Inl a → nullarySumEncode encoding a
63+
Inr b → nullarySumEncode encoding b
64+
nullarySumDecode encoding name j = Inl <$> nullarySumDecode encoding name j
65+
<|> Inr <$> nullarySumDecode encoding name j
4166

4267
instance nullarySumCodecCtorIsSymbol name NullarySumCodec (Constructor name NoArguments) where
43-
nullarySumEncode _ =
44-
J.fromString $ reflectSymbol (Proxy Proxy name)
45-
nullarySumDecode name j = do
46-
tag ← note (CA.Named name (CA.TypeMismatch "String")) (J.toString j)
68+
nullarySumEncode encoding _ =
69+
let
70+
tagRaw = reflectSymbol (Proxy Proxy name)
71+
tag = encoding.mapTag tagRaw
72+
in
73+
J.fromString $ tag
74+
nullarySumDecode encoding name j = do
75+
tagRaw ← note (CA.Named name (CA.TypeMismatch "String")) (J.toString j)
76+
let tag = encoding.mapTag tagRaw
4777
if tag /= reflectSymbol (Proxy Proxy name) then
4878
Left (CA.Named name (CA.UnexpectedValue j))
4979
else

0 commit comments

Comments
 (0)