lib/xtb_client/streaming_message.ex

defmodule XtbClient.StreamingMessage do
  @type t :: %__MODULE__{
          method: binary(),
          response_method: binary(),
          params: map() | nil
        }
  @type token :: {:method, binary()} | {:hashed_params, binary(), binary()}

  defstruct method: "",
            response_method: "",
            params: nil

  def new(method, response_method, params \\ nil) do
    %__MODULE__{
      method: method,
      response_method: response_method,
      params: params
    }
  end

  def encode_token(%__MODULE__{method: "getTrades" = method_name}) do
    {:method, method_name}
  end

  def encode_token(%__MODULE__{method: method_name, params: %{symbol: symbol}}) do
    {:hashed_params, method_name, symbol}
  end

  def encode_token(%__MODULE__{method: method_name}) do
    {:method, method_name}
  end

  def decode_method_name({:method, method}) do
    method
  end

  def decode_method_name({:hashed_params, method, _symbol}) do
    method
  end
end