Current section
Files
Jump to
Current section
Files
lib/gateways/base_supervisor.ex
defmodule Cashier.Gateways.BaseSupervisor do
defmacro __using__(opts) do
quote bind_quoted: [opts: opts] do
defmodule Supervisor do
use ConsumerSupervisor
def init(_args), do: {:producer_consumer, :no_state}
def start_link(_opts) do
children = [
worker(unquote(opts[:module]), [gateway_config()], restart: :temporary)
]
ConsumerSupervisor.start_link(
children,
strategy: :one_for_one,
name: __MODULE__,
subscribe_to: [{
Cashier.Pipeline.GatewayRouter,
max_demand: default_config()[:max_gateway_workers] || 50,
selector: &dispatch_selector/1
}]
)
end
defp dispatch_selector({_, _, opts}),
do: Keyword.get(opts, :gateway) == unquote(opts[:name])
defp dispatch_selector(_), do: false
defp gateway_config,
do: Application.get_env(:cashier, unquote(opts[:name]), nil)
defp default_config do
case Application.get_env(:cashier, :cashier) do
nil -> []
config -> config[:defaults]
end
end
end
end
end
end