lib/toolbox/utils/path.ex

defmodule Toolbox.Utils.Path do
  @moduledoc """
  Utilities for handling configured paths.
  """

  @doc """
  Resolves a possibly relative path to absolute path by prepending the Altworx
  root dir (see `set_altworx_root/1`).

  ## Examples

      iex> Path.set_altworx_root("/opt/altworx")
      :ok
      iex> Path.resolve_path("/already/absolute/path")
      "/already/absolute/path"
      iex> Path.resolve_path("some/../relative/path")
      "/opt/altworx/relative/path"
  """
  def resolve_path("/" <> _ = path) do
    path
  end

  def resolve_path(path) when is_binary(path) do
    Path.expand(Path.join(get_altworx_root(), path))
  end

  @doc """
  Sets where the Altworx root dir is. Configuration and data dirs are supposed
  to be relative to the root dir. It is typically the directory which the VM is
  started in.
  """
  @spec set_altworx_root(String.t()) :: :ok
  def set_altworx_root(path) when is_binary(path) do
    Application.put_env(:toolbox, :altworx_root_dir, path)
  end

  @doc """
  Gets the Altworx root dir.
  """
  @spec get_altworx_root :: String.t()
  def get_altworx_root do
    Application.get_env(:toolbox, :altworx_root_dir)
  end
end