lib/cose_key.ex

defmodule WebAuthnLiveComponent.CoseKey do
  @moduledoc """
  Custom type for WebAuthn cose keys.
  """
  use Ecto.Type

  def type, do: :binary

  def cast(value) when is_map(value) do
    try do
      {:ok, CBOR.encode(value)}
    rescue
      Protocol.UndefinedError -> :error
    end
  end

  def cast(_), do: :error

  def load(data) when is_binary(data) do
    case CBOR.decode(data) do
      {:ok, cose_key, ""} ->
        {:ok, cose_key}

      _other ->
        :error
    end
  end

  def dump(value) when is_map(value) do
    {:ok, CBOR.encode(value)}
  end

  def dump(value), do: {:ok, value}
end