defmodule Credo.IssueMeta do
  @moduledoc """
  IssueMeta provides helper functions for meta information which a check wants
  to pass to the `issue_for(...)` function, i.e. the current SourceFile and check
  params (by default).
  """

  @type t :: {__MODULE__, Credo.SourceFile.t(), Keyword.t()}

  alias Credo.SourceFile

  @doc "Returns an issue meta tuple for the given `source_file` and `check_params`."
  def for(source_file, check_params) do
    {__MODULE__, source_file, check_params}
  end

  @doc "Returns the source file for the given `issue_meta`."
  def source_file(issue_meta)

  def source_file(%{source_file: source_file, params: _}), do: source_file
  def source_file({__MODULE__, source_file, _params}), do: source_file
  def source_file(%SourceFile{} = source_file), do: source_file

  @doc "Returns the check params for the given `issue_meta`."
  def params(issue_meta)

  def params(%{source_file: _, params: check_params}), do: check_params
  def params({__MODULE__, _source_file, check_params}), do: check_params
  def params(%SourceFile{}), do: []
end
