@@ -7,6 +7,7 @@ import Data.HashSet.InsOrd as InsSet
7import Data.OpenApi
7import Data.OpenApi
8import Data.OpenApi.Internal
8import Data.OpenApi.Internal
9import Data.Traversable
9import Data.Traversable
10+import OpenAPI.Checker.Aux
10import OpenAPI.Checker.Report
11import OpenAPI.Checker.Report
11import OpenAPI.Checker.Validate.Monad
12import OpenAPI.Checker.Validate.Monad
@@ -14,21 +15,26 @@ reportCompat :: OpenApi -> OpenApi -> Report
14reportCompat = error "FIXME: reportCompat not implemented"
15reportCompat = error "FIXME: reportCompat not implemented"
16forwardCompatible :: OpenApi -> OpenApi -> ReportTree
17forwardCompatible :: OpenApi -> OpenApi -> ReportTree
17−forwardCompatible dec enc = fst $ runTreeM $ openApiCompatible dec enc
18+forwardCompatible old new = fst $ runTreeM $ openApiCompatible old new
19openApiCompatible :: OpenApi -> OpenApi -> TreeM ReportTree ()
20openApiCompatible :: OpenApi -> OpenApi -> TreeM ReportTree ()
20−openApiCompatible dec enc = void $ follow $
21+openApiCompatible old new = void $ follow $
21− (InsMap.toList $ _openApiPaths dec) <&> \(path, encItem) ->
22+ (InsMap.toList $ _openApiPaths old) <&> \(path, oldItem) ->
22− (path, checkItem path encItem)
23+ (path, checkItem path oldItem)
24− -- checkItem :: Path -> PathItem -> TreeM PathItemTree ()
25+ oldServers = _openApiServers old
26+ newServers = _openApiServers new
25− checkItem path encItem = do
27+ checkItem path oldItem = do
26− case (InsMap.lookup path $ _openApiPaths enc) of
28+ case (InsMap.lookup path $ _openApiPaths new) of
27− Nothing -> pathError $ "Path deleted"
29+ Nothing -> treeError $ "Path deleted"
28− Just decItem -> pathItemsCompatible encItem decItem
30+ Just newItem ->
31+ pathItemsCompatible (oldServers, oldItem) (newServers, newItem)
30−pathItemsCompatible :: PathItem -> PathItem -> TreeM PathItemTree ()
33+pathItemsCompatible
34+ :: ([Server], PathItem)
35+ -> ([Server], PathItem)
36+ -> TreeM PathItemTree ()
31−pathItemsCompatible dec enc = void $ follow
37+pathItemsCompatible (oldServers' , old) (newServers' , new) = void $ follow
32 [ (Get, go _pathItemGet)
38 [ (Get, go _pathItemGet)
33 , (Put, go _pathItemPut)
39 , (Put, go _pathItemPut)
34 , (Post, go _pathItemPost)
40 , (Post, go _pathItemPost)
@@ -38,5 +44,20 @@ pathItemsCompatible dec enc = void $ follow
38 , (Patch, go _pathItemPatch)
44 , (Patch, go _pathItemPatch)
39 , (Trace, go _pathItemTrace) ]
45 , (Trace, go _pathItemTrace) ]
47+ oldServers = mergeServers oldServers' (_pathItemServers old)
48+ newServers = mergeServers newServers' (_pathItemServers new)
41 go :: (PathItem -> Maybe Operation) -> TreeM OperationTree ()
49 go :: (PathItem -> Maybe Operation) -> TreeM OperationTree ()
50+ go getOp = case getOp old of
52+ -- Operation is not in old schema, so any addition is Ok
53+ Just oldOp -> case getOp new of
55+ -- Operation was in old schema, but no in new one.
56+ treeError "Operation was deleted. Old client may try to use it."
57+ Just newOp -> operationsCompatible (oldServers, oldOp) (newServers, newOp)
60+ :: ([Server], Operation)
61+ -> ([Server], Operation)
62+ -> TreeM OperationTree ()
42− go getOp = (error "FIXME: not implemented")
63+operationsCompatible = error "FIXME: operationsCompatible not implemented"