defmodule Stellar.Horizon.Effect do @moduledoc """ Represents a `Effect` resource from Horizon API. """ @behaviour Stellar.Horizon.Resource alias Stellar.Horizon.Mapping @type t :: %__MODULE__{ id: String.t(), paging_token: String.t(), account: String.t(), type: String.t(), type_i: non_neg_integer(), attributes: map(), created_at: DateTime.t() } defstruct [ :id, :paging_token, :account, :type, :type_i, :attributes, :created_at ] @mapping [ type_i: :integer, created_at: :date_time ] @impl true def new(attrs, opts \\ []) def new(attrs, _opts) do effect_attrs = map_effect_attrs(attrs) %__MODULE__{} |> Mapping.build(effect_attrs) |> Mapping.parse(@mapping) end @spec map_effect_attrs(attrs :: map()) :: map() defp map_effect_attrs(attrs) do effect_attrs = %__MODULE__{} |> Map.from_struct() |> Map.keys() |> (&Map.drop(attrs, &1 ++ [:_links])).() Map.put(attrs, :attributes, effect_attrs) end end