Skip to main content

lib/rujira/thorchain/events.ex

defmodule Rujira.Thorchain.Events do
  @moduledoc """
  Parser for THORChain native chain events.

  Transforms `%Event{}` into a `%TcEvent{data}` envelope.
  Sub-events are pure data constructors that receive a plain attrs map.
  """

  alias Rujira.Events.Event
  alias Rujira.Thorchain.Events.AddLiquidity
  alias Rujira.Thorchain.Events.Bond
  alias Rujira.Thorchain.Events.Event, as: TcEvent
  alias Rujira.Thorchain.Events.OraclePrice
  alias Rujira.Thorchain.Events.PendingLiquidity
  alias Rujira.Thorchain.Events.SetMimir
  alias Rujira.Thorchain.Events.Swap
  alias Rujira.Thorchain.Events.Transfer
  alias Rujira.Thorchain.Events.Withdraw

  @spec parse(Event.t()) :: {:ok, TcEvent.t()} | {:error, term()}

  def parse(%Event{type: type, attributes: attrs} = event) do
    case new(type, attrs) do
      {:ok, data} -> {:ok, TcEvent.new(data)}
      {:error, _} = err -> err
      :pass -> {:ok, TcEvent.new(event)}
    end
  end

  defp new("swap", attrs), do: Swap.new(attrs)
  defp new("transfer", attrs), do: Transfer.new(attrs)
  defp new("add_liquidity", attrs), do: AddLiquidity.new(attrs)
  defp new("withdraw", attrs), do: Withdraw.new(attrs)
  defp new("pending_liquidity", attrs), do: PendingLiquidity.new(attrs)
  defp new("oracle_price", attrs), do: OraclePrice.new(attrs)
  defp new("bond", attrs), do: Bond.new(:bond, attrs)
  defp new("rebond", attrs), do: Bond.new(:rebond, attrs)
  defp new("set_mimir", attrs), do: SetMimir.new(attrs)
  defp new(_, _), do: :pass
end