defmodule OpenAPI.Spec.RequestBody do @moduledoc "Raw request body from the OpenAPI spec" import OpenAPI.Reader.State alias OpenAPI.Spec.Schema.Media @type t :: %__MODULE__{ description: String.t() | nil, content: %{optional(String.t()) => Media.t()}, required: boolean } defstruct [ :description, :content, :required ] @doc false @spec decode(map, map) :: {map, t} def decode(state, yaml) do {state, content} = decode_content(state, yaml) request_body = %__MODULE__{ description: Map.get(yaml, "description"), content: content, required: Map.get(yaml, "required", false) } {state, request_body} end @spec decode_content(map, map) :: {map, %{optional(String.t()) => Media.t()}} defp decode_content(state, %{"content" => content}) do with_path(state, content, "content", fn state, content -> Enum.reduce(content, {state, %{}}, fn {key, content_item}, {state, content} -> {state, content_item} = with_path(state, content_item, key, fn state, content_item -> with_ref(state, content_item, &Media.decode/2) end) {state, Map.put(content, key, content_item)} end) end) end defp decode_content(state, _yaml), do: {state, %{}} end