@@ -1,6 +1,7 @@
1module OpenAPI.Checker.Validate where
1module OpenAPI.Checker.Validate where
3import Control.Monad
3import Control.Monad
4+import Control.Monad.Reader
4import Data.Functor
5import Data.Functor
5import Data.HashMap.Strict.InsOrd as InsMap
6import Data.HashMap.Strict.InsOrd as InsMap
6import Data.HashSet.InsOrd as InsSet
7import Data.HashSet.InsOrd as InsSet
@@ -14,38 +15,52 @@ import OpenAPI.Checker.Validate.Monad
14reportCompat :: OpenApi -> OpenApi -> Report
15reportCompat :: OpenApi -> OpenApi -> Report
15reportCompat = error "FIXME: reportCompat not implemented"
16reportCompat = error "FIXME: reportCompat not implemented"
17−forwardCompatible :: OpenApi -> OpenApi -> ReportTree
18+forwardCompatible :: OpenApi -> OpenApi -> Errorable ReportTree
18−forwardCompatible old new = fst $ runTreeM $ openApiCompatible old new
19+forwardCompatible old new
22+ $ openApiCompatible old new
20openApiCompatible :: OpenApi -> OpenApi -> TreeM ReportTree ()
24openApiCompatible :: OpenApi -> OpenApi -> TreeM ReportTree ()
21−openApiCompatible old new = void $ follow $
25+openApiCompatible old new = do
26+ local (const servers) $ do
22− (InsMap.toList $ _openApiPaths old) <&> \(path, oldItem) ->
27+ follow $ (InsMap.toList $ _openApiPaths old) <&> \(path, oldItem) ->
23− (path, checkItem path oldItem)
28+ (path, checkItem path oldItem)
25− oldServers = _openApiServers old
31+ { oldServers = _openApiServers old
26− newServers = _openApiServers new
32+ , newServers = _openApiServers new }
27 checkItem path oldItem = do
33 checkItem path oldItem = do
28 case (InsMap.lookup path $ _openApiPaths new) of
34 case (InsMap.lookup path $ _openApiPaths new) of
29 Nothing -> treeError $ "Path deleted"
35 Nothing -> treeError $ "Path deleted"
30 Just newItem ->
36 Just newItem ->
31− pathItemsCompatible (oldServers, oldItem) (newServers, newItem)
37+ pathItemsCompatible oldItem newItem
40+mergeEnvServers :: [Server] -> [Server] -> TreeM t Env
41+mergeEnvServers olds news = do
44+ { oldServers = mergeServers (oldServers env) olds
45+ , newServers = mergeServers (newServers env) news }
33pathItemsCompatible
47pathItemsCompatible
34− :: ([Server], PathItem)
48+ :: PathItem
35− -> ([Server], PathItem)
49+ -> PathItem
36 -> TreeM PathItemTree ()
50 -> TreeM PathItemTree ()
37−pathItemsCompatible (oldServers' , old) (newServers' , new) = void $ follow
51+pathItemsCompatible old new = do
52+ newEnv <- mergeEnvServers (_pathItemServers old) (_pathItemServers new)
53+ local (const newEnv) $ do
38− [ (Get, go _pathItemGet)
55+ [ (Get, go _pathItemGet)
39− , (Put, go _pathItemPut)
56+ , (Put, go _pathItemPut)
40− , (Post, go _pathItemPost)
57+ , (Post, go _pathItemPost)
41− , (Delete, go _pathItemDelete)
58+ , (Delete, go _pathItemDelete)
42− , (Options, go _pathItemOptions)
59+ , (Options, go _pathItemOptions)
43− , (Head, go _pathItemHead)
60+ , (Head, go _pathItemHead)
44− , (Patch, go _pathItemPatch)
61+ , (Patch, go _pathItemPatch)
45− , (Trace, go _pathItemTrace) ]
62+ , (Trace, go _pathItemTrace) ]
47− oldServers = mergeServers oldServers' (_pathItemServers old)
48− newServers = mergeServers newServers' (_pathItemServers new)
49 go :: (PathItem -> Maybe Operation) -> TreeM OperationTree ()
64 go :: (PathItem -> Maybe Operation) -> TreeM OperationTree ()
50 go getOp = case getOp old of
65 go getOp = case getOp old of
51 Nothing -> return ()
66 Nothing -> return ()
@@ -54,10 +69,11 @@ pathItemsCompatible (oldServers' , old) (newServers' , new) = void $ follow
54 Nothing -> do
69 Nothing -> do
55 -- Operation was in old schema, but no in new one.
70 -- Operation was in old schema, but no in new one.
56 treeError "Operation was deleted. Old client may try to use it."
71 treeError "Operation was deleted. Old client may try to use it."
57− Just newOp -> operationsCompatible (oldServers, oldOp) (newServers, newOp)
73+ operationsCompatible oldOp newOp
59operationsCompatible
75operationsCompatible
60− :: ([Server], Operation)
76+ :: Operation
61− -> ([Server], Operation)
77+ -> Operation
62 -> TreeM OperationTree ()
78 -> TreeM OperationTree ()
63operationsCompatible = error "FIXME: operationsCompatible not implemented"
79operationsCompatible = error "FIXME: operationsCompatible not implemented"