module Data.AesonHelpers ( baseOptions , stripFieldNamePrefix , dropAndSnakeCase ) where import Data.Aeson.Types import qualified Data.Char as C import qualified Data.List as L import Data.Maybe (fromMaybe) baseOptions :: Options baseOptions = defaultOptions { omitNothingFields = True } stripFieldNamePrefix :: String -> String -> String stripFieldNamePrefix pre = lowerFirst . try (L.stripPrefix pre) dropAndSnakeCase :: String -> String -> String dropAndSnakeCase toDrop = camelToSnakeCase . dropCondition toDrop . lowerFirst lowerFirst :: String -> String lowerFirst (x : xs) = C.toLower x : xs lowerFirst [] = [] camelToSnakeCase :: String -> String camelToSnakeCase input = case L.break C.isUpper input of (first, []) -> first (first, x : xs) -> first ++ ('_' : C.toLower x : camelToSnakeCase xs) dropCondition :: String -> String -> String dropCondition toDrop = L.reverse . try (L.stripPrefix . L.reverse $ toDrop) . L.reverse try :: (a -> Maybe a) -> a -> a try f v = fromMaybe v (f v)