defmodule AdventOfCodeHelper.FileCache do @moduledoc """ Contains all the logic for reading/writing files on disk """ @doc """ Saves puzzle input to file for later usage ## Parameters - Year: Int year of puzzle - Day: Int day of puzzle - Content: Puzzle input """ @spec save_file(integer(), integer(), String.t()) :: :ok def save_file(year, day, content) do cache_dir = Application.get_env(:advent_of_code_helper, :cache_dir) unless cache_dir |> File.exists?() do File.mkdir(cache_dir) end write_out("input_#{year}_#{day}", content) :ok end defp write_out(file, content) do Path.join(Application.get_env(:advent_of_code_helper, :cache_dir), file) |> File.write(content, []) end @doc """ Gets file from cache, should we have it stored ## Parameters - Year: year of puzzle - Day: day of puzzle """ @spec get_file(integer(), integer()) :: {:ok, String.t()} def get_file(year, day) do case get_filename(year, day) |> File.read() do {:ok, contents} -> {:ok, contents} {:error, _msg} -> {:fail, "No file found"} end end @doc """ Checks to see if we have a puzzle input cached ## Parameters - year: year of puzzle - day: day of puzzle """ @spec in_cache?(integer(), integer()) :: boolean() def in_cache?(year, day) do get_filename(year, day) |> File.exists?() end defp get_filename(year, day) do Application.get_env(:advent_of_code_helper, :cache_dir) |> Path.join("input_#{year}_#{day}") end end