@@ -199,6 +199,7 @@ instance SingKind ArrayConstraint where
200data Schema
200data Schema
201 = SchemaText [TextConstraint]
201 = SchemaText [TextConstraint]
202 | SchemaNumber [NumberConstraint]
203 | SchemaNumber [NumberConstraint]
203 | SchemaObject [(Symbol, Schema)]
204 | SchemaObject [(Symbol, Schema)]
204 | SchemaArray [ArrayConstraint] Schema
205 | SchemaArray [ArrayConstraint] Schema
@@ -209,6 +210,7 @@ data Schema
209data DemotedSchema
210data DemotedSchema
210 = DSchemaText [DemotedTextConstraint]
211 = DSchemaText [DemotedTextConstraint]
211 | DSchemaNumber [DemotedNumberConstraint]
212 | DSchemaNumber [DemotedNumberConstraint]
212 | DSchemaObject [(Text, DemotedSchema)]
214 | DSchemaObject [(Text, DemotedSchema)]
213 | DSchemaArray [DemotedArrayConstraint] DemotedSchema
215 | DSchemaArray [DemotedArrayConstraint] DemotedSchema
214 | DSchemaNull
216 | DSchemaNull
@@ -218,6 +220,7 @@ data DemotedSchema
218data instance Sing (schema :: Schema) where
220data instance Sing (schema :: Schema) where
219 SSchemaText :: Sing tcs -> Sing ('SchemaText tcs)
221 SSchemaText :: Sing tcs -> Sing ('SchemaText tcs)
220 SSchemaNumber :: Sing ncs -> Sing ('SchemaNumber ncs)
222 SSchemaNumber :: Sing ncs -> Sing ('SchemaNumber ncs)
223+ SSchemaBoolean :: Sing 'SchemaBoolean
221 SSchemaArray :: Sing acs -> Sing schema -> Sing ('SchemaArray acs schema)
224 SSchemaArray :: Sing acs -> Sing schema -> Sing ('SchemaArray acs schema)
222 SSchemaObject :: Sing fields -> Sing ('SchemaObject fields)
225 SSchemaObject :: Sing fields -> Sing ('SchemaObject fields)
223 SSchemaOptional :: Sing s -> Sing ('SchemaOptional s)
226 SSchemaOptional :: Sing s -> Sing ('SchemaOptional s)
@@ -229,6 +232,8 @@ instance SingI sl => SingI ('SchemaNumber sl) where
229 sing = SSchemaNumber sing
232 sing = SSchemaNumber sing
230instance SingI 'SchemaNull where
233instance SingI 'SchemaNull where
231 sing = SSchemaNull
234 sing = SSchemaNull
235+instance SingI 'SchemaBoolean where
236+ sing = SSchemaBoolean
232instance (SingI ac, SingI s) => SingI ('SchemaArray ac s) where
237instance (SingI ac, SingI s) => SingI ('SchemaArray ac s) where
233 sing = SSchemaArray sing sing
238 sing = SSchemaArray sing sing
234instance SingI stl => SingI ('SchemaObject stl) where
239instance SingI stl => SingI ('SchemaObject stl) where
@@ -239,6 +244,7 @@ instance SingI s => SingI ('SchemaOptional s) where
239instance Eq (Sing ('SchemaText cs)) where _ == _ = True
244instance Eq (Sing ('SchemaText cs)) where _ == _ = True
240instance Eq (Sing ('SchemaNumber cs)) where _ == _ = True
245instance Eq (Sing ('SchemaNumber cs)) where _ == _ = True
241instance Eq (Sing 'SchemaNull) where _ == _ = True
246instance Eq (Sing 'SchemaNull) where _ == _ = True
247+instance Eq (Sing 'SchemaBoolean) where _ == _ = True
242instance Eq (Sing ('SchemaArray as s)) where _ == _ = True
248instance Eq (Sing ('SchemaArray as s)) where _ == _ = True
243instance Eq (Sing ('SchemaObject cs)) where _ == _ = True
249instance Eq (Sing ('SchemaObject cs)) where _ == _ = True
244instance Eq (Sing ('SchemaOptional s)) where _ == _ = True
250instance Eq (Sing ('SchemaOptional s)) where _ == _ = True
@@ -248,6 +254,7 @@ instance SingKind Schema where
248 fromSing = \case
254 fromSing = \case
249 SSchemaText cs -> DSchemaText $ fromSing cs
255 SSchemaText cs -> DSchemaText $ fromSing cs
250 SSchemaNumber cs -> DSchemaNumber $ fromSing cs
256 SSchemaNumber cs -> DSchemaNumber $ fromSing cs
257+ SSchemaBoolean -> DSchemaBoolean
251 SSchemaArray cs s -> DSchemaArray (fromSing cs) (fromSing s)
258 SSchemaArray cs s -> DSchemaArray (fromSing cs) (fromSing s)
252 SSchemaOptional s -> DSchemaOptional $ fromSing s
259 SSchemaOptional s -> DSchemaOptional $ fromSing s
253 SSchemaNull -> DSchemaNull
260 SSchemaNull -> DSchemaNull
@@ -262,6 +269,7 @@ instance SingKind Schema where
262 SomeSing scs -> SomeSing $ SSchemaText scs
269 SomeSing scs -> SomeSing $ SSchemaText scs
263 DSchemaNumber cs -> case toSing cs of
270 DSchemaNumber cs -> case toSing cs of
264 SomeSing scs -> SomeSing $ SSchemaNumber scs
271 SomeSing scs -> SomeSing $ SSchemaNumber scs
272+ DSchemaBoolean -> SomeSing $ SSchemaBoolean
265 DSchemaArray cs sch -> case (toSing cs, toSing sch) of
273 DSchemaArray cs sch -> case (toSing cs, toSing sch) of
266 (SomeSing scs, SomeSing ssch) -> SomeSing $ SSchemaArray scs ssch
274 (SomeSing scs, SomeSing ssch) -> SomeSing $ SSchemaArray scs ssch
267 DSchemaOptional sch -> case toSing sch of
275 DSchemaOptional sch -> case toSing sch of
@@ -309,6 +317,7 @@ instance
309data JsonRepr :: Schema -> Type where
317data JsonRepr :: Schema -> Type where
310 ReprText :: Text -> JsonRepr ('SchemaText cs)
318 ReprText :: Text -> JsonRepr ('SchemaText cs)
311 ReprNumber :: Scientific -> JsonRepr ('SchemaNumber cs)
319 ReprNumber :: Scientific -> JsonRepr ('SchemaNumber cs)
320+ ReprBoolean :: Bool -> JsonRepr 'SchemaBoolean
312 ReprNull :: JsonRepr 'SchemaNull
321 ReprNull :: JsonRepr 'SchemaNull
313 ReprArray :: V.Vector (JsonRepr s) -> JsonRepr ('SchemaArray cs s)
322 ReprArray :: V.Vector (JsonRepr s) -> JsonRepr ('SchemaArray cs s)
314 ReprObject :: Rec FieldRepr fs -> JsonRepr ('SchemaObject fs)
323 ReprObject :: Rec FieldRepr fs -> JsonRepr ('SchemaObject fs)
@@ -383,6 +392,7 @@ instance SingI schema => J.FromJSON (JsonRepr schema) where
383 parseJSON value = case sing :: Sing schema of
392 parseJSON value = case sing :: Sing schema of
384 SSchemaText _ -> withText "String" (pure . ReprText) value
393 SSchemaText _ -> withText "String" (pure . ReprText) value
385 SSchemaNumber _ -> withScientific "Number" (pure . ReprNumber) value
394 SSchemaNumber _ -> withScientific "Number" (pure . ReprNumber) value
395+ SSchemaBoolean -> ReprBoolean <$> parseJSON value
386 SSchemaNull -> case value of
396 SSchemaNull -> case value of
387 J.Null -> pure ReprNull
397 J.Null -> pure ReprNull
388 _ -> typeMismatch "Null" value
398 _ -> typeMismatch "Null" value
@@ -402,6 +412,9 @@ instance SingI schema => J.FromJSON (JsonRepr schema) where
402 SSchemaNumber so -> case H.lookup fieldName h of
412 SSchemaNumber so -> case H.lookup fieldName h of
403 Just v -> withSingI so $ FieldRepr <$> parseJSON v
413 Just v -> withSingI so $ FieldRepr <$> parseJSON v
404 Nothing -> fail "schemanumber"
414 Nothing -> fail "schemanumber"
415+ SSchemaBoolean -> case H.lookup fieldName h of
416+ Just v -> FieldRepr <$> parseJSON v
417+ Nothing -> fail "schemaboolean"
405 SSchemaNull -> case H.lookup fieldName h of
418 SSchemaNull -> case H.lookup fieldName h of
406 Just v -> FieldRepr <$> parseJSON v
419 Just v -> FieldRepr <$> parseJSON v
407 Nothing -> fail "schemanull"
420 Nothing -> fail "schemanull"
@@ -419,6 +432,7 @@ instance SingI schema => J.FromJSON (JsonRepr schema) where
420instance J.ToJSON (JsonRepr a) where
433instance J.ToJSON (JsonRepr a) where
421 toJSON ReprNull = J.Null
434 toJSON ReprNull = J.Null
435+ toJSON (ReprBoolean b) = J.Bool b
422 toJSON (ReprText t) = J.String t
436 toJSON (ReprText t) = J.String t
423 toJSON (ReprNumber n) = J.Number n
437 toJSON (ReprNumber n) = J.Number n
424 toJSON (ReprOptional s) = case s of
438 toJSON (ReprOptional s) = case s of