@@ -15,6 +15,13 @@ import GHC.Generics
15import GHC.TypeLits (KnownNat, natVal, KnownSymbol, symbolVal, Symbol, Nat)
15import GHC.TypeLits (KnownNat, natVal, KnownSymbol, symbolVal, Symbol, Nat)
18+type family JT (s :: k) :: JType where
19+ JT (SNumber cs) = 'JNumber
20+ JT (SText cs) = 'JText
21+ JT (SObject els) = 'JObject
22+ JT (SArray cs s) = 'JArray
23+ JT (Field field ty cs) = JT ty
18class Constrained (ty :: JType) c where
25class Constrained (ty :: JType) c where
19 cRep :: Proxy ty -> Proxy c -> CRepr ty
26 cRep :: Proxy ty -> Proxy c -> CRepr ty
@@ -90,40 +97,33 @@ instance SchemaConstructor 'JObject where
90 constructor _ = Fix . SchemaObject
97 constructor _ = Fix . SchemaObject
92class Schematic ty where
99class Schematic ty where
93− type JT (ty :: k) :: JType
94 build :: Proxy ty -> Schema
100 build :: Proxy ty -> Schema
96data SText cs
102data SText cs
98instance (Verifiable 'JText cs) => Schematic (SText cs) where
104instance (Verifiable 'JText cs) => Schematic (SText cs) where
99− type JT (SText cs) = 'JText
100 build _ = constructor (Proxy @(JT (SText cs))) $ schema (Proxy @JText) (Proxy @cs)
105 build _ = constructor (Proxy @(JT (SText cs))) $ schema (Proxy @JText) (Proxy @cs)
102data SNumber cs
107data SNumber cs
104instance (Verifiable 'JNumber cs) => Schematic (SNumber cs) where
109instance (Verifiable 'JNumber cs) => Schematic (SNumber cs) where
105− type JT (SNumber cs) = 'JNumber
106 build _ = constructor (Proxy @(JT (SNumber cs)))
110 build _ = constructor (Proxy @(JT (SNumber cs)))
107 $ schema (Proxy @'JNumber) (Proxy @cs)
111 $ schema (Proxy @'JNumber) (Proxy @cs)
110 ( Verifiable (JT ty) cs
114 ( Verifiable (JT ty) cs
111− , SchemaConstructor (JT ty) )
115+ , SchemaConstructor (JT ty))
112 => Schematic (Field field ty cs) where
116 => Schematic (Field field ty cs) where
113− type JT (Field field ty cs) = JT ty
114 build _ = constructor (Proxy @(JT (Field field ty cs)))
117 build _ = constructor (Proxy @(JT (Field field ty cs)))
115 $ schema (Proxy @(JT (Field field ty cs))) (Proxy @cs)
118 $ schema (Proxy @(JT (Field field ty cs))) (Proxy @cs)
117−data SObject typeName els
120+data SObject els
120− ( Verifiable 'JObject els
123+ ( Verifiable 'JObject els )
121− , KnownSymbol typeName )
122− => Schematic (SObject typeName els) where
124+ => Schematic (SObject els) where
123− type JT (SObject typeName els) = 'JObject
124 build _ =
125 build _ =
125− constructor (Proxy @(JT (SObject typeName els)))
126− $ schema (Proxy @(JT (SObject typeName els))) (Proxy @els)
126+ constructor (Proxy @'JObject) $ schema (Proxy @(JT (SObject els))) (Proxy @els)
128data SArray cs s
128data SArray cs s
@@ -131,22 +131,21 @@ instance
131 ( Schematic s
131 ( Schematic s
132 , Verifiable 'JArray cs )
132 , Verifiable 'JArray cs )
133 => Schematic (SArray cs s) where
133 => Schematic (SArray cs s) where
134− type JT (SArray cs s) = 'JArray
135 build _ =
134 build _ =
136 Fix $ SchemaArray
135 Fix $ SchemaArray
137 (schema (Proxy @'JArray) (Proxy @cs))
136 (schema (Proxy @'JArray) (Proxy @cs))
138 (build (Proxy @s))
137 (build (Proxy @s))
140-- | Shows it's top-level definition according to the json-schema
139-- | Shows it's top-level definition according to the json-schema
141−class TopLevel spec
140+class Schematic spec => TopLevel spec
143−instance Schematic (SObject els) => TopLevel (SObject els)
142+instance (Schematic (SObject els)) => TopLevel (SObject els)
145instance Schematic (SArray cs s) => TopLevel (SArray cs s)
144instance Schematic (SArray cs s) => TopLevel (SArray cs s)
147-- | TODO: abstract over objects and arrays
146-- | TODO: abstract over objects and arrays
148−-- toSchema
147+toSchema
149−-- :: forall els (e :: [k]). (e ~ '[], Verifiable (JT (SObject els)) e, Schematic (SObject els))
148+ :: forall spec. TopLevel spec
150−-- => Proxy (SObject els)
149+ => Proxy spec
151−-- -> Schema
150+ -> Schema
152−-- toSchema p = constructor p $ schema (Proxy @(JT (SObject els))) (Proxy @els)
151+toSchema = build