module Data.Connect.AesonHelpers
   ( baseOptions
   , stripFieldNamePrefix
   , dropSuffixAndSnakeCase
   , lowerAll
   ) where

import qualified Cases            as CS
import           Data.Aeson.Types
import qualified Data.Char        as C
import qualified Data.List        as L
import           Data.Maybe       (fromMaybe)
import qualified Data.Text        as T

baseOptions :: Options
baseOptions = defaultOptions
   { omitNothingFields = True
   }

stripFieldNamePrefix :: String -> String -> String
stripFieldNamePrefix pre = lowerFirst . try (L.stripPrefix pre)

dropSuffixAndSnakeCase :: String -> String -> String
dropSuffixAndSnakeCase suffix = T.unpack . CS.process CS.lower CS.snake . T.pack . dropSuffix suffix

lowerFirst :: String -> String
lowerFirst (x : xs) = C.toLower x : xs
lowerFirst [] = []

lowerAll :: String -> String
lowerAll = fmap C.toLower

dropSuffix :: String -> String -> String
dropSuffix suffix = reverse . try (L.stripPrefix . reverse $ suffix) . reverse

try :: (a -> Maybe a) -> a -> a
try f v = fromMaybe v (f v)