lib/toolbox/message.ex

defmodule Toolbox.Message do
  @moduledoc """
  Altworx message runtime representation.
  """

  alias __MODULE__, as: Message

  @derive Jason.Encoder
  defstruct [:from, :type, :timestamp, :body, :origin]

  @type from :: atom | String.t()
  @type type :: atom | String.t()
  @type timestamp :: integer
  @type body :: term
  @type origin :: %{offset: non_neg_integer, topic: String.t()} | nil
  @type t :: %Message{
          from: from,
          type: type,
          timestamp: timestamp,
          body: body,
          origin: origin
        }

  @spec new(from, type, timestamp, body) :: t
  def new(from, type, timestamp, body) do
    %Message{from: from, type: type, timestamp: timestamp, body: body}
  end

  @spec from(t) :: from
  def from(%Message{from: from}), do: from

  @spec type(t) :: type
  def type(%Message{type: type}), do: type

  @spec timestamp(t) :: timestamp
  def timestamp(%Message{timestamp: ts}) when is_integer(ts), do: ts

  @spec body(t) :: body
  def body(%Message{body: body}), do: body
end