Skip to content

Commit 6cc400e

Browse files
fix: instance Serial m JsonRepr
1 parent f4e8e6d commit 6cc400e

File tree

3 files changed

+59
-64
lines changed

3 files changed

+59
-64
lines changed

src/Data/Schematic/Generator.hs

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1+
{-# OPTIONS_GHC -fno-warn-orphans #-}
12
module Data.Schematic.Generator where
23

3-
import Data.Aeson (Value(..))
4-
import qualified Data.HashMap.Lazy as H
5-
import Data.Maybe
6-
import Data.Schematic.Schema
7-
import Data.Text (Text, pack)
4+
import Data.Maybe
5+
import Data.Schematic.Schema
6+
import Data.Scientific
7+
import Data.Singletons
8+
import Data.Text (Text, pack)
89
import qualified Data.Vector as V
9-
import Data.Schematic.Generator.Regex
10-
import Data.Schematic.Verifier
11-
import Test.SmallCheck.Series
10+
import Data.Vinyl
11+
import Data.Schematic.Generator.Regex
12+
import Data.Schematic.Verifier
13+
import Test.SmallCheck.Series
1214

1315
maxHigh :: Int
1416
maxHigh = 30
@@ -30,14 +32,14 @@ textLengthSeries =
3032
textEnumSeries :: Monad m => [Text] -> Series m Text
3133
textEnumSeries enum = generate $ \depth -> take depth enum
3234

33-
textSeries :: Monad m => [DemotedTextConstraint] -> Series m Value
35+
textSeries :: Monad m => [DemotedTextConstraint] -> Series m Text
3436
textSeries cs = do
3537
let mvcs = verifyTextConstraints cs
3638
case mvcs of
3739
Just vcs -> do
3840
n <- textSeries' vcs
39-
pure $ String n
40-
Nothing -> pure Null
41+
pure $ n
42+
Nothing -> pure "error"
4143

4244
textSeries' :: Monad m => [VerifiedTextConstraint] -> Series m Text
4345
textSeries' [] = pure "sample"
@@ -51,16 +53,16 @@ textSeries' vcs = do
5153
Just e -> regexSeries e
5254
Nothing -> textLengthSeries vcs
5355

54-
numberSeries :: Monad m => [DemotedNumberConstraint] -> Series m Value
56+
numberSeries :: Monad m => [DemotedNumberConstraint] -> Series m Scientific
5557
numberSeries cs = do
5658
let mvcs = verifyNumberConstraints cs
5759
case mvcs of
5860
Just vcs -> do
5961
n <- numberSeries' vcs
60-
pure $ Number $ fromIntegral n
61-
Nothing -> pure Null
62+
pure $ n
63+
Nothing -> pure 0
6264

63-
numberSeries' :: Monad m => VerifiedNumberConstraint -> Series m Integer
65+
numberSeries' :: Monad m => VerifiedNumberConstraint -> Series m Scientific
6466
numberSeries' =
6567
\case
6668
VNEq eq -> pure $ fromIntegral eq
@@ -70,31 +72,47 @@ numberSeries' =
7072
n <- generate $ \depth -> take depth [l .. h]
7173
pure $ fromIntegral n
7274

73-
arraySeries ::
74-
Monad m => [DemotedArrayConstraint] -> DemotedSchema -> Series m Value
75-
arraySeries cs sch = do
75+
arraySeries
76+
:: (Monad m, Serial m (JsonRepr s))
77+
=> [DemotedArrayConstraint]
78+
-> Series m (V.Vector (JsonRepr s))
79+
arraySeries cs = do
7680
let mvcs = verifyArrayConstraint cs
7781
case mvcs of
78-
Just vcs -> arraySeries' vcs sch
79-
Nothing -> pure Null
80-
81-
arraySeries' ::
82-
Monad m => Maybe VerifiedArrayConstraint -> DemotedSchema -> Series m Value
83-
arraySeries' ml sch = do
84-
objs <- V.replicateM (maybe minRepeat f ml) (valueSeries sch)
85-
pure $ Array objs
82+
Just vcs -> arraySeries' vcs
83+
Nothing -> pure V.empty
84+
85+
arraySeries'
86+
:: forall m s. (Monad m, Serial m (JsonRepr s))
87+
=> Maybe VerifiedArrayConstraint
88+
-> Series m (V.Vector (JsonRepr s))
89+
arraySeries' ml = do
90+
objs <- V.replicateM (maybe minRepeat f ml) (series :: Series m (JsonRepr s))
91+
pure $ objs
8692
where
8793
f (VAEq l) = fromIntegral l
8894

89-
valueSeries :: Monad m => DemotedSchema -> Series m Value
90-
valueSeries (DSchemaText cs) = textSeries cs
91-
valueSeries (DSchemaNumber cs) = numberSeries cs
92-
valueSeries DSchemaBoolean = Bool <$> pure True \/ pure False
93-
valueSeries (DSchemaObject pairs') =
94-
Object <$> (decDepth $ mapM valueSeries $ H.fromList pairs')
95-
valueSeries (DSchemaArray cs sch) = arraySeries cs sch
96-
valueSeries DSchemaNull = pure Null
97-
valueSeries (DSchemaOptional sch) = pure Null \/ valueSeries sch
98-
valueSeries (DSchemaUnion schs) = do
99-
objs <- mapM valueSeries schs
100-
pure $ Array $ V.fromList objs
95+
instance (Monad m, Serial m Text, SingI cs)
96+
=> Serial m (JsonRepr ('SchemaText cs)) where
97+
series = decDepth $ fmap ReprText $ textSeries $ fromSing (sing :: Sing cs)
98+
99+
instance (Monad m, Serial m Scientific, SingI cs)
100+
=> Serial m (JsonRepr ('SchemaNumber cs)) where
101+
series = decDepth $ fmap ReprNumber
102+
$ numberSeries $ fromSing (sing :: Sing cs)
103+
104+
instance Monad m => Serial m (JsonRepr 'SchemaNull) where
105+
series = cons0 ReprNull
106+
107+
instance (Serial m (JsonRepr s), Serial m (V.Vector (JsonRepr s)), SingI cs)
108+
=> Serial m (JsonRepr ('SchemaArray cs s)) where
109+
series = decDepth $ fmap ReprArray
110+
$ arraySeries $ fromSing (sing :: Sing cs)
111+
112+
instance (Serial m (JsonRepr s))
113+
=> Serial m (JsonRepr ('SchemaOptional s)) where
114+
series = cons1 ReprOptional
115+
116+
instance (Monad m, Serial m (Rec FieldRepr fs))
117+
=> Serial m (JsonRepr ('SchemaObject fs)) where
118+
series = cons1 ReprObject

src/Data/Schematic/Schema.hs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -352,29 +352,6 @@ instance V.RecAll FieldRepr fs Show => Show (JsonRepr ('SchemaObject fs)) where
352352
instance Show (JsonRepr s) => Show (JsonRepr ('SchemaOptional s)) where
353353
show (ReprOptional s) = "ReprOptional " P.++ show s
354354

355-
instance (Monad m, Serial m Text)
356-
=> Serial m (JsonRepr ('SchemaText cs)) where
357-
series = cons1 ReprText
358-
359-
instance (Monad m, Serial m Scientific)
360-
=> Serial m (JsonRepr ('SchemaNumber cs)) where
361-
series = cons1 ReprNumber
362-
363-
instance Monad m => Serial m (JsonRepr 'SchemaNull) where
364-
series = cons0 ReprNull
365-
366-
instance (Serial m (V.Vector (JsonRepr s)))
367-
=> Serial m (JsonRepr ('SchemaArray cs s)) where
368-
series = cons1 ReprArray
369-
370-
instance (Serial m (JsonRepr s))
371-
=> Serial m (JsonRepr ('SchemaOptional s)) where
372-
series = cons1 ReprOptional
373-
374-
instance (Monad m, Serial m (Rec FieldRepr fs))
375-
=> Serial m (JsonRepr ('SchemaObject fs)) where
376-
series = cons1 ReprObject
377-
378355
instance Eq (Rec FieldRepr fs) => Eq (JsonRepr ('SchemaObject fs)) where
379356
ReprObject a == ReprObject b = a == b
380357

test/SchemaSpec.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ schemaJson = "{\"foo\": [13], \"bar\": null}"
7676
schemaJson2 :: ByteString
7777
schemaJson2 = "{\"foo\": [3], \"bar\": null}"
7878

79-
schemaJsonSeries :: Monad m => SC.Series m Value
80-
schemaJsonSeries = valueSeries $ fromSing (sing :: Sing SchemaExample)
79+
schemaJsonSeries :: Monad m => SC.Series m (JsonRepr SchemaExample)
80+
schemaJsonSeries = series
8181

8282
spec :: Spec
8383
spec = do
@@ -105,7 +105,7 @@ spec = do
105105
`shouldSatisfy` isValid
106106
it "validates json series" $ property $
107107
SC.over schemaJsonSeries $ \x ->
108-
isValid (parseAndValidateJson @SchemaExample x)
108+
isValid (parseAndValidateJson @SchemaExample (toJSON x))
109109

110110

111111
main :: IO ()

0 commit comments

Comments
 (0)