defmodule GenETS do use GenServer alias :ets, as: ETS require Logger @type t :: %__MODULE__{ table_name: atom(), table_args: list() } defstruct table_name: nil, table_args: [:set] @spec start_link(__MODULE__.t()) :: GenServer.on_start() def start_link(args) do Logger.info("Starting GenETS server for table: #{args.table_name}") GenServer.start_link(__MODULE__, args, name: :"GenETS.#{args.table_name}") end def init(args) do table_ref = ETS.new(args.table_name, args.table_args) {:ok, %{table_name: args.table_name, table_ref: table_ref}} end # * Need methods for reading, writing, deleting, and updating def handle_call({:read, key}, _from, state) do {:reply, ETS.lookup(state.table_ref, key), state} end def handle_call({:write, key, value}, _from, state) do ETS.insert(state.table_ref, {key, value}) {:reply, :ok, state} end def handle_call({:delete, key}, _from, state) do ETS.delete(state.table_ref, key) {:reply, :ok, state} end def handle_call({:is_exist, key}, _from, state) do result = case ETS.lookup(state.table_ref, key) do [_] -> true _ -> false end {:reply, {:ok, result}, state} end end