lib/workbench_web/views/order_transition_view.ex

defmodule WorkbenchWeb.OrderTransitionView do
  use WorkbenchWeb, :view

  def render("show.html", assigns) do
    transition = assigns.transition
    %transition_type{} = assigns.transition
    attrs = Map.from_struct(transition)

    ~H"""
    <%= Enum.map(attrs, fn {k, v} -> %>
      <div>
        <dt class="font-bold"><%= k %>:</dt>
        <dd><%= render_value(v, transition_type, k, assigns) %></dd>
      </div>
    <% end) %>
    """
  end

  defp render_value(trace, _transition_type, :stacktrace, assigns) do
    ~H"""
    <ul>
      <%= Enum.map trace, fn entry -> %>
        <li><%= entry |> Exception.format_stacktrace_entry() %></li>
      <% end %>
    </ul>
    """
  end

  defp render_value(%Decimal{} = value, _transition_type, _attr_name, _assigns) do
    value |> Decimal.to_string(:normal)
  end

  defp render_value(%DateTime{} = value, _transition_type, _attr_name, assigns) do
    ~H"""
    <span title={value}>
      <%= value |> Timex.from_now() %>
    </span>
    """
  end

  defp render_value(value, _transition_type, _attr_name, _assigns) when is_bitstring(value) do
    value
  end

  defp render_value(value, _transition_type, _attr_name, _assigns) do
    value |> inspect
  end
end