content: {-# LANGUAGE CPP #-}
  
  
  module Test.Sandwich.Contexts.MinIO.Util where
  
  import Data.Char
  import qualified Data.List as L
  import Data.Text as T
  import Relude
  import qualified System.Random as R
  
  #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
  
  
  #if MIN_VERSION_aeson(2,0,0)
  aesonLookup :: Text -> HM.KeyMap v -> Maybe v
  aesonLookup = HM.lookup . A.fromText
  #else
  aesonLookup :: (Eq k, Hashable k) => k -> HM.HashMap k v -> Maybe v
  aesonLookup = HM.lookup
  #endif
  
  makeUUID :: MonadIO m => m T.Text
  makeUUID = makeUUID' 8
  
  makeUUID' :: MonadIO m => Int -> m T.Text
  makeUUID' n = toText <$> (replicateM n ((uuidLetters L.!!) <$> R.randomRIO (0, numUUIDLetters - 1)))
    where
      -- Note: for a UUID to appear in a Kubernetes name, it needs to match this regex
      -- [a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*'
      uuidLetters :: [Char]
      uuidLetters = ['a'..'z'] ++ ['0'..'9']
  
      numUUIDLetters :: Int
      numUUIDLetters = L.length uuidLetters
  