lib/definition_error.ex

# Copyright 2018 - 2022, Mathijs Saey, Vrije Universiteit Brussel

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

defmodule Skitter.DefinitionError do
  @moduledoc """
  Raised when an error is encountered in a Operation, Workflow or Strategy.

  This error can be raised by a Skitter DSL or by a skitter data type. It is raised when invalid
  syntax is encountered or when a semantic error is present in a `Skitter.Operation`,
  `Skitter.Workflow` or `Skitter.Strategy`.
  """
  defexception [:message, :env]

  @impl true
  def message(%__MODULE__{message: msg, env: nil}) do
    msg
  end

  def message(%__MODULE__{message: msg, env: env}) do
    loc = Exception.format_file_line(env.file, env.line, " ")
    loc <> msg
  end

  @impl true
  def exception(msg) when is_binary(msg), do: %__MODULE__{message: msg}
  def exception({msg, env}), do: %__MODULE__{message: msg, env: env}

  @doc false
  def inject(msg, env \\ nil) do
    env = Macro.escape(env)
    quote(do: raise(Skitter.DefinitionError, {unquote(msg), unquote(env)}))
  end
end