@@ -23,27 +23,57 @@ import Type.Proxy (Proxy(..))
2323-- | decode (nullarySum "MySum") (J.fromString "MoarCtors") == Right MoarCtors
2424-- |```
2525nullarySum ∷ ∀ 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
3156class 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
3560instance 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
4267instance nullarySumCodecCtor ∷ IsSymbol 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