{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Aeson.Ext
( bsAesonOptions
)
where
import Prelude
import Data.Aeson
import Data.ByteString (ByteString)
import Data.Char (toLower)
import Data.List (stripPrefix)
import Data.Maybe (fromMaybe)
import Data.Text.Encoding (decodeUtf8)
instance ToJSON ByteString where
toJSON = String . decodeUtf8
bsAesonOptions :: String -> Options
bsAesonOptions prefixOrSuffix = defaultOptions
{ fieldLabelModifier = lowerFirst . dropPrefix prefixOrSuffix
, constructorTagModifier = lowerFirst . dropSuffix prefixOrSuffix
, omitNothingFields = True
}
dropPrefix :: String -> String -> String
dropPrefix prefix x = fromMaybe x $ stripPrefix prefix x
dropSuffix :: String -> String -> String
dropSuffix prefix = reverse . dropPrefix (reverse prefix) . reverse
lowerFirst :: String -> String
lowerFirst [] = []
lowerFirst (x : rest) = toLower x : rest