|
2 | 2 | {-# LANGUAGE OverloadedStrings #-} |
3 | 3 | {-# LANGUAGE GeneralizedNewtypeDeriving #-} |
4 | 4 | {-# LANGUAGE FlexibleContexts #-} |
| 5 | +{-# LANGUAGE PatternSynonyms #-} |
5 | 6 |
|
6 | 7 | module Fake ( |
7 | 8 | State, |
@@ -37,7 +38,7 @@ import Data.ULID.TimeStamp (getULIDTimeStamp) |
37 | 38 | import qualified Data.UUID as UUID |
38 | 39 | import qualified Data.UUID.V1 as UUID1 |
39 | 40 | import qualified Data.Vector as V |
40 | | -import Expr (Expr (..), Function (..)) |
| 41 | +import Expr (Expr (..), pattern Fn, Function (..)) |
41 | 42 | import Prelude hiding (lines, replicate) |
42 | 43 | import System.Random (Random (..), RandomGen (..), |
43 | 44 | StdGen, mkStdGen, newStdGen) |
@@ -84,7 +85,7 @@ instance RandomGen Env where |
84 | 85 |
|
85 | 86 | newEnv :: Maybe Int -> IO Env |
86 | 87 | newEnv (Just seed) = pure $ Env (mkStdGen seed) M.empty |
87 | | -newEnv Nothing = (flip Env) M.empty <$> newStdGen |
| 88 | +newEnv Nothing = flip Env M.empty <$> newStdGen |
88 | 89 |
|
89 | 90 |
|
90 | 91 | uuid1 :: IO UUID.UUID |
@@ -172,7 +173,7 @@ objectFromArgs :: [Expr] -> Fake Value |
172 | 173 | objectFromArgs args = do |
173 | 174 | let |
174 | 175 | pairs = fmap (fmap mkKeyValuePair) (mkPairs args) |
175 | | - Except.liftEither pairs >>= mapM id <&> object |
| 176 | + Except.liftEither pairs >>= sequence <&> object |
176 | 177 | where |
177 | 178 | mkPairs [] = Right [] |
178 | 179 | mkPairs [_] = Left "Arguments to object must be a multiple of 2 (key + value pairs)" |
@@ -223,35 +224,34 @@ fromRegex :: (RandomGen g, MonadState g m, MonadError String m) |
223 | 224 | -> m T.Text |
224 | 225 | fromRegex input = |
225 | 226 | case R.parseRegex input' of |
226 | | - Right (pattern, _) -> generateText pattern |
| 227 | + Right (pattern', _) -> generateText pattern' |
227 | 228 | Left err -> Except.throwError $ show err |
228 | 229 | where |
229 | 230 | input' = T.unpack input |
230 | 231 | defaultUpper = 10 |
231 | | - replicatePattern lower upper pattern = do |
| 232 | + replicatePattern lower upper pattern' = do |
232 | 233 | numChars <- State.state $ randomR (lower, upper) |
233 | | - T.concat <$> replicateM numChars (generateText pattern) |
| 234 | + T.concat <$> replicateM numChars (generateText pattern') |
234 | 235 | generateText p = case p of |
235 | 236 | (R.POr patterns) -> do |
236 | | - pattern <- rndListItem patterns |
237 | | - case pattern of |
238 | | - Nothing -> pure $ "" |
239 | | - Just pattern' -> generateText pattern' |
| 237 | + pattern' <- rndListItem patterns |
| 238 | + case pattern' of |
| 239 | + Nothing -> pure "" |
| 240 | + Just pattern'' -> generateText pattern'' |
240 | 241 | (R.PConcat patterns) -> T.concat <$> mapM generateText patterns |
241 | | - (R.PPlus pattern) -> replicatePattern 1 defaultUpper pattern |
242 | | - (R.PStar _ pattern) -> replicatePattern 0 defaultUpper pattern |
243 | | - (R.PBound lower mUpper pattern) -> do |
244 | | - replicatePattern lower (fromMaybe defaultUpper mUpper) pattern |
| 242 | + (R.PPlus pattern') -> replicatePattern 1 defaultUpper pattern' |
| 243 | + (R.PStar _ pattern') -> replicatePattern 0 defaultUpper pattern' |
| 244 | + (R.PBound lower mUpper pattern') -> |
| 245 | + replicatePattern lower (fromMaybe defaultUpper mUpper) pattern' |
245 | 246 | (R.PAny _ patternSet) -> fromPatternSet patternSet |
246 | | - (R.PAnyNot _ ps@(R.PatternSet mChars _ _ _)) -> do |
| 247 | + (R.PAnyNot _ ps@(R.PatternSet mChars _ _ _)) -> |
247 | 248 | rndSetItem (maybe Set.empty (Set.difference allPossibleChars) mChars) |
248 | 249 | >>= maybeMErr ("Can't generate data from regex pattern" <> show ps) |
249 | 250 | <&> charToText |
250 | | - (R.PEscape _ 'd') -> do |
251 | | - T.pack . show <$> (State.state $ randomR (0, 9 :: Int)) |
| 251 | + (R.PEscape _ 'd') -> T.pack . show <$> State.state (randomR (0, 9 :: Int)) |
252 | 252 | (R.PChar _ char) -> pure $ charToText char |
253 | 253 | _ -> Except.throwError $ "Can't generate data from regex pattern" <> show p |
254 | | - fromPatternSet ps@(R.PatternSet mCharSet _ _ _) = do |
| 254 | + fromPatternSet ps@(R.PatternSet mCharSet _ _ _) = |
255 | 255 | rndSetItem (fromMaybe Set.empty mCharSet) |
256 | 256 | >>= maybeMErr ("Can't generate data from regex pattern" <> show ps) |
257 | 257 | <&> charToText |
@@ -354,33 +354,33 @@ eval :: Expr -> Fake Value |
354 | 354 | eval (IntLiteral x) = pure $ Number $ fromInteger x |
355 | 355 | eval (StringLiteral x) = pure $ String x |
356 | 356 | eval (DoubleLiteral x) = pure $ Number x |
357 | | -eval (JsonLiteral s) = pure $ s |
358 | | -eval (FunctionCall (Function "uuid4" [])) = String . UUID.toText <$> State.state random |
359 | | -eval (FunctionCall (Function "uuid1" [])) = String . UUID.toText <$> liftIO uuid1 |
360 | | -eval (FunctionCall (Function "ulid" [])) = getUlid |
361 | | -eval (FunctionCall (Function "null" [])) = pure Null |
362 | | -eval (FunctionCall (Function "randomBool" [])) = randomBool |
363 | | -eval (FunctionCall (Function "randomChar" [])) = randomChar |
364 | | -eval (FunctionCall (Function "randomInt" [])) = randomInt (IntLiteral 0) (IntLiteral 2147483647) |
365 | | -eval (FunctionCall (Function "randomInt" [upper])) = randomInt (IntLiteral 0) upper |
366 | | -eval (FunctionCall (Function "randomInt" [lower, upper])) = randomInt lower upper |
367 | | -eval (FunctionCall (Function "randomDouble" [])) = randomDouble (DoubleLiteral 0) (DoubleLiteral 1.7976931348623157E308) |
368 | | -eval (FunctionCall (Function "randomDouble" [upper])) = randomDouble (DoubleLiteral 0) upper |
369 | | -eval (FunctionCall (Function "randomDouble" [lower, upper])) = randomDouble lower upper |
370 | | -eval (FunctionCall (Function "randomDate" [])) = dayAsValue <$> randomDate Nothing Nothing |
371 | | -eval (FunctionCall (Function "randomDate" [lower, upper])) = do |
| 357 | +eval (JsonLiteral s) = pure s |
| 358 | +eval (Fn "uuid4" []) = String . UUID.toText <$> State.state random |
| 359 | +eval (Fn "uuid1" []) = String . UUID.toText <$> liftIO uuid1 |
| 360 | +eval (Fn "ulid" []) = getUlid |
| 361 | +eval (Fn "null" []) = pure Null |
| 362 | +eval (Fn "randomBool" []) = randomBool |
| 363 | +eval (Fn "randomChar" []) = randomChar |
| 364 | +eval (Fn "randomInt" []) = randomInt (IntLiteral 0) (IntLiteral 2147483647) |
| 365 | +eval (Fn "randomInt" [upper]) = randomInt (IntLiteral 0) upper |
| 366 | +eval (Fn "randomInt" [lower, upper]) = randomInt lower upper |
| 367 | +eval (Fn "randomDouble" []) = randomDouble (DoubleLiteral 0) (DoubleLiteral 1.7976931348623157E308) |
| 368 | +eval (Fn "randomDouble" [upper]) = randomDouble (DoubleLiteral 0) upper |
| 369 | +eval (Fn "randomDouble" [lower, upper]) = randomDouble lower upper |
| 370 | +eval (Fn "randomDate" []) = dayAsValue <$> randomDate Nothing Nothing |
| 371 | +eval (Fn "randomDate" [lower, upper]) = do |
372 | 372 | lo <- A.asText <$> eval lower |
373 | 373 | hi <- A.asText <$> eval upper |
374 | 374 | dayAsValue <$> randomDate (rightToMaybe lo) (rightToMaybe hi) |
375 | | -eval (FunctionCall (Function "randomDateTime" [])) = randomDateTime |
376 | | -eval (FunctionCall (Function "array" args)) = Array . V.fromList <$> mapM eval args |
377 | | -eval (FunctionCall (Function "oneOf" [arg])) = oneOfArray arg |
378 | | -eval (FunctionCall (Function "oneOf" args)) = oneOfArgs args |
379 | | -eval (FunctionCall (Function "replicate" [num, expr])) = replicate num expr |
380 | | -eval (FunctionCall (Function "object" args)) = objectFromArgs args |
381 | | -eval (FunctionCall (Function "fromFile" [fileName])) = fromFile fileName |
382 | | -eval (FunctionCall (Function "fromRegex" [pattern])) = |
383 | | - eval pattern |
| 375 | +eval (Fn "randomDateTime" []) = randomDateTime |
| 376 | +eval (Fn "array" args) = Array . V.fromList <$> mapM eval args |
| 377 | +eval (Fn "oneOf" [arg]) = oneOfArray arg |
| 378 | +eval (Fn "oneOf" args) = oneOfArgs args |
| 379 | +eval (Fn "replicate" [num, expr]) = replicate num expr |
| 380 | +eval (Fn "object" args) = objectFromArgs args |
| 381 | +eval (Fn "fromFile" [fileName]) = fromFile fileName |
| 382 | +eval (Fn "fromRegex" [pattern']) = |
| 383 | + eval pattern' |
384 | 384 | <&> A.asText |
385 | 385 | >>= Except.liftEither |
386 | 386 | >>= Fake . fromRegex |
|
0 commit comments