@@ -273,6 +273,46 @@ 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+ -> List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter )
284+ mergeParams pathParams operationParams =
285+ let
286+ operationParamKeys : FastSet . Set String
287+ operationParamKeys =
288+ operationParams
289+ |> List . filterMap
290+ ( \ param ->
291+ case OpenApi . Reference . toConcrete param of
292+ Just concrete ->
293+ Just ( OpenApi . Parameter . in_ concrete ++ " :" ++ OpenApi . Parameter . name concrete)
294+
295+ Nothing ->
296+ Nothing
297+ )
298+ |> FastSet . fromList
299+
300+ nonOverriddenPathParams : List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter )
301+ nonOverriddenPathParams =
302+ pathParams
303+ |> List . filter
304+ ( \ param ->
305+ case OpenApi . Reference . toConcrete param of
306+ Just concrete ->
307+ not ( FastSet . member ( OpenApi . Parameter . in_ concrete ++ " :" ++ OpenApi . Parameter . name concrete) operationParamKeys)
308+
309+ Nothing ->
310+ True
311+ )
312+ in
313+ nonOverriddenPathParams ++ operationParams
314+
315+
276316pathDeclarations : List OpenApi .Config .EffectType -> ServerInfo -> CliMonad (List CliMonad .Declaration )
277317pathDeclarations effectTypes server =
278318 CliMonad . getApiSpec
@@ -294,7 +334,7 @@ pathDeclarations effectTypes server =
294334 |> List . filterMap ( \ ( method, getter ) -> Maybe . map ( Tuple . pair method) ( getter path))
295335 |> CliMonad . combineMap
296336 ( \ ( method, operation ) ->
297- toRequestFunctions server effectTypes method url operation
337+ toRequestFunctions server effectTypes method url ( OpenApi . Path . parameters path ) operation
298338 |> CliMonad . errorToWarning
299339 )
300340 |> CliMonad . map ( List . filterMap identity >> List . concat)
@@ -462,9 +502,12 @@ requestBodyToDeclarations name reference =
462502 |> CliMonad . withPath name
463503
464504
465- toRequestFunctions : ServerInfo -> List OpenApi .Config .EffectType -> String -> String -> OpenApi .Operation .Operation -> CliMonad (List CliMonad .Declaration )
466- toRequestFunctions server effectTypes method pathUrl operation =
505+ toRequestFunctions : ServerInfo -> List OpenApi .Config .EffectType -> String -> String -> List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter ) -> OpenApi .Operation .Operation -> CliMonad (List CliMonad .Declaration )
506+ toRequestFunctions server effectTypes method pathUrl pathLevelParams operation =
467507 let
508+ allParams : List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter )
509+ allParams =
510+ mergeParams pathLevelParams ( OpenApi . Operation . parameters operation)
468511 functionName : String
469512 functionName =
470513 OpenApi . Operation . operationId operation
@@ -1142,7 +1185,7 @@ toRequestFunctions server effectTypes method pathUrl operation =
11421185 |> CliMonad . andThen
11431186 ( \ params ->
11441187 toConfigParamAnnotation
1145- { operation = operation
1188+ { allParams = allParams
11461189 , successAnnotation = successAnnotation
11471190 , errorBodyAnnotation = bodyTypeAnnotation
11481191 , errorTypeAnnotation = errorTypeAnnotation
@@ -1152,8 +1195,8 @@ toRequestFunctions server effectTypes method pathUrl operation =
11521195 }
11531196 )
11541197 )
1155- ( replacedUrl server auth pathUrl operation )
1156- ( operationToHeaderParams operation )
1198+ ( replacedUrl server auth pathUrl allParams )
1199+ ( operationToHeaderParams allParams )
11571200 )
11581201 ( operationToContentSchema operation)
11591202 ( operationToAuthorizationInfo operation)
@@ -1181,10 +1224,9 @@ operationToGroup operation =
11811224 " Operations"
11821225
11831226
1184- operationToHeaderParams : OpenApi .Operation .Operation -> CliMonad (List (Elm .Expression -> ( Elm .Expression , Elm .Expression , Bool )))
1185- operationToHeaderParams operation =
1186- operation
1187- |> OpenApi . Operation . parameters
1227+ operationToHeaderParams : List (OpenApi .Reference .ReferenceOr OpenApi .Parameter .Parameter ) -> CliMonad (List (Elm .Expression -> ( Elm .Expression , Elm .Expression , Bool )))
1228+ operationToHeaderParams params =
1229+ params
11881230 |> CliMonad . combineMap
11891231 ( \ param ->
11901232 toConcreteParam param
@@ -1230,8 +1272,8 @@ operationToHeaderParams operation =
12301272 |> CliMonad . map ( List . filterMap identity)
12311273
12321274
1233- replacedUrl : ServerInfo -> AuthorizationInfo -> String -> OpenApi .Operation . Operation -> CliMonad (Elm .Expression -> Elm .Expression )
1234- replacedUrl server authInfo pathUrl operation =
1275+ replacedUrl : ServerInfo -> AuthorizationInfo -> String -> List ( OpenApi .Reference . ReferenceOr OpenApi . Parameter . Parameter ) -> CliMonad (Elm .Expression -> Elm .Expression )
1276+ replacedUrl server authInfo pathUrl params =
12351277 let
12361278 pathSegments : List String
12371279 pathSegments =
@@ -1309,8 +1351,7 @@ replacedUrl server authInfo pathUrl operation =
13091351 MultipleServers _ ->
13101352 Gen . Url . Builder . call_. crossOrigin ( Elm . get " server" config) ( Elm . list replacedSegments) allQueryParams
13111353 in
1312- operation
1313- |> OpenApi . Operation . parameters
1354+ params
13141355 |> CliMonad . combineMap
13151356 ( \ param ->
13161357 toConcreteParam param
@@ -1761,7 +1802,7 @@ contentToContentSchema content =
17611802
17621803
17631804toConfigParamAnnotation :
1764- { operation : OpenApi . Operation . Operation
1805+ { allParams : List ( OpenApi . Reference . ReferenceOr OpenApi . Parameter . Parameter )
17651806 , successAnnotation : Elm . Annotation . Annotation
17661807 , errorBodyAnnotation : Elm . Annotation . Annotation
17671808 , errorTypeAnnotation : Elm . Annotation . Annotation
@@ -1820,7 +1861,7 @@ toConfigParamAnnotation options =
18201861 , lamderaProgramTest = toAnnotation toMsgLamderaProgramTest
18211862 }
18221863 )
1823- ( operationToUrlParams options. operation )
1864+ ( operationToUrlParams options. allParams )
18241865
18251866
18261867type ServerInfo
@@ -1886,13 +1927,8 @@ serverInfo server =
18861927 |> CliMonad . succeed
18871928
18881929
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
1930+ operationToUrlParams : List (OpenApi .Reference .ReferenceOr OpenApi .Parameter .Parameter ) -> CliMonad (List ( Common .UnsafeName , Elm .Annotation .Annotation ))
1931+ operationToUrlParams params =
18961932 if List . isEmpty params then
18971933 CliMonad . succeed []
18981934
0 commit comments