lib/tai/advisors/factories/one_per_venue.ex

defmodule Tai.Advisors.Factories.OnePerVenue do
  @moduledoc """
  Advisor factory for creating an advisor instance per venue.

  Use this to receive trade & order book streams for products within a venue.
  """

  use Tai.Advisors.Factory

  @type fleet_config :: Tai.Fleets.FleetConfig.t()
  @type advisor_config :: Tai.Fleets.AdvisorConfig.t()

  @spec advisor_configs(fleet_config) :: [advisor_config]
  def advisor_configs(fleet) do
    config = fleet.config || %{}
    market_stream_keys = build_venue_product_keys(fleet.market_streams)

    market_stream_keys
    |> Enum.group_by(fn {v, _s} -> v end)
    |> Enum.map(fn {v, market_stream_keys} ->
      %Tai.Fleets.AdvisorConfig{
        advisor_id: v,
        fleet_id: fleet.id,
        mod: fleet.advisor,
        start_on_boot: fleet.start_on_boot,
        restart: fleet.restart,
        shutdown: fleet.shutdown,
        market_stream_keys: market_stream_keys,
        config: config
      }
    end)
  end
end