defmodule OpenAPI.Spec.Server do @moduledoc "Raw server from the OpenAPI spec" import OpenAPI.Reader.State alias OpenAPI.Spec.Server.Variable # # Definition # @type t :: %__MODULE__{ url: String.t(), description: String.t() | nil, variables: %{optional(String.t()) => Variable.t()} } defstruct [ :url, :description, :variables ] # # Decoder # @doc false @spec decode(map, map) :: {map, t} def decode(state, yaml) do {state, variables} = decode_variables(state, yaml) server = %__MODULE__{ url: Map.fetch!(yaml, "url"), description: Map.get(yaml, "description"), variables: variables } {state, server} end @spec decode_variables(map, map) :: {map, %{optional(String.t()) => Variable.t()}} defp decode_variables(state, %{"variables" => %{} = vars}) do with_path(state, vars, "variables", fn state, vars -> Enum.reduce(vars, {state, %{}}, fn {name, var}, {state, vars} -> var = with_path(state, var, name, &Variable.decode/2) {state, Map.put(vars, name, var)} end) end) end defp decode_variables(state, _yaml), do: {state, %{}} end