{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
module LispCaseAeson where
import Data.Aeson (ToJSON, FromJSON)
import GHC.Generics (Generic, Rep)
import qualified Data.Aeson as Aeson
import qualified Data.Char as Char
newtype LispCase a = LispCase a
viaLispCaseAesonOptions :: Aeson.Options
viaLispCaseAesonOptions =
Aeson.defaultOptions
{ Aeson.fieldLabelModifier = \s -> do
c <- s
if Char.isUpper c then ['-', Char.toLower c] else [c]
}
instance
( Generic a
, Aeson.GToJSON Aeson.Zero (Rep a)
, Aeson.GToEncoding Aeson.Zero (Rep a)
) => ToJSON (LispCase a)
where
toJSON (LispCase a) = Aeson.genericToJSON viaLispCaseAesonOptions a
toEncoding (LispCase a) = Aeson.genericToEncoding viaLispCaseAesonOptions a
instance
( Generic a
, Aeson.GFromJSON Aeson.Zero (Rep a)
) => FromJSON (LispCase a)
where
parseJSON v = LispCase <$> Aeson.genericParseJSON viaLispCaseAesonOptions v