packages feed

atlassian-connect-core-0.1.0.0: src/Data/AesonHelpers.hs

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)