@@ -273,6 +273,42 @@ stripTrailingSlash input =
273273 input
274274
275275
276+ {- | Merge path-level parameters with operation-level parameters.
277+ Per the OpenAPI spec, operation-level parameters override path-level
278+ parameters with the same name and location.
279+ -}
280+ mergeParams :
281+ List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter )
282+ -> List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter )
283+ -> CliMonad ( List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter ))
284+ mergeParams pathParams operationParams =
285+ let
286+ paramKey : OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter -> CliMonad String
287+ paramKey param =
288+ toConcreteParam param
289+ |> CliMonad . map ( \ concrete -> OpenApi . Parameter . in_ concrete ++ " :" ++ OpenApi . Parameter . name concrete)
290+ in
291+ CliMonad . combineMap paramKey operationParams
292+ |> CliMonad . map FastSet . fromList
293+ |> CliMonad . andThen
294+ ( \ operationParamKeys ->
295+ pathParams
296+ |> CliMonad . combineMap
297+ ( \ param ->
298+ paramKey param
299+ |> CliMonad . map
300+ ( \ key ->
301+ if FastSet . member key operationParamKeys then
302+ Nothing
303+
304+ else
305+ Just param
306+ )
307+ )
308+ |> CliMonad . map ( \ filtered -> List . filterMap identity filtered ++ operationParams)
309+ )
310+
311+
276312pathDeclarations : List OpenApi .Config .EffectType -> ServerInfo -> CliMonad (List CliMonad .Declaration )
277313pathDeclarations effectTypes server =
278314 CliMonad . getApiSpec
@@ -294,7 +330,7 @@ pathDeclarations effectTypes server =
294330 |> List . filterMap ( \ ( method, getter ) -> Maybe . map ( Tuple . pair method) ( getter path))
295331 |> CliMonad . combineMap
296332 ( \ ( method, operation ) ->
297- toRequestFunctions server effectTypes method url operation
333+ toRequestFunctions server effectTypes method url ( OpenApi . Path . parameters path ) operation
298334 |> CliMonad . errorToWarning
299335 )
300336 |> CliMonad . map ( List . filterMap identity >> List . concat)
@@ -462,8 +498,17 @@ requestBodyToDeclarations name reference =
462498 |> CliMonad . withPath name
463499
464500
465- toRequestFunctions : ServerInfo -> List OpenApi .Config .EffectType -> String -> String -> OpenApi .Operation .Operation -> CliMonad (List CliMonad .Declaration )
466- toRequestFunctions server effectTypes method pathUrl operation =
501+ toRequestFunctions : ServerInfo -> List OpenApi .Config .EffectType -> String -> String -> List (OpenApi .Reference .ReferenceOr OpenApi .Parameter .Parameter ) -> OpenApi .Operation .Operation -> CliMonad (List CliMonad .Declaration )
502+ toRequestFunctions server effectTypes method pathUrl pathLevelParams operation =
503+ mergeParams pathLevelParams ( OpenApi . Operation . parameters operation)
504+ |> CliMonad . andThen
505+ ( \ allParams ->
506+ toRequestFunctionsHelp server effectTypes method pathUrl operation allParams
507+ )
508+
509+
510+ toRequestFunctionsHelp : ServerInfo -> List OpenApi .Config .EffectType -> String -> String -> OpenApi .Operation .Operation -> List (OpenApi .Reference .ReferenceOr OpenApi .Parameter .Parameter ) -> CliMonad (List CliMonad .Declaration )
511+ toRequestFunctionsHelp server effectTypes method pathUrl operation allParams =
467512 let
468513 functionName : String
469514 functionName =
@@ -1142,7 +1187,7 @@ toRequestFunctions server effectTypes method pathUrl operation =
11421187 |> CliMonad . andThen
11431188 ( \ params ->
11441189 toConfigParamAnnotation
1145- { operation = operation
1190+ { allParams = allParams
11461191 , successAnnotation = successAnnotation
11471192 , errorBodyAnnotation = bodyTypeAnnotation
11481193 , errorTypeAnnotation = errorTypeAnnotation
@@ -1152,8 +1197,8 @@ toRequestFunctions server effectTypes method pathUrl operation =
11521197 }
11531198 )
11541199 )
1155- ( replacedUrl server auth pathUrl operation )
1156- ( operationToHeaderParams operation )
1200+ ( replacedUrl server auth pathUrl allParams )
1201+ ( operationToHeaderParams allParams )
11571202 )
11581203 ( operationToContentSchema operation)
11591204 ( operationToAuthorizationInfo operation)
@@ -1181,10 +1226,9 @@ operationToGroup operation =
11811226 " Operations"
11821227
11831228
1184- operationToHeaderParams : OpenApi .Operation .Operation -> CliMonad (List (Elm .Expression -> ( Elm .Expression , Elm .Expression , Bool )))
1185- operationToHeaderParams operation =
1186- operation
1187- |> OpenApi . Operation . parameters
1229+ operationToHeaderParams : List (OpenApi .Reference .ReferenceOr OpenApi .Parameter .Parameter ) -> CliMonad (List (Elm .Expression -> ( Elm .Expression , Elm .Expression , Bool )))
1230+ operationToHeaderParams params =
1231+ params
11881232 |> CliMonad . combineMap
11891233 ( \ param ->
11901234 toConcreteParam param
@@ -1230,8 +1274,8 @@ operationToHeaderParams operation =
12301274 |> CliMonad . map ( List . filterMap identity)
12311275
12321276
1233- replacedUrl : ServerInfo -> AuthorizationInfo -> String -> OpenApi .Operation . Operation -> CliMonad (Elm .Expression -> Elm .Expression )
1234- replacedUrl server authInfo pathUrl operation =
1277+ replacedUrl : ServerInfo -> AuthorizationInfo -> String -> List ( OpenApi .Reference . ReferenceOr OpenApi . Parameter . Parameter ) -> CliMonad (Elm .Expression -> Elm .Expression )
1278+ replacedUrl server authInfo pathUrl params =
12351279 let
12361280 pathSegments : List String
12371281 pathSegments =
@@ -1309,8 +1353,7 @@ replacedUrl server authInfo pathUrl operation =
13091353 MultipleServers _ ->
13101354 Gen . Url . Builder . call_. crossOrigin ( Elm . get " server" config) ( Elm . list replacedSegments) allQueryParams
13111355 in
1312- operation
1313- |> OpenApi . Operation . parameters
1356+ params
13141357 |> CliMonad . combineMap
13151358 ( \ param ->
13161359 toConcreteParam param
@@ -1761,7 +1804,7 @@ contentToContentSchema content =
17611804
17621805
17631806toConfigParamAnnotation :
1764- { operation : OpenApi . Operation . Operation
1807+ { allParams : List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter )
17651808 , successAnnotation : Elm . Annotation . Annotation
17661809 , errorBodyAnnotation : Elm . Annotation . Annotation
17671810 , errorTypeAnnotation : Elm . Annotation . Annotation
@@ -1820,7 +1863,7 @@ toConfigParamAnnotation options =
18201863 , lamderaProgramTest = toAnnotation toMsgLamderaProgramTest
18211864 }
18221865 )
1823- ( operationToUrlParams options. operation )
1866+ ( operationToUrlParams options. allParams )
18241867
18251868
18261869type ServerInfo
@@ -1886,13 +1929,8 @@ serverInfo server =
18861929 |> CliMonad . succeed
18871930
18881931
1889- operationToUrlParams : OpenApi .Operation .Operation -> CliMonad (List ( Common .UnsafeName , Elm .Annotation .Annotation ))
1890- operationToUrlParams operation =
1891- let
1892- params : List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter )
1893- params =
1894- OpenApi . Operation . parameters operation
1895- in
1932+ operationToUrlParams : List (OpenApi .Reference .ReferenceOr OpenApi .Parameter .Parameter ) -> CliMonad (List ( Common .UnsafeName , Elm .Annotation .Annotation ))
1933+ operationToUrlParams params =
18961934 if List . isEmpty params then
18971935 CliMonad . succeed []
18981936
0 commit comments