Current section

Files

Jump to
islands_engine lib islands engine board server.ex
Raw

lib/islands/engine/board/server.ex

defmodule Islands.Engine.Board.Server do
@moduledoc false
use GenServer
use PersistConfig
alias __MODULE__
alias Islands.Engine.Board
@typep from :: GenServer.from()
@board_set_path Application.get_env(@app, :board_set_path)
@spec start_link(term) :: GenServer.on_start()
def start_link(:ok), do: GenServer.start_link(Server, :ok, name: Server)
@spec persist_board(Board.t()) :: :ok
def persist_board(%Board{} = board),
do: GenServer.cast(Server, {:persist_board, board})
@spec restore_board :: Board.t()
def restore_board, do: GenServer.call(Server, :restore_board)
## Callbacks
@spec init(term) :: {:ok, term}
def init(:ok), do: {:ok, :ok}
@spec handle_cast(term, term) :: {:noreply, term}
def handle_cast({:persist_board, board}, :ok) do
:ok =
@board_set_path
|> File.write!(
case File.read(@board_set_path) do
{:ok, binary} -> :erlang.binary_to_term(binary)
{:error, _reason} -> MapSet.new()
end
|> MapSet.put(board)
|> :erlang.term_to_binary()
)
{:noreply, :ok}
end
@spec handle_call(term, from, term) :: {:reply, Board.t(), term}
def handle_call(:restore_board, _from, :ok) do
board =
@board_set_path
|> File.read!()
|> :erlang.binary_to_term()
|> MapSet.to_list()
|> Enum.random()
{:reply, board, :ok}
end
end