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

import qualified Data.List as L
import Data.Text as T
import Relude
import qualified System.Random as R


-- 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 :: [Char]
uuidLetters = [Char
'a'..Char
'z'] [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char
'0'..Char
'9']

numUUIDLetters :: Int
numUUIDLetters :: Int
numUUIDLetters = [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
L.length [Char]
uuidLetters

makeUUID :: MonadIO m => m T.Text
makeUUID :: forall (m :: * -> *). MonadIO m => m Text
makeUUID = Int -> m Text
forall (m :: * -> *). MonadIO m => Int -> m Text
makeUUID' Int
8

makeUUID' :: MonadIO m => Int -> m T.Text
makeUUID' :: forall (m :: * -> *). MonadIO m => Int -> m Text
makeUUID' Int
n = [Char] -> Text
forall a. ToText a => a -> Text
toText ([Char] -> Text) -> m [Char] -> m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int -> m Char -> m [Char]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n (([Char]
uuidLetters [Char] -> Int -> Char
forall a. HasCallStack => [a] -> Int -> a
L.!!) (Int -> Char) -> m Int -> m Char
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int, Int) -> m Int
forall a (m :: * -> *). (Random a, MonadIO m) => (a, a) -> m a
R.randomRIO (Int
0, Int
numUUIDLetters Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)))