lib/bylaw/db/adapters/postgres/result.ex

defmodule Bylaw.Db.Adapters.Postgres.Result do
  @moduledoc false

  alias Bylaw.Db.Check
  alias Bylaw.Db.Issue

  @typedoc false
  @type row :: %{optional(String.t()) => term(), optional(atom()) => term()}

  @doc false
  @spec rows(map() | list(row())) :: list(row())
  def rows(result) when is_map(result) do
    %{columns: columns, rows: rows} = result

    Enum.map(rows, fn row ->
      columns
      |> Enum.zip(row)
      |> Map.new()
    end)
  end

  def rows(rows) when is_list(rows), do: rows

  @doc false
  @spec to_check_result(list(Issue.t())) :: Check.result()
  def to_check_result([]), do: :ok
  def to_check_result(issues), do: {:error, issues}

  @doc false
  @spec value(row(), String.t(), %{String.t() => atom()}) :: term()
  def value(row, key, row_keys) do
    case Map.fetch(row, key) do
      {:ok, value} -> value
      :error -> Map.fetch!(row, Map.fetch!(row_keys, key))
    end
  end
end