on master help sign in
params and stuff
927d87eAleksey Uymanov
openapi-diff.cabal+1
@@ -80,6 +80,7 @@ library
80 , OpenAPI.Checker.Report
80 , OpenAPI.Checker.Report
81 , OpenAPI.Checker.Run
81 , OpenAPI.Checker.Run
82 , OpenAPI.Checker.Validate
82 , OpenAPI.Checker.Validate
83+ , OpenAPI.Checker.Validate.Dereference
83 , OpenAPI.Checker.Validate.Monad
84 , OpenAPI.Checker.Validate.Monad
84
85
85executable openapi-diff
86executable openapi-diff
src/OpenAPI/Checker/Report.hs+31−8
@@ -2,6 +2,7 @@ module OpenAPI.Checker.Report where
2
2
3import Data.Map.Strict as M
3import Data.Map.Strict as M
4import Data.Monoid.Generic
4import Data.Monoid.Generic
5+import Data.OpenApi.Internal
5import Data.Semigroup.Generic
6import Data.Semigroup.Generic
6import Data.Text (Text)
7import Data.Text (Text)
7import GHC.Generics (Generic)
8import GHC.Generics (Generic)
@@ -44,14 +45,9 @@ data OperationName
44 = Get | Put | Post | Delete | Options | Head | Patch | Trace
45 = Get | Put | Post | Delete | Options | Head | Patch | Trace
45 deriving (Eq, Ord, Show, Generic)
46 deriving (Eq, Ord, Show, Generic)
46
47
47−data OperationTree = OperationTree
48+newtype OperationTree = OperationTree
49+ { parameters :: Map ParamKey (Errorable ParamTree)
48− deriving (Eq, Ord, Show, Generic)
50+ } deriving (Eq, Ord, Show, Generic, Semigroup, Monoid)
49−
50−instance Semigroup OperationTree where
51− _ <> _ = OperationTree
52−
53−instance Monoid OperationTree where
54− mempty = OperationTree
55
51
56instance Nested OperationTree where
52instance Nested OperationTree where
57 type Parent OperationTree = PathItemTree
53 type Parent OperationTree = PathItemTree
@@ -60,3 +56,30 @@ instance Nested OperationTree where
60
56
61data ServerTree = ServerTree
57data ServerTree = ServerTree
62 deriving (Eq, Ord, Show, Generic)
58 deriving (Eq, Ord, Show, Generic)
59+
60+data ParamTree = ParamTree
61+ deriving (Eq, Ord, Show, Generic)
62+
63+instance Semigroup ParamTree where
64+ (<>) = error "Not implemented"
65+instance Monoid ParamTree where
66+ mappend = (<>)
67+ mempty = error "Not implemented"
68+
69+instance Nested ParamTree where
70+ type Key ParamTree = ParamKey
71+ type Parent ParamTree = OperationTree
72+ nest key p = OperationTree $ M.singleton key p
73+
74+deriving instance Ord ParamLocation
75+
76+data ParamKey = ParamKey
77+ { name :: Text
78+ , paramIn :: ParamLocation
79+ } deriving (Eq, Ord, Show, Generic)
80+
81+getParamKey :: Param -> ParamKey
82+getParamKey p = ParamKey
83+ { name = _paramName p
84+ , paramIn = _paramIn p
85+ }
src/OpenAPI/Checker/Validate.hs+20−3
@@ -3,13 +3,15 @@ module OpenAPI.Checker.Validate where
3import Control.Monad
3import Control.Monad
4import Control.Monad.Reader
4import Control.Monad.Reader
5import Data.Functor
5import Data.Functor
6−import Data.HashMap.Strict.InsOrd as InsMap
6+import Data.HashMap.Strict.InsOrd as InsMap
7−import Data.HashSet.InsOrd as InsSet
7+import Data.HashSet.InsOrd as InsSet
8+import Data.Map.Strict as M
8import Data.OpenApi
9import Data.OpenApi
9import Data.OpenApi.Internal
10import Data.OpenApi.Internal
10import Data.Traversable
11import Data.Traversable
11import OpenAPI.Checker.Aux
12import OpenAPI.Checker.Aux
12import OpenAPI.Checker.Report
13import OpenAPI.Checker.Report
14+import OpenAPI.Checker.Validate.Dereference
13import OpenAPI.Checker.Validate.Monad
15import OpenAPI.Checker.Validate.Monad
14
16
15reportCompat :: OpenApi -> OpenApi -> Report
17reportCompat :: OpenApi -> OpenApi -> Report
@@ -76,4 +78,19 @@ operationsCompatible
76 :: Operation
78 :: Operation
77 -> Operation
79 -> Operation
78 -> TreeM OperationTree ()
80 -> TreeM OperationTree ()
79−operationsCompatible = error "FIXME: operationsCompatible not implemented"
81+operationsCompatible old new = do
82+ oldParams <- traverse dereferenceParam $ _operationParameters old
83+ newParams <- traverse dereferenceParam $ _operationParameters new
84+ let
85+ newPMap = M.fromList $ newParams <&> \p -> (getParamKey p, p)
86+ checkParam pkey oldP = case M.lookup pkey newPMap of
87+ Nothing ->
88+ treeError "Param was deleted in new interface, but exists in old"
89+ Just newP -> do
90+ paramsCompatible oldP newP
91+ follow $ oldParams <&> \oldP ->
92+ let pkey = getParamKey oldP
93+ in (pkey , checkParam pkey oldP)
94+
95+paramsCompatible :: Param -> Param -> TreeM ParamTree ()
96+paramsCompatible = error "FIXME: paramsCompatible not implemented"
src/OpenAPI/Checker/Validate/Dereference.hsnew file+8
@@ -0,0 +1,8 @@
1+module OpenAPI.Checker.Validate.Dereference where
2+
3+import Data.OpenApi.Internal
4+import OpenAPI.Checker.Validate.Monad
5+
6+-- | Throws error if param not found
7+dereferenceParam :: Referenced Param -> TreeM t Param
8+dereferenceParam = error "FIXME: dereferenceParam not implemented"
src/OpenAPI/Checker/Validate/Monad.hs+1
@@ -22,6 +22,7 @@ data Env = Env
22emptyEnv :: Env
22emptyEnv :: Env
23emptyEnv = Env [] []
23emptyEnv = Env [] []
24
24
25+-- | Might be different type in future
25type Errorable = Either Err
26type Errorable = Either Err
26
27
27type Err = Text
28type Err = Text