@@ -4,7 +4,6 @@ module Data.JsonSchema
44 ) where
55
66import Control.Applicative
7−import Data.Aeson
87import Data.Foldable
98import qualified Data.HashMap.Strict as H
109import Data.JsonSchema.Core
@@ -12,7 +11,6 @@ import Data.JsonSchema.JsonReference
1211import Data.JsonSchema.Utils
1312import Data.JsonSchema.Validators
1413import Data.Maybe
15−import Data.Text (Text)
1614import qualified Data.Text as T
1715import Data.Vector (Vector)
1816import qualified Data.Vector as V
@@ -20,50 +18,47 @@ import Prelude hiding (foldr)
2018
2119draft4 :: Spec
2220draft4 = Spec $ H.fromList
23− [ ("$ref", ref)
24− , ("multipleOf", multipleOf)
25− , ("maximum", maximumVal)
26− , ("minimum", minimumVal)
27− , ("maxLength", maxLength)
28− , ("minLength", minLength)
29− , ("pattern", pattern)
30− , ("items", items)
31− , ("maxItems", maxItems)
32− , ("minItems", minItems)
33− , ("uniqueItems", uniqueItems)
34− , ("maxProperties", maxProperties)
35− , ("minProperties", minProperties)
36− , ("required", required)
37− , ("properties", properties)
38− , ("patternProperties", patternProperties)
39− , ("additionalProperties", additionalProperties)
40− , ("dependencies", dependencies)
41− , ("enum", enum)
42− , ("type", typeVal)
43− , ("allOf", allOf)
44− , ("anyOf", anyOf)
45− , ("oneOf", oneOf)
46− , ("not", notValidator)
21+ [ ("$ref" , (ref , noEm))
22+ , ("multipleOf" , (multipleOf , noEm))
23+ , ("maximum" , (maximumVal , noEm))
24+ , ("minimum" , (minimumVal , noEm))
25+ , ("maxLength" , (maxLength , noEm))
26+ , ("minLength" , (minLength , noEm))
27+ , ("pattern" , (pattern , noEm))
28+ , ("additionalItems" , (noVal , objEmbed))
29+ , ("items" , (items , objOrArrayEmbed))
30+ , ("maxItems" , (maxItems , noEm))
31+ , ("minItems" , (minItems , noEm))
32+ , ("uniqueItems" , (uniqueItems , noEm))
33+ , ("maxProperties" , (maxProperties , noEm))
34+ , ("minProperties" , (minProperties , noEm))
35+ , ("required" , (required , noEm))
36+ , ("properties" , (properties , objMembersEmbed))
37+ , ("patternProperties" , (patternProperties , objMembersEmbed))
38+ , ("additionalProperties", (additionalProperties, objEmbed))
39+ , ("dependencies" , (dependencies , objMembersEmbed))
40+ , ("enum" , (enum , noEm))
41+ , ("type" , (typeVal , noEm))
42+ , ("allOf" , (allOf , arrayEmbed))
43+ , ("anyOf" , (anyOf , arrayEmbed))
44+ , ("oneOf" , (oneOf , arrayEmbed))
45+ , ("not" , (notValidator , objEmbed))
46+ , ("definitions" , (noVal , objMembersEmbed))
4747 ]
4848
49−fetchRefs :: RawSchema -> Graph -> IO Graph
50−fetchRefs a graph =
51− let newGraph = H.insert (_rsURI a) (_rsObject a) graph
52− rSchema = allEmbedded (_rsURI a, Object $ _rsObject a) V.empty
53− in foldlM fetch newGraph rSchema
49+fetchRefs :: Spec -> RawSchema -> Graph -> IO Graph
50+fetchRefs spec a graph =
51+ let startingGraph = H.insert (_rsURI a) (_rsObject a) graph
52+ in foldlM fetch startingGraph (includeEmbedded a)
5453
5554 where
5655 -- TODO: optimize
57− allEmbedded :: (Text, Value) -> Vector RawSchema -> Vector RawSchema
58− allEmbedded (t, Object o) rs =
59− let t' = updateId t o
60− r = RawSchema t' o
61− ns = (\x -> (t',x)) <$> V.fromList (H.elems o)
62− in foldr allEmbedded (V.snoc rs r) ns
63− allEmbedded (t, Array vs) rs =
64− let ns = (\x -> (t,x)) <$> vs
65− in foldr allEmbedded rs ns
66− allEmbedded _ rs = rs
56+ includeEmbedded :: RawSchema -> Vector RawSchema
57+ includeEmbedded r =
58+ let newId = updateId (_rsURI r) (_rsObject r)
59+ xs = H.intersectionWith (\(_,f) x -> f newId x) (_unSpec spec) (_rsObject r)
60+ ys = V.concat . H.elems $ xs
61+ in V.cons r . V.concat . V.toList $ includeEmbedded <$> ys
6762
6863 fetch :: Graph -> RawSchema -> IO Graph
6964 fetch g r =
@@ -76,5 +71,5 @@ fetchRefs a graph =
7671 else do
7772 eResp <- fetchRef t
7873 case eResp of
79− Right obj -> fetchRefs (RawSchema t obj) g
74+ Right obj -> fetchRefs spec (RawSchema t obj) g
8075 _ -> return g