-- | Helpers for deriveJSON.
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)