defmodule Gasrate.Server do use GenServer alias Gasrate as: G @name __MODULE__ @registry_name :gas_rate_registry defstruct rates: nil, state: nil def start_link(id) do name = via_tuple(id) GenServer.start_link(__MODULE__, [id], name: name) end defp via_tuple(id) do {:via, Registry, {@registry_name, id}} end def init([id]) do {:ok, %__MODULE__{ id: id }} end def fetch_avg_rates(id, state) do GenServer.call(via_tuple(id), {:fetch_avg_rates, state}) end def fetch_avg_rates!(id, state) do GenServer.call(via_tuple(id), {:fetch_avg_rates!, state}) end def fetch_national_avg(id) do GenServer.call(via_tuple(id), :fetch_national_avg) end def fetch_national_avg!(id) do GenServer.call(via_tuple(id), :fetch_national_avg!) end @doc "Fetch the national avg gas rates" def handle_call(:fetch_national_avg, _from, %__MODULE__{ rates: rates } = state) do r = G.fetch_national_avg {status, rte } = r {:reply, r, %__MODULE__{ state | rates: rte } end @doc "Fetch the national avg gas rates" def handle_call(:fetch_national_avg!, _from, %__MODULE__{ rates: rates } = state) do r = G.fetch_national_avg {status, rte } = r {:reply, rte, %__MODULE__{ state | rates: rte } end @doc "Fetch the avg gas rates" def handle_call({:fetch_avg_rates,state}, _from, %__MODULE__{ rates: rates } = state) do r = G.fetch_avg_rates(state) {status, rte } = r {:reply, r, %__MODULE__{ state | rates: rte } end @doc "Fetch the avg gas rates" def handle_call({:fetch_avg_rates!,state}, _from, %__MODULE__{ rates: rates } = state) do r = G.fetch_avg_rates(state) {status, rte } = r {:reply, rte, %__MODULE__{ state | rates: rte } end end