packages feed

hw-uri-0.1.1.2: test/HaskellWorks/Data/Uri/Gen.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}

module HaskellWorks.Data.Uri.Gen
  ( s3Uri
  , location
  , localPath
  ) where

import Antiope.S3                     (BucketName (..), ObjectKey (..), S3Uri (..))
import Data.Semigroup                 ((<>))
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) #-}

s3Uri :: MonadGen m => m S3Uri
s3Uri = do
  let partGen = G.text (R.linear 3 10) G.alphaNum
  bkt   <- partGen
  parts <- G.list (R.linear 1 5) partGen
  ext   <- G.text (R.linear 2 4) G.alphaNum
  pure $ S3Uri (BucketName bkt) (ObjectKey (T.intercalate "/" parts <> "." <> ext))

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
  ]