{-# LANGUAGE CPP #-}

module Test.Sandwich.Contexts.Kubernetes.Util.Aeson where

import qualified Data.Aeson as A
import Data.Char
import qualified Data.List as L
import Data.Text hiding (toLower)
import Relude

#if MIN_VERSION_aeson(2,0,0)
import qualified Data.Aeson.Key             as A
import qualified Data.Aeson.KeyMap          as HM
#else
import Data.Hashable
import qualified Data.HashMap.Strict        as HM
#endif


textKeys :: A.Object -> [Text]
#if MIN_VERSION_aeson(2,0,0)
textKeys :: Object -> [Text]
textKeys = (Key -> Text) -> [Key] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Key -> Text
A.toText ([Key] -> [Text]) -> (Object -> [Key]) -> Object -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Object -> [Key]
forall v. KeyMap v -> [Key]
HM.keys
#else
textKeys = HM.keys
#endif

#if MIN_VERSION_aeson(2,0,0)
aesonLookup :: Text -> HM.KeyMap v -> Maybe v
aesonLookup :: forall v. Text -> KeyMap v -> Maybe v
aesonLookup = Key -> KeyMap v -> Maybe v
forall v. Key -> KeyMap v -> Maybe v
HM.lookup (Key -> KeyMap v -> Maybe v)
-> (Text -> Key) -> Text -> KeyMap v -> Maybe v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Key
A.fromText
#else
aesonLookup :: (Eq k, Hashable k) => k -> HM.HashMap k v -> Maybe v
aesonLookup = HM.lookup
#endif

#if MIN_VERSION_aeson(2,0,0)
aesonInsert :: Text -> v -> HM.KeyMap v -> HM.KeyMap v
aesonInsert :: forall v. Text -> v -> KeyMap v -> KeyMap v
aesonInsert Text
t = Key -> v -> KeyMap v -> KeyMap v
forall v. Key -> v -> KeyMap v -> KeyMap v
HM.insert (Text -> Key
A.fromText Text
t)
#else
aesonInsert :: (Eq k, Hashable k) => k -> v -> HM.HashMap k v -> HM.HashMap k v
aesonInsert = HM.insert
#endif

#if MIN_VERSION_aeson(2,0,0)
aesonDelete :: Text -> HM.KeyMap v -> HM.KeyMap v
aesonDelete :: forall v. Text -> KeyMap v -> KeyMap v
aesonDelete Text
t = Key -> KeyMap v -> KeyMap v
forall v. Key -> KeyMap v -> KeyMap v
HM.delete (Text -> Key
A.fromText Text
t)
#else
aesonDelete :: (Eq k, Hashable k) => k -> HM.HashMap k v -> HM.HashMap k v
aesonDelete = HM.delete
#endif

#if MIN_VERSION_aeson(2,0,0)
aesonToList :: HM.KeyMap v -> [(A.Key, v)]
aesonToList :: forall v. KeyMap v -> [(Key, v)]
aesonToList = KeyMap v -> [(Key, v)]
forall v. KeyMap v -> [(Key, v)]
HM.toList
#else
aesonToList :: HM.HashMap k v -> [(k, v)]
aesonToList = HM.toList
#endif


dropNAndCamelCase :: Int -> String -> String
dropNAndCamelCase :: Int -> String -> String
dropNAndCamelCase Int
n = String -> String
lowercaseFirst (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Int -> [a] -> [a]
L.drop Int
n

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