@@ -7,6 +7,7 @@ import Data.HashSet.InsOrd as InsSet
77import Data.OpenApi
88import Data.OpenApi.Internal
99import Data.Traversable
10+import OpenAPI.Checker.Aux
1011import OpenAPI.Checker.Report
1112import OpenAPI.Checker.Validate.Monad
1213
@@ -14,21 +15,26 @@ reportCompat :: OpenApi -> OpenApi -> Report
1415reportCompat = error "FIXME: reportCompat not implemented"
1516
1617forwardCompatible :: OpenApi -> OpenApi -> ReportTree
17−forwardCompatible dec enc = fst $ runTreeM $ openApiCompatible dec enc
18+forwardCompatible old new = fst $ runTreeM $ openApiCompatible old new
1819
1920openApiCompatible :: OpenApi -> OpenApi -> TreeM ReportTree ()
20−openApiCompatible dec enc = void $ follow $
21− (InsMap.toList $ _openApiPaths dec) <&> \(path, encItem) ->
22− (path, checkItem path encItem)
21+openApiCompatible old new = void $ follow $
22+ (InsMap.toList $ _openApiPaths old) <&> \(path, oldItem) ->
23+ (path, checkItem path oldItem)
2324 where
24− -- checkItem :: Path -> PathItem -> TreeM PathItemTree ()
25− checkItem path encItem = do
26− case (InsMap.lookup path $ _openApiPaths enc) of
27− Nothing -> pathError $ "Path deleted"
28− Just decItem -> pathItemsCompatible encItem decItem
25+ oldServers = _openApiServers old
26+ newServers = _openApiServers new
27+ checkItem path oldItem = do
28+ case (InsMap.lookup path $ _openApiPaths new) of
29+ Nothing -> treeError $ "Path deleted"
30+ Just newItem ->
31+ pathItemsCompatible (oldServers, oldItem) (newServers, newItem)
2932
30−pathItemsCompatible :: PathItem -> PathItem -> TreeM PathItemTree ()
31−pathItemsCompatible dec enc = void $ follow
33+pathItemsCompatible
34+ :: ([Server], PathItem)
35+ -> ([Server], PathItem)
36+ -> TreeM PathItemTree ()
37+pathItemsCompatible (oldServers' , old) (newServers' , new) = void $ follow
3238 [ (Get, go _pathItemGet)
3339 , (Put, go _pathItemPut)
3440 , (Post, go _pathItemPost)
@@ -38,5 +44,20 @@ pathItemsCompatible dec enc = void $ follow
3844 , (Patch, go _pathItemPatch)
3945 , (Trace, go _pathItemTrace) ]
4046 where
47+ oldServers = mergeServers oldServers' (_pathItemServers old)
48+ newServers = mergeServers newServers' (_pathItemServers new)
4149 go :: (PathItem -> Maybe Operation) -> TreeM OperationTree ()
42− go getOp = (error "FIXME: not implemented")
50+ go getOp = case getOp old of
51+ Nothing -> return ()
52+ -- Operation is not in old schema, so any addition is Ok
53+ Just oldOp -> case getOp new of
54+ Nothing -> do
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)
58+
59+operationsCompatible
60+ :: ([Server], Operation)
61+ -> ([Server], Operation)
62+ -> TreeM OperationTree ()
63+operationsCompatible = error "FIXME: operationsCompatible not implemented"