@@ -366,15 +366,50 @@ defmodule OpenApiSpex.ControllerSpecs do
366366 end
367367 end
368368
369+ @ operation_permitted_keys [
370+ :callbacks ,
371+ :description ,
372+ :deprecated ,
373+ :external_docs ,
374+ :operation_id ,
375+ :parameters ,
376+ :request_body ,
377+ :responses ,
378+ :security ,
379+ :summary ,
380+ :tags
381+ ]
382+
369383 @ doc """
370384 Define an Operation for a controller action.
371385
372386 See `OpenApiSpex.ControllerSpecs` for usage and examples.
387+
388+ Permitted operation keys:
389+
390+ #{ Enum . map_join ( @ operation_permitted_keys , "\n " , fn k -> "* `#{ k } `" end ) }
391+ * keys prefixed by `x-` for extensions
373392 """
374393 def operation_spec ( _module , _action , nil = _spec ) , do: nil
375394 def operation_spec ( _module , _action , false = _spec ) , do: nil
376395
377396 def operation_spec ( module , action , spec ) do
397+ validation_result =
398+ spec
399+ |> Enum . reject ( fn { key , _val } -> extension_key? ( key ) end )
400+ |> Keyword . validate ( @ operation_permitted_keys )
401+
402+ case validation_result do
403+ { :ok , _spec } ->
404+ :ok
405+
406+ { :error , unknown_keys } ->
407+ raise ArgumentError ,
408+ "Unknown keys given to operation/2: #{ inspect ( unknown_keys ) } . " <>
409+ "Allowed keys are: #{ inspect ( @ operation_permitted_keys ) } , " <>
410+ "and keys starting with 'x-'."
411+ end
412+
378413 spec = Map . new ( spec )
379414 shared_tags = Module . get_attribute ( module , :shared_tags , [ ] ) |> List . flatten ( )
380415
@@ -386,9 +421,7 @@ defmodule OpenApiSpex.ControllerSpecs do
386421
387422 extensions =
388423 spec
389- |> Enum . filter ( fn { key , _val } ->
390- is_atom ( key ) && String . starts_with? ( to_string ( key ) , "x-" )
391- end )
424+ |> Enum . filter ( fn { key , _val } -> extension_key? ( key ) end )
392425 |> Map . new ( fn { key , value } -> { to_string ( key ) , value } end )
393426
394427 % Operation {
@@ -406,4 +439,8 @@ defmodule OpenApiSpex.ControllerSpecs do
406439 extensions: extensions
407440 }
408441 end
442+
443+ defp extension_key? ( key ) do
444+ is_atom ( key ) && String . starts_with? ( to_string ( key ) , "x-" )
445+ end
409446end
0 commit comments