How to set default state for a GenServer
When you write a GenServer you will in almost every use case run it as a supervised process to get the added benefit Supervisors provide, fault tolerance.
To set the initial state for your supervised GenServer process you will need to make sure you have a start_link function defined in your GenServer that makes another call to the GenServer init callback. That is outlined below with function comments for additional context:
lib/server.ex
defmodule CacheServer.Server do
use GenServer
GenServer is passed as a child to
def start_link(initial_state) do
GenServer.start_link(__MODULE__, initial_state, name: Cache)
end
@impl true
def init(cache_store) do
{:ok, cache_store}
end
end
Now that you’ve seen the functions that need to be defined in order to start your process. Navigate to your application.ex file. In the children list is where you will start all your genservers for your application. There are a couple of different ways you can format the tuple in the children list but below we optioned to pass the GenServer name and the initial state, in this case %{a: :b}. This will be passed to the start_link function we referenced above.
lib/application.ex
defmodule CacheServer.Application do
@moduledoc false
use Application
@impl true
def start(_type, _args) do
children = [
start_link(arg)
{CacheServer.Server, %{a: :b}}
]
opts = [strategy: :one_for_one, name: CacheServer.Supervisor]
Supervisor.start_link(children, opts)
end
end