lib/chainweb/p2p/peer_request_body.ex

defmodule Kadena.Chainweb.P2P.PeerRequestBody do
  @moduledoc """
  `PeerRequestBody` struct definition.
  """

  @behaviour Kadena.Chainweb.Type

  alias Kadena.Chainweb.Peer

  @type id :: String.t()
  @type address :: map()
  @type peer :: Peer.t()

  @type t :: %__MODULE__{
          address: address(),
          id: id()
        }
  defstruct [:id, :address]

  @impl true
  def new(%Peer{} = payload), do: build_peer_request_body(payload)
  def new(_payload), do: {:error, [payload: :not_a_peer]}

  @impl true
  def to_json!(%__MODULE__{
        id: id,
        address: address
      }),
      do:
        Jason.encode!(%{
          id: id,
          address: address
        })

  @spec build_peer_request_body(payload :: peer()) :: t()
  defp build_peer_request_body(%Peer{} = payload) do
    attrs = Map.from_struct(payload)
    struct(%__MODULE__{}, attrs)
  end
end