{-# LANGUAGE UndecidableInstances #-}
module Data.Aeson.Deriving.SingleFieldObject where
import Data.Aeson
import Data.Aeson.Deriving.Generic (LoopWarning)
import Data.Proxy
import Data.Text (pack)
import GHC.Generics
import GHC.TypeLits (KnownSymbol, Symbol, symbolVal)
newtype SingleFieldObject (fieldName :: Symbol) a = SingleFieldObject a
deriving stock (Generic)
instance (ToJSON a, LoopWarning (SingleFieldObject fieldName) a, KnownSymbol fieldName) =>
ToJSON (SingleFieldObject fieldName a) where
toJSON (SingleFieldObject a) = object
[ ( pack . symbolVal $ Proxy @fieldName
, toJSON a
)
]
instance (FromJSON a, LoopWarning (SingleFieldObject fieldName) a, KnownSymbol fieldName) => FromJSON (SingleFieldObject fieldName a) where
parseJSON = withObject "Object" $ \hm ->
SingleFieldObject <$> hm .: (pack . symbolVal $ Proxy @fieldName)