module Network.AWS.XRayClient.JSONHelpers
  ( xrayAesonOptions
  ) where

import Prelude

import Data.Aeson
import qualified Data.Char as C
import Data.List (isPrefixOf)

-- | Aeson 'Options' to remove prefix and apply snake_case.
xrayAesonOptions :: String -> Options
xrayAesonOptions :: String -> Options
xrayAesonOptions String
prefix = Options
defaultOptions
  { fieldLabelModifier :: String -> String
fieldLabelModifier = String -> String
snakeCaseify (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
unCapitalize (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
dropPrefix String
prefix
  , omitNothingFields :: Bool
omitNothingFields = Bool
True
  }

-- | Lower-case and insert an underscore before upper-case letters
--
-- >>> snakeCaseify "levelSubtraction"
-- "level_subtraction"
--
snakeCaseify :: String -> String
snakeCaseify :: String -> String
snakeCaseify [] = []
snakeCaseify (Char
c : String
cs)
  | Char -> Bool
C.isLower Char
c Bool -> Bool -> Bool
|| Char -> Bool
C.isNumber Char
c = Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
snakeCaseify String
cs
  | Bool
otherwise = Char
'_' Char -> String -> String
forall a. a -> [a] -> [a]
: Char -> Char
C.toLower Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
snakeCaseify String
cs

-- | Lower-case leading character
--
-- >>> unCapitalize "Capped"
-- "capped"
--
unCapitalize :: String -> String
unCapitalize :: String -> String
unCapitalize [] = []
unCapitalize (Char
c : String
cs) = Char -> Char
C.toLower Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String
cs

dropPrefix :: String -> String -> String
dropPrefix :: String -> String -> String
dropPrefix String
prefix String
x = if String
prefix String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
x
  then Int -> String -> String
forall a. Int -> [a] -> [a]
drop (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
prefix) String
x
  else String -> String
forall a. HasCallStack => String -> a
error (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
"dropPrefix: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
prefix String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" is not a prefix of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
x