{-# LANGUAGE TemplateHaskell #-}
module Data.HighJson.TH
    ( deriveJsonSwagger
    , jsonSerializer, jsonEncoder, jsonParser
    , makeDeclareNamedSchema
    , ToSchema(..)
    , ToJSON(..), FromJSON(..)
    )
where

import Data.Aeson
import Data.Swagger
import Language.Haskell.TH

import Data.HighJson (jsonSerializer, jsonEncoder, jsonParser)
import Data.HighJson.Swagger (makeDeclareNamedSchema)

deriveJsonSwagger :: Name -> Name -> Q [Dec]
deriveJsonSwagger :: Name -> Name -> Q [Dec]
deriveJsonSwagger Name
typ Name
spec =
    [d|
     instance ToJSON $(conT typ) where
         toJSON = jsonSerializer $(varE spec)
         toEncoding = jsonEncoder $(varE spec)
     instance FromJSON $(conT typ) where
         parseJSON = jsonParser $(varE spec)
     instance ToSchema $(conT typ) where
         declareNamedSchema p = makeDeclareNamedSchema $(varE spec) p
    |]