-- | Helper functions for template haskell that generate JSON instances for -- Betfair API types. This is unlikely to be useful to you if you are just a -- user of this library. -- module Network.Betfair.Types.TH ( commonEnum , commonStruct ) where import Data.Aeson.TH import Data.Char commonStruct :: Options commonStruct = defaultOptions { fieldLabelModifier = lowerFirst . dropPrefix , omitNothingFields = True } underscorify :: String -> String underscorify str = reverse $ rec str [] where rec [] accum = accum rec (x:y:rest) accum | isLower x && isUpper y = rec rest $ y:'_':x:accum rec (z:rest) accum = rec rest (z:accum) dropPrefix :: String -> String dropPrefix [] = [] dropPrefix (x:rest) | isUpper x = x:rest | otherwise = dropPrefix rest lowerFirst :: String -> String lowerFirst [] = [] lowerFirst (x:rest) = toLower x:rest commonEnum :: Int -> Options commonEnum ln = defaultOptions { constructorTagModifier = fmap toUpper . underscorify . drop ln , allNullaryToStringTag = True }