module Web.Mackerel.Internal.TH (options, kebabCase, snakeCase) where
import Data.Aeson.TH (Options(..), defaultOptions)
import Data.Char (isLower, isUpper, toLower)
import Data.List (intercalate)
import Data.List.Split (keepDelimsL, split, whenElt)
options :: Options
options = defaultOptions {
fieldLabelModifier = (\(c:cs) -> toLower c : cs) . dropWhile isLower,
constructorTagModifier = map toLower,
omitNothingFields = True
}
kebabCase :: String -> String
kebabCase = modifyCase "-"
snakeCase :: String -> String
snakeCase = modifyCase "_"
modifyCase :: String -> String -> String
modifyCase cs = intercalate cs . map (map toLower) . dropWhile null . split (keepDelimsL $ whenElt isUpper)