Current section

Files

Jump to
rock_solid lib rock_solid resolution cache.ex
Raw

lib/rock_solid/resolution/cache.ex

defmodule RockSolid.Resolution.Cache do
@moduledoc false
alias RockSolid.Context
alias RockSolid.Resolution
require Logger
defp cache_enabled?, do: Application.get_env(:rock_solid, :cache_enabled, true)
@doc """
Returns a schema from cache directory, or nil if it is not present
"""
def get_schema(base_id) do
if cache_enabled?() do
path = expected_cache_filename(base_id)
if File.exists?(path) do
path |> File.read!() |> JSON.decode!()
end
else
nil
end
end
defp cache_dir, do: :filename.basedir(:user_cache, "rock_solid")
defp expected_cache_filename(base_id) when is_binary(base_id) do
Path.join(cache_dir(), "#{Base.encode32(base_id)}.json")
end
def put_schema(schema) do
id = Resolution.id(schema)
Context.put_schema(schema)
store_in_local_dir(id, schema)
end
def store_in_local_dir(base_id, schema) do
if cache_enabled?(), do: do_store(base_id, schema), else: :ok
end
defp do_store(base_id, schema) do
if not File.exists?(cache_dir()) do
# Fails in CI, doesn't matter
File.mkdir(cache_dir())
end
full_path = expected_cache_filename(base_id)
case File.write(full_path, JSON.encode!(schema)) do
:ok ->
:ok
{:error, r} ->
Logger.error("saving file #{full_path}: #{inspect(r)}")
end
end
def clear do
if File.exists?(cache_dir()) do
cache_dir()
|> File.ls!()
|> Enum.each(fn filename -> File.rm!(Path.join(cache_dir(), filename)) end)
end
end
end