lib/astar.ex

defmodule AStar do
  @moduledoc """
  TODO: Documentation for `AStar`.
  """

  mix_config = Mix.Project.config()
  version = mix_config[:version]
  github_url = mix_config[:package][:links]["GitHub"]
  # Since Rustler 0.27.0, we need to change manually the mode for each env.
  # We want "debug" in dev and test because it's faster to compile.
  mode = if Mix.env() in [:dev, :test], do: :debug, else: :release

  use RustlerPrecompiled,
    otp_app: :astar,
    crate: "astar",
    version: version,
    base_url: "#{github_url}/releases/download/v#{version}",
    mode: mode,
    force_build: System.get_env("ASTAR_BUILD") in ["1", "true"]

  ## Types

  @type coord :: {non_neg_integer(), non_neg_integer()}

  ## Public API

  # AStar.path(<<0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0>>,5,5,{0,0},{4,4})
  @spec path(binary(), pos_integer(), pos_integer(), coord(), coord()) ::
          {:ok, [coord()]} | {:error, atom()}
  def path(_map, _width, _height, _start, _end), do: err()

  # Helpers

  defp err(), do: :erlang.nif_error(:nif_not_loaded)
end