on master help sign in
fix: instance Serial m JsonRepr
commit6cc400e53ce5270ed4eaec3071c49d7345bb8913 authorNikita <anisimoff.nikita@gmail.com> dateThu 14 Feb 2019, 14:25 (8 years ago) parentf4e8e6d
3 files changed+59−64
src/Data/Schematic/Generator.hs+56−38 src/Data/Schematic/Schema.hs−23 test/SchemaSpec.hs+3−3
src/Data/Schematic/Generator.hs+56−38
@@ -1,14 +1,16 @@
1+{-# OPTIONS_GHC -fno-warn-orphans #-}
12module 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)
89import 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
1315maxHigh :: Int
1416maxHigh = 30
@@ -30,14 +32,14 @@ textLengthSeries =
3032textEnumSeries :: Monad m => [Text] -> Series m Text
3133textEnumSeries enum = generate $ \depth -> take depth enum
3234
33−textSeries :: Monad m => [DemotedTextConstraint] -> Series m Value
35+textSeries :: Monad m => [DemotedTextConstraint] -> Series m Text
3436textSeries 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
4244textSeries' :: Monad m => [VerifiedTextConstraint] -> Series m Text
4345textSeries' [] = 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
5557numberSeries 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
6466numberSeries' =
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−23
@@ -352,29 +352,6 @@ instance V.RecAll FieldRepr fs Show => Show (JsonRepr ('SchemaObject fs)) where
352352instance 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−
378355instance Eq (Rec FieldRepr fs) => Eq (JsonRepr ('SchemaObject fs)) where
379356 ReprObject a == ReprObject b = a == b
380357
test/SchemaSpec.hs+3−3
@@ -76,8 +76,8 @@ schemaJson = "{\"foo\": [13], \"bar\": null}"
7676schemaJson2 :: ByteString
7777schemaJson2 = "{\"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
8282spec :: Spec
8383spec = 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
111111main :: IO ()