defmodule OpenAPI.Processor.Operation.Param do @moduledoc """ Provides the Param struct that is used by the renderer """ alias OpenAPI.Processor.State alias OpenAPI.Processor.Type alias OpenAPI.Spec.Path.Parameter @typedoc "Location of the param" @type location :: :cookie | :header | :path | :query @typedoc "Style of the param" @type style :: :matrix | :label | :form | :simple | :space_delimited | :pipe_delimited | :deep_object @typedoc "Processed param data used by the renderer" @type t :: %__MODULE__{ description: String.t() | nil, explode: boolean, location: location, name: String.t(), style: style, value_type: Type.t() } defstruct [ :description, :explode, :name, :location, :style, :value_type ] @doc false @spec from_spec(State.t(), Parameter.t()) :: {State.t(), t} def from_spec(state, %Parameter{} = param) do %Parameter{description: description, explode: explode, name: name} = param {state, value_type} = value_type(state, param) param = %__MODULE__{ description: description, explode: explode, name: name, location: location(param), style: style(param), value_type: value_type } {state, param} end @spec location(Parameter.t()) :: location defp location(%Parameter{in: "cookie"}), do: :cookie defp location(%Parameter{in: "header"}), do: :header defp location(%Parameter{in: "path"}), do: :path defp location(%Parameter{in: "query"}), do: :query @spec style(Parameter.t()) :: style defp style(%Parameter{style: "matrix"}), do: :matrix defp style(%Parameter{style: "label"}), do: :label defp style(%Parameter{style: "form"}), do: :form defp style(%Parameter{style: "simple"}), do: :simple defp style(%Parameter{style: "spaceDelimited"}), do: :space_delimited defp style(%Parameter{style: "pipeDelimited"}), do: :pipe_delimited defp style(%Parameter{style: "deepObject"}), do: :deep_object @spec value_type(State.t(), Parameter.t()) :: {State.t(), Type.t()} defp value_type(state, %Parameter{schema: nil}), do: {state, :string} defp value_type(state, %Parameter{schema: schema_or_ref}) do Type.from_schema(state, schema_or_ref) end end