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 :: Options
baseOptions = Options
defaultOptions
   { omitNothingFields :: Bool
omitNothingFields = Bool
True
   }

stripFieldNamePrefix :: String -> String -> String
stripFieldNamePrefix :: String -> String -> String
stripFieldNamePrefix String
pre = String -> String
lowerFirst (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Maybe String) -> String -> String
forall a. (a -> Maybe a) -> a -> a
try (String -> String -> Maybe String
forall a. Eq a => [a] -> [a] -> Maybe [a]
L.stripPrefix String
pre)

dropSuffixAndSnakeCase :: String -> String -> String
dropSuffixAndSnakeCase :: String -> String -> String
dropSuffixAndSnakeCase String
suffix = Text -> String
T.unpack (Text -> String) -> (String -> Text) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CaseTransformer -> Delimiter -> Text -> Text
CS.process CaseTransformer
CS.lower Delimiter
CS.snake (Text -> Text) -> (String -> Text) -> String -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (String -> String) -> String -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
dropSuffix String
suffix

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

lowerAll :: String -> String
lowerAll :: String -> String
lowerAll = (Char -> Char) -> String -> String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
C.toLower

dropSuffix :: String -> String -> String
dropSuffix :: String -> String -> String
dropSuffix String
suffix = String -> String
forall a. [a] -> [a]
reverse (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Maybe String) -> String -> String
forall a. (a -> Maybe a) -> a -> a
try (String -> String -> Maybe String
forall a. Eq a => [a] -> [a] -> Maybe [a]
L.stripPrefix (String -> String -> Maybe String)
-> (String -> String) -> String -> String -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. [a] -> [a]
reverse (String -> String -> Maybe String)
-> String -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
suffix) (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. [a] -> [a]
reverse

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