lib/eventize/serialization/jason_serializer.ex

defmodule Eventize.Serialization.JasonSerializer do
  @moduledoc """
  A serializer that uses the Jason library.
  """

  @behaviour Eventize.Serialization.Serializer

  @spec serialize(map) :: {:error, any} | {:ok, binary()}
  def serialize(input) do
    try do
      {:ok, Jason.encode!(input)}
    rescue
      err -> {:error, err}
    end
  end

  @spec deserialize(
          binary(),
          atom | nil
        ) :: {:error, any} | {:ok, map}
  def deserialize(input, type \\ nil) do
    try do
      result =
        Jason.decode!(input, keys: :atoms)
        |> to_struct(type)

      {:ok, result}
    rescue
      err -> {:error, err}
    end
  end

  defp to_struct(data, nil), do: data
  defp to_struct(data, struct), do: struct(struct, data)
end