domain-aeson-0.1: library/DomainAeson/InstanceDecs.hs
module DomainAeson.InstanceDecs where
import DomainAeson.Prelude
import qualified DomainAeson.Util.AesonTH as AesonTH
import qualified DomainCore.Model as Model
import qualified DomainCore.TH as DomainTH
import Language.Haskell.TH.Syntax
import THLego.Helpers
toJson :: Model.TypeDec -> [Dec]
toJson (Model.TypeDec typeName typeDef) =
pure $ case typeDef of
Model.ProductTypeDef members ->
AesonTH.productToJsonInstanceDec
(ConT (textName typeName))
(textName typeName)
(fmap fst members)
Model.SumTypeDef members ->
AesonTH.sumToJsonInstanceDec
(ConT (textName typeName))
(fmap member members)
where
member (memberName, memberComponentTypes) =
( memberName,
DomainTH.sumConstructorName typeName memberName,
length memberComponentTypes
)