Packages
tai
0.0.69
0.0.75
0.0.74
0.0.73
0.0.72
0.0.71
0.0.70
0.0.69
0.0.68
0.0.67
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.57
0.0.56
0.0.55
0.0.54
0.0.53
0.0.52
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
A composable, real time, market data and trade execution toolkit
Current section
Files
Jump to
Current section
Files
lib/tai/settings.ex
defmodule Tai.Settings do
@moduledoc """
Run time settings
"""
use GenServer
alias __MODULE__
defmodule State do
@enforce_keys ~w[send_orders name]a
defstruct ~w[send_orders name]a
end
@type t :: %Settings{
send_orders: boolean
}
@enforce_keys ~w[send_orders]a
defstruct ~w[send_orders]a
@default_id :default
def start_link(opts) do
config = Keyword.fetch!(opts, :config)
id = Keyword.get(opts, :id, @default_id)
name = process_name(id)
state = %State{send_orders: config.send_orders, name: name}
GenServer.start_link(__MODULE__, state, name: name)
end
def process_name(id), do: :"#{__MODULE__}_#{id}"
def disable_send_orders!(id \\ @default_id) do
id
|> process_name()
|> GenServer.call({:set_send_orders, false})
end
def enable_send_orders!(id \\ @default_id) do
id
|> process_name()
|> GenServer.call({:set_send_orders, true})
end
def send_orders?(id \\ @default_id) do
[{:send_orders, send_orders}] =
id
|> process_name()
|> :ets.lookup(:send_orders)
send_orders
end
def all(id \\ @default_id) do
%Settings{send_orders: send_orders?(id)}
end
@impl true
def init(state) do
{
:ok,
state,
{:continue, :create_ets_table}
}
end
@impl true
def handle_continue(:create_ets_table, state) do
create_ets_table(state.name)
upsert_items(state)
{:noreply, state}
end
@impl true
def handle_call({:set_send_orders, val}, _from, state) do
state.name
|> :ets.insert({:send_orders, val})
{:reply, :ok, state}
end
defp create_ets_table(name) do
:ets.new(name, [:set, :protected, :named_table])
end
defp upsert_items(state) do
state
|> Map.to_list()
|> Enum.filter(fn {k, _} -> k != :__struct__ end)
|> Enum.each(fn item -> :ets.insert(state.name, item) end)
end
end