   end
 
   @doc false
+  @spec cache_file :: String.t()
   def cache_file() do
     # "#{Path.join(Drab.Config.app_name() |> :code.priv_dir() |> to_string(), @cache_file)}"
     "#{Path.join(:drab |> :code.priv_dir() |> to_string(), @cache_file)}"

  # DETS table is created and filled up during the compile-time.

  @doc false
  @spec start:: :ok
  def start() do
    # if :dets.info(cache_file()) == :undefined do
    {:ok, _} = :dets.open_file(cache_file(), type: :set, ram_file: true)

  end

  @doc false
  @spec set(atom | String.t() | tuple, term) :: :ok
  def set(k, v) do
    :dets.insert(cache_file(), {k, v})
    :dets.sync(cache_file())
  end

  @doc false
  @spec add(atom | String.t() | tuple, term) :: :ok
  def add(k, v) do
    list = get(k) || []
    :dets.insert(cache_file(), {k, list ++ [v]})
