defmodule Burrito.Util.FileCache do require Logger @cache_namespace "burrito_file_cache" @spec fetch(binary()) :: {:hit, binary} | {:error, term()} | :miss def fetch(key) when is_binary(key) do cache_dir = get_cache_dir() full_path = Path.join(cache_dir, [key]) case File.read(full_path) do {:ok, data} -> {:hit, data} {:error, :enoent} -> :miss end rescue err -> {:error, err} end @spec put_if_not_exist(binary(), binary()) :: :ok | {:error, term()} def put_if_not_exist(key, data) do cache_dir = get_cache_dir() full_path = Path.join(cache_dir, [key]) if File.exists?(full_path) do :ok else Logger.info("Wrote new cache file: #{full_path}") File.write!(full_path, data, [:binary]) end end @spec clear_cache() :: :ok | {:error, term()} def clear_cache do cache_dir = get_cache_dir() File.rm_rf!(cache_dir) :ok rescue err -> {:error, err} end defp get_cache_dir do dir = :filename.basedir(:user_cache, @cache_namespace) |> to_string() case File.mkdir_p(dir) do :ok -> dir {:error, err} -> Logger.error("Failed to access cache directory") raise "Could not access the Burrito cache directory (#{err})" end end end