Skip to content

Commit f7817b9

Browse files
committed
feat: change schema data model to accommodate "not" keyword
1 parent bb59b72 commit f7817b9

File tree

13 files changed

+651
-942
lines changed

13 files changed

+651
-942
lines changed

src/purs/JsonSchema.purs

Lines changed: 38 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,145 +1,58 @@
11
module JsonSchema
2-
( JsonArraySchemaSpec
3-
, JsonIntegerSchemaSpec
4-
, JsonNumberSchemaSpec
5-
, JsonObjectSchemaSpec
6-
, JsonSchemaObjectProperty
7-
, JsonSchema(..)
8-
, JsonStringSchemaSpec
9-
, ObjectFormJsonSchemaSpec(..)
10-
, genSchema
11-
, genArraySchema
12-
, genIntegerSchema
13-
, genNumberSchema
14-
, genObjectSchema
15-
, genStringSchema
2+
( JsonSchema(..)
3+
, JsonValueType(..)
4+
, Keywords
5+
, defaultKeywords
166
) where
177

188
import Prelude
199

20-
import Control.Lazy (class Lazy)
21-
import Control.Lazy as Lazy
22-
import Control.Monad.Gen (class MonadGen)
23-
import Control.Monad.Gen as Gen
24-
import Control.Monad.Gen.Common as GenCommon
2510
import Data.Generic.Rep (class Generic)
26-
import Data.List as List
27-
import Data.Map (Map)
28-
import Data.Map as Map
29-
import Data.Maybe (Maybe)
30-
import Data.NonEmpty ((:|))
11+
import Data.Maybe (Maybe(..))
12+
import Data.Set (Set)
13+
import Data.Set as Set
3114
import Data.Show.Generic (genericShow)
3215

3316
data JsonSchema
34-
= BooleanFormJsonSchema Boolean
35-
| ObjectFormJsonSchema ObjectFormJsonSchemaSpec
17+
= BooleanSchema Boolean
18+
| ObjectSchema Keywords
3619

37-
derive instance Generic JsonSchema _
3820
derive instance Eq JsonSchema
21+
derive instance Generic JsonSchema _
22+
derive instance Ord JsonSchema
3923

4024
instance Show JsonSchema where
4125
show schema = genericShow schema
4226

43-
data ObjectFormJsonSchemaSpec
44-
= JsonArraySchema JsonArraySchemaSpec
45-
| JsonBooleanSchema
46-
| JsonEmptySchema
47-
| JsonIntegerSchema JsonIntegerSchemaSpec
48-
| JsonNullSchema
49-
| JsonNumberSchema JsonNumberSchemaSpec
50-
| JsonObjectSchema JsonObjectSchemaSpec
51-
| JsonStringSchema JsonStringSchemaSpec
52-
53-
derive instance Generic ObjectFormJsonSchemaSpec _
54-
derive instance Eq ObjectFormJsonSchemaSpec
55-
56-
instance Show ObjectFormJsonSchemaSpec where
57-
show schema = genericShow schema
58-
59-
type JsonArraySchemaSpec =
60-
{ itemsSchema Maybe JsonSchema
27+
type Keywords =
28+
{ items Maybe JsonSchema
29+
, not Maybe JsonSchema
30+
, required Set String
31+
, typeKeyword Maybe (Set JsonValueType)
6132
, uniqueItems Boolean
6233
}
6334

64-
type JsonBooleanSchemaSpec = {}
65-
66-
type JsonIntegerSchemaSpec = {}
67-
68-
type JsonNumberSchemaSpec = {}
69-
70-
type JsonStringSchemaSpec = {}
71-
72-
type JsonObjectSchemaSpec =
73-
{ properties Map String JsonSchemaObjectProperty
74-
}
75-
76-
type JsonSchemaObjectProperty =
77-
{ isRequired Boolean
78-
, schema JsonSchema
35+
defaultKeywords Keywords
36+
defaultKeywords =
37+
{ items: Nothing
38+
, not: Nothing
39+
, required: Set.empty
40+
, typeKeyword: Nothing
41+
, uniqueItems: false
7942
}
8043

81-
-- genSchema ∷ ∀ m. Lazy (m JsonSchema) ⇒ MonadGen m ⇒ m JsonSchema
82-
-- genSchema = genBooleanFormSchema <|> genObjectFormSchema
83-
84-
genSchema m. Lazy (m JsonSchema) MonadGen m m JsonSchema
85-
genSchema = Lazy.defer \_ →
86-
Gen.choose genBooleanFormSchema genObjectFormSchema
87-
88-
genBooleanFormSchema
89-
m. Lazy (m JsonSchema) MonadGen m m JsonSchema
90-
genBooleanFormSchema = Lazy.defer \_ →
91-
BooleanFormJsonSchema <$> Gen.chooseBool
92-
93-
genObjectFormSchema
94-
m. Lazy (m JsonSchema) MonadGen m m JsonSchema
95-
genObjectFormSchema = Lazy.defer \_ →
96-
Gen.oneOf $ genBooleanSchema :|
97-
[ genArraySchema
98-
, genEmptySchema
99-
, genIntegerSchema
100-
, genNullSchema
101-
, genNumberSchema
102-
, genObjectSchema
103-
, genStringSchema
104-
]
105-
106-
genArraySchema m. Lazy (m JsonSchema) MonadGen m m JsonSchema
107-
genArraySchema = do
108-
itemsSchema ← GenCommon.genMaybe genSchema
109-
uniqueItems ← Gen.chooseBool
110-
pure
111-
$ ObjectFormJsonSchema
112-
$ JsonArraySchema { itemsSchema, uniqueItems }
113-
114-
genBooleanSchema m. MonadGen m m JsonSchema
115-
genBooleanSchema = pure $ ObjectFormJsonSchema JsonBooleanSchema
116-
117-
genEmptySchema m. MonadGen m m JsonSchema
118-
genEmptySchema = pure $ ObjectFormJsonSchema JsonEmptySchema
119-
120-
genIntegerSchema m. MonadGen m m JsonSchema
121-
genIntegerSchema = pure $ ObjectFormJsonSchema $ JsonIntegerSchema {}
122-
123-
genNullSchema m. MonadGen m m JsonSchema
124-
genNullSchema = pure $ ObjectFormJsonSchema JsonNullSchema
125-
126-
genNumberSchema m. MonadGen m m JsonSchema
127-
genNumberSchema = pure $ ObjectFormJsonSchema $ JsonNumberSchema {}
128-
129-
genObjectSchema m. Lazy (m JsonSchema) MonadGen m m JsonSchema
130-
genObjectSchema = do
131-
properties ← genProperties
132-
pure $ ObjectFormJsonSchema $ JsonObjectSchema { properties }
133-
where
134-
genProperties m (Map String JsonSchemaObjectProperty)
135-
genProperties = (Map.fromFoldable <<< List.singleton)
136-
<$> GenCommon.genTuple (pure "prop") genProperty
137-
138-
genProperty m JsonSchemaObjectProperty
139-
genProperty = do
140-
isRequired ← Gen.chooseBool
141-
schema ← genSchema
142-
pure { isRequired, schema }
143-
144-
genStringSchema m. MonadGen m m JsonSchema
145-
genStringSchema = pure $ ObjectFormJsonSchema $ JsonStringSchema {}
44+
data JsonValueType
45+
= JsonArray
46+
| JsonBoolean
47+
| JsonInteger
48+
| JsonNull
49+
| JsonNumber
50+
| JsonObject
51+
| JsonString
52+
53+
derive instance Eq JsonValueType
54+
derive instance Generic JsonValueType _
55+
derive instance Ord JsonValueType
56+
57+
instance Show JsonValueType where
58+
show keyword = genericShow keyword

0 commit comments

Comments
 (0)