Packages

A simple Elixir package that provides circuit breaker manager

Current section

Files

Jump to
virgil lib manager genserver manager.ex
Raw

lib/manager/genserver/manager.ex

defmodule Virgil.Manager.GenserverManager do
@moduledoc false
use GenServer
require Logger
alias Virgil.Circuit
@impl true
def init(circuit), do: {:ok, circuit}
def adapter, do: Virgil.Manager.Genserver.Adapter
def start_link(%{name: circuit_name} = circuit),
do: GenServer.start_link(__MODULE__, circuit, name: circuit_name)
@impl true
def handle_cast(:open, %Circuit{name: circuit} = state) do
Logger.debug("[#{__MODULE__}] [#{circuit}] Openning circuit")
{:noreply, %Circuit{state | state: :open}}
end
@impl true
def handle_cast(:close, %Circuit{name: circuit} = state) do
Logger.debug("[#{__MODULE__}] [#{circuit}] Closing circuit")
{:noreply, %Circuit{state | state: :closed}}
end
@impl true
def handle_call(:is_closed?, _from, %Circuit{name: circuit, state: circuit_state} = state) do
Logger.debug("[#{__MODULE__}] [#{circuit}] Circuit is #{circuit_state}")
{:reply, {:ok, circuit_state == :closed}, state}
end
@impl true
def handle_call(
:increment_failures,
_from,
%Circuit{name: circuit, failures: current_failures} = state
) do
Logger.debug("[#{__MODULE__}] [#{circuit}] Incrementig circuit failures")
{:reply, {:ok, current_failures + 1}, %Circuit{state | failures: current_failures + 1}}
end
end