defmodule ExSQL.Error do
@moduledoc """
Exception raised (internally) and returned (externally) for SQL errors.
Public API functions return `{:error, %ExSQL.Error{}}` rather than raising;
the bang variants (`ExSQL.execute!/2`) raise it.
"""
defexception [:message, :line, :db]
@typedoc """
`db` is internal plumbing: `OR FAIL` / `OR ROLLBACK` conflict resolution
attaches the database state the failed statement leaves behind (partial
changes kept, or the transaction rolled back). It is scrubbed before
errors reach the public API.
"""
@type t :: %__MODULE__{
message: String.t(),
line: pos_integer() | nil,
db: ExSQL.Database.t() | nil
}
@impl true
def message(%__MODULE__{message: message, line: nil}), do: message
@impl true
def message(%__MODULE__{message: message, line: line}), do: "#{message} (line #{line})"
end