lib/horizon/trade_aggregation.ex

defmodule Stellar.Horizon.TradeAggregation do
  @moduledoc """
  Represents a `TradeAggregation` resource from Horizon API.
  """

  @behaviour Stellar.Horizon.Resource

  alias Stellar.Horizon.Mapping

  @type t :: %__MODULE__{
          timestamp: non_neg_integer(),
          trade_count: non_neg_integer(),
          base_volume: String.t(),
          counter_volume: String.t(),
          avg: String.t(),
          high: String.t(),
          high_r: map(),
          low: String.t(),
          low_r: map(),
          open: String.t(),
          open_r: map(),
          close: String.t(),
          close_r: map()
        }

  defstruct [
    :timestamp,
    :trade_count,
    :base_volume,
    :counter_volume,
    :avg,
    :high,
    :high_r,
    :low,
    :low_r,
    :open,
    :open_r,
    :close,
    :close_r
  ]

  @rational_mapping [
    n: :integer,
    d: :integer
  ]

  @mapping [
    timestamp: :integer,
    trade_count: :integer,
    high_r: {:map, @rational_mapping},
    low_r: {:map, @rational_mapping},
    open_r: {:map, @rational_mapping},
    close_r: {:map, @rational_mapping}
  ]

  @impl true
  def new(attrs, opts \\ [])

  def new(attrs, _opts) do
    %__MODULE__{}
    |> Mapping.build(attrs)
    |> Mapping.parse(@mapping)
  end
end