@@ -6,10 +6,12 @@
66
77module Data.Schematic.Schema where
88
9+import Data.Functor.Foldable
910import Data.Kind hiding (Type)
1011import Data.Proxy
1112import Data.Schematic.Validation
1213import Data.Text (Text)
14+import GHC.Generics
1315import GHC.TypeLits (KnownNat, natVal, KnownSymbol, symbolVal, Symbol, Nat)
1416
1517
@@ -79,13 +81,13 @@ class SchemaConstructor jty where
7981 constructor :: Proxy jty -> [CRepr jty] -> Schema
8082
8183instance SchemaConstructor 'JText where
82− constructor _ = SchemaText SJText
84+ constructor _ = Fix . SchemaText SJText
8385
8486instance SchemaConstructor 'JNumber where
85− constructor _ = SchemaNumber SJNumber
87+ constructor _ = Fix . SchemaNumber SJNumber
8688
8789instance SchemaConstructor 'JObject where
88− constructor _ = SchemaObject SJObject
90+ constructor _ = Fix . SchemaObject SJObject
8991
9092class Schematic ty where
9193 type JT (ty :: k) :: JType
@@ -128,11 +130,40 @@ instance
128130 => Schematic (SArray cs s) where
129131 type JT (SArray cs s) = 'JArray
130132 build _ =
131− SchemaArray
133+ Fix $ SchemaArray
132134 SJArray
133135 (schema (Proxy @'JArray) (Proxy @cs))
134136 (build (Proxy @s))
135137
138+data Generate name ty
139+
140+instance
141+ ( Verifiable JText cs
142+ , KnownSymbol name, Schematic ty )
143+ => Schematic (Generate name (SText cs)) where
144+ type JT (Generate name (SText cs)) = JT (SText cs)
145+ build _ = build (Proxy @(SText cs))
146+
147+instance
148+ ( Verifiable JNumber cs
149+ , KnownSymbol name, Schematic ty )
150+ => Schematic (Generate name (SNumber cs)) where
151+ type JT (Generate name (SNumber cs)) = JT (SNumber cs)
152+ build _ = build (Proxy @(SNumber cs))
153+
154+instance
155+ ( Verifiable JArray cs
156+ , Schematic s )
157+ => Schematic (Generate name (SArray cs s)) where
158+ type JT (Generate name (SArray cs s)) = JT (SArray cs s)
159+ build _ = build (Proxy @(SArray cs s))
160+
161+instance
162+ (Verifiable JObject els)
163+ => Schematic (Generate name (SObject els)) where
164+ type JT (Generate name (SObject els)) = JT (SObject els)
165+ build _ = build (Proxy @(SObject els))
166+
136167-- | Shows it's top-level definition according to the json-schema
137168class TopLevel spec
138169