lib/errors.ex

defmodule Matcher.Errors do
  def build_error(module, context, extras) do
    {:error,
     Map.merge(
       %{
         module: module,
         path: context.path
       },
       Map.new(extras)
     )}
  end

  defmacro error(context, extras) do
    quote do
      Matcher.Errors.build_error(__MODULE__, unquote(context), unquote(extras))
    end
  end

  def expected(value) do
    IO.ANSI.format([:green, :bright, inspect(value)])
  end

  def mismatched(value) do
    IO.ANSI.format([:red, :bright, inspect(value)])
  end
end