@@ -0,0 +1,78 @@
1+{-# LANGUAGE RecordWildCards #-}
2+{-# LANGUAGE OverloadedLabels #-}
4+module Data.Schematic.JsonSchema where
7+import qualified Data.Map as M
8+import Data.Schematic.Schema
13+draft6 = "http://json-schema.org/draft-06/schema#"
22+instance ToJSON JsonSchemaType where
23+ toJSON JObject = "object"
24+ toJSON JArray = "array"
25+ toJSON JNumber = "number"
26+ toJSON JString = "string"
27+ toJSON JNull = "null"
31+ { type_ :: JsonSchemaType
33+ , items :: Maybe Text
34+ , schemaDraft :: Text }
36+ { type_ :: JsonSchemaType
37+ , properties :: M.Map Text JsonSchema
38+ , additionalProperties :: Bool
40+ , schemaDraft :: Text }
41+ | JsonOptional JsonSchema
43+jsonObject :: M.Map Text JsonSchema -> JsonSchema
44+jsonObject m = JsonObject
47+ , additionalProperties = False
48+ , required = M.keys $ M.filter
49+ (\case; JsonOptional _ -> False; _ -> True) m
50+ , schemaDraft = draft6 }
52+instance ToJSON JsonSchema where
53+ toJSON RootSchema{..} = object [ "type" .= type_, "title" .= title ]
54+ toJSON JsonObject{..} =
57+ , "properties" .= properties
58+ , "additionalProperties" .= additionalProperties
59+ , "required" .= required
60+ , "schemaDraft" .= schemaDraft]
67+-- "title": "array item"
71+-- toSchema :: JsonRepr a -> JsonSchema