lib/strong_migrations.ex

defmodule StrongMigrations do
  @moduledoc """
  Documentation for `StrongMigrations`.
  """

  alias StrongMigrations.Loader
  alias StrongMigrations.Parser
  alias StrongMigrations.ReasonsTranslator
  alias StrongMigrations.Validator

  @type migration_path() :: String.t()
  @type migration_file() :: String.t()
  @type validation_result() :: {migration_file(), [atom()]}
  @type reason() :: String.t()

  @doc """
  Starts analyze of the application's migrations.

  ## Examples

      iex> StrongMigrations.analyze()
      :safe

  """
  @spec analyze([migration_path()]) :: :safe | {:unsafe, [reason]}
  def analyze(migration_paths \\ []) do
    migration_paths
    |> Loader.load()
    |> Parser.parse()
    |> Validator.validate()
    |> ReasonsTranslator.translate()
  end

  defmacro __using__(_opts) do
    quote do
      use Ecto.Migration
      import StrongMigrations
    end
  end

  defmacro safety_assured(do: expression) do
    quote do
      unquote(expression)
    end
  end
end