@@ -199,6 +199,7 @@ instance SingKind ArrayConstraint where
199199
200200data Schema
201201 = SchemaText [TextConstraint]
202+ | SchemaBoolean
202203 | SchemaNumber [NumberConstraint]
203204 | SchemaObject [(Symbol, Schema)]
204205 | SchemaArray [ArrayConstraint] Schema
@@ -209,6 +210,7 @@ data Schema
209210data DemotedSchema
210211 = DSchemaText [DemotedTextConstraint]
211212 | DSchemaNumber [DemotedNumberConstraint]
213+ | DSchemaBoolean
212214 | DSchemaObject [(Text, DemotedSchema)]
213215 | DSchemaArray [DemotedArrayConstraint] DemotedSchema
214216 | DSchemaNull
@@ -218,6 +220,7 @@ data DemotedSchema
218220data instance Sing (schema :: Schema) where
219221 SSchemaText :: Sing tcs -> Sing ('SchemaText tcs)
220222 SSchemaNumber :: Sing ncs -> Sing ('SchemaNumber ncs)
223+ SSchemaBoolean :: Sing 'SchemaBoolean
221224 SSchemaArray :: Sing acs -> Sing schema -> Sing ('SchemaArray acs schema)
222225 SSchemaObject :: Sing fields -> Sing ('SchemaObject fields)
223226 SSchemaOptional :: Sing s -> Sing ('SchemaOptional s)
@@ -229,6 +232,8 @@ instance SingI sl => SingI ('SchemaNumber sl) where
229232 sing = SSchemaNumber sing
230233instance SingI 'SchemaNull where
231234 sing = SSchemaNull
235+instance SingI 'SchemaBoolean where
236+ sing = SSchemaBoolean
232237instance (SingI ac, SingI s) => SingI ('SchemaArray ac s) where
233238 sing = SSchemaArray sing sing
234239instance SingI stl => SingI ('SchemaObject stl) where
@@ -239,6 +244,7 @@ instance SingI s => SingI ('SchemaOptional s) where
239244instance Eq (Sing ('SchemaText cs)) where _ == _ = True
240245instance Eq (Sing ('SchemaNumber cs)) where _ == _ = True
241246instance Eq (Sing 'SchemaNull) where _ == _ = True
247+instance Eq (Sing 'SchemaBoolean) where _ == _ = True
242248instance Eq (Sing ('SchemaArray as s)) where _ == _ = True
243249instance Eq (Sing ('SchemaObject cs)) where _ == _ = True
244250instance Eq (Sing ('SchemaOptional s)) where _ == _ = True
@@ -248,6 +254,7 @@ instance SingKind Schema where
248254 fromSing = \case
249255 SSchemaText cs -> DSchemaText $ fromSing cs
250256 SSchemaNumber cs -> DSchemaNumber $ fromSing cs
257+ SSchemaBoolean -> DSchemaBoolean
251258 SSchemaArray cs s -> DSchemaArray (fromSing cs) (fromSing s)
252259 SSchemaOptional s -> DSchemaOptional $ fromSing s
253260 SSchemaNull -> DSchemaNull
@@ -262,6 +269,7 @@ instance SingKind Schema where
262269 SomeSing scs -> SomeSing $ SSchemaText scs
263270 DSchemaNumber cs -> case toSing cs of
264271 SomeSing scs -> SomeSing $ SSchemaNumber scs
272+ DSchemaBoolean -> SomeSing $ SSchemaBoolean
265273 DSchemaArray cs sch -> case (toSing cs, toSing sch) of
266274 (SomeSing scs, SomeSing ssch) -> SomeSing $ SSchemaArray scs ssch
267275 DSchemaOptional sch -> case toSing sch of
@@ -309,6 +317,7 @@ instance
309317data JsonRepr :: Schema -> Type where
310318 ReprText :: Text -> JsonRepr ('SchemaText cs)
311319 ReprNumber :: Scientific -> JsonRepr ('SchemaNumber cs)
320+ ReprBoolean :: Bool -> JsonRepr 'SchemaBoolean
312321 ReprNull :: JsonRepr 'SchemaNull
313322 ReprArray :: V.Vector (JsonRepr s) -> JsonRepr ('SchemaArray cs s)
314323 ReprObject :: Rec FieldRepr fs -> JsonRepr ('SchemaObject fs)
@@ -383,6 +392,7 @@ instance SingI schema => J.FromJSON (JsonRepr schema) where
383392 parseJSON value = case sing :: Sing schema of
384393 SSchemaText _ -> withText "String" (pure . ReprText) value
385394 SSchemaNumber _ -> withScientific "Number" (pure . ReprNumber) value
395+ SSchemaBoolean -> ReprBoolean <$> parseJSON value
386396 SSchemaNull -> case value of
387397 J.Null -> pure ReprNull
388398 _ -> typeMismatch "Null" value
@@ -402,6 +412,9 @@ instance SingI schema => J.FromJSON (JsonRepr schema) where
402412 SSchemaNumber so -> case H.lookup fieldName h of
403413 Just v -> withSingI so $ FieldRepr <$> parseJSON v
404414 Nothing -> fail "schemanumber"
415+ SSchemaBoolean -> case H.lookup fieldName h of
416+ Just v -> FieldRepr <$> parseJSON v
417+ Nothing -> fail "schemaboolean"
405418 SSchemaNull -> case H.lookup fieldName h of
406419 Just v -> FieldRepr <$> parseJSON v
407420 Nothing -> fail "schemanull"
@@ -419,6 +432,7 @@ instance SingI schema => J.FromJSON (JsonRepr schema) where
419432
420433instance J.ToJSON (JsonRepr a) where
421434 toJSON ReprNull = J.Null
435+ toJSON (ReprBoolean b) = J.Bool b
422436 toJSON (ReprText t) = J.String t
423437 toJSON (ReprNumber n) = J.Number n
424438 toJSON (ReprOptional s) = case s of