hw-uri-0.1.1.10: test/HaskellWorks/Data/Uri/Gen.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
module HaskellWorks.Data.Uri.Gen
( bucketName
, s3Uri
, location
, localPath
) where
import Antiope.S3 (BucketName (..), ObjectKey (..), S3Uri (..))
import Data.Semigroup ((<>))
import Data.Text (Text)
import HaskellWorks.Data.Uri.Location
import Hedgehog (MonadGen)
import qualified Data.List as L
import qualified Data.Text as T
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
{-# ANN module ("HLint: ignore Redundant bracket" :: String) #-}
bucketName :: MonadGen m => m BucketName
bucketName = BucketName <$> G.text (R.linear 3 10) G.alphaNum
baseName :: MonadGen m => m Text
baseName = G.text (R.linear 3 10) G.alphaNum
s3UriWithObjectKey :: MonadGen m => m S3Uri
s3UriWithObjectKey = do
bkt <- bucketName
basenames <- G.list (R.linear 1 5) baseName
ext <- G.text (R.linear 2 4) G.alphaNum
pure $ S3Uri bkt (ObjectKey (T.intercalate "/" basenames <> "." <> ext))
s3UriWithout :: MonadGen m => m S3Uri
s3UriWithout = do
bkt <- bucketName
pure $ S3Uri bkt ""
s3Uri :: MonadGen m => m S3Uri
s3Uri = G.choice [s3UriWithout, s3UriWithObjectKey]
localPath :: MonadGen m => m FilePath
localPath = do
let partGen = G.string (R.linear 3 10) G.alphaNum
parts <- G.list (R.linear 1 5) partGen
ext <- G.string (R.linear 2 4) G.alphaNum
pure $ "/" <> L.intercalate "/" parts <> "." <> ext
location :: MonadGen m => m Location
location = G.choice
[ S3 <$> s3Uri
, Local <$> localPath
, HttpUri . ("http://" <>) . T.pack <$> localPath
]