lib/runbox/scenario/config.ex

defmodule Runbox.Scenario.Config do
  @moduledoc """
  Provides configuration to a scenario.
  """

  alias Runbox.Utils.Path, as: PathUtils

  @doc """
  Read file from the config dir.

  The file is located in the configuration directory, in a folder matching the `scenario_id` param.
  The file is read if it exists and content is returned as `{:ok, content}`, otherwise `{:error,
  reason}` is returned.
  """
  @spec read_file(String.t() | atom(), String.t()) :: {:ok, binary()} | {:error, File.posix()}
  def read_file(scenario_id, file_path) do
    path = resolve_file(scenario_id, file_path)
    File.read(path)
  end

  @doc """
  Resolves a path to a file in scenario config.

  The file is located in the configuration directory, in a folder matching the `scenario_id` param.
  This function resolves the path so that it can be used with `File` functions directly.  The
  existence of the file is not verified. Note if you want to just read the file, you can use
  `read_file/2`, this function should be used when you need to handle the file in a special manner
  (e.g. streaming).
  """
  @spec resolve_file(String.t() | atom(), String.t()) :: String.t()
  def resolve_file(scenario_id, file_path) do
    config_dir = PathUtils.resolve_path(Application.fetch_env!(:runbox, :scenario_config_dir))
    Path.join([config_dir, to_string(scenario_id), file_path])
  end
end