Jason codifica binário para UUID no Elixir
Sep 22 2020
Estou tentando pensar em uma maneira limpa de substituir o codificador Jason por binário que me permitiria extrair UUIDs do binário. Aqui está o que eu gostaria de fazer em teoria:
defimpl Jason.Encoder, for: BitString do
def encode(binary, opts) when is_binary(binary) do
with false <- String.valid?(binary),
{:ok, uid} <- Ecto.UUID.cast(binary) do
uid
else
_ -> Jason.Encode.string(binary, opts)
end
end
def encode(bitstring, _opts) do
raise Protocol.UndefinedError,
protocol: @protocol,
value: bitstring,
description: "cannot encode a bitstring to JSON"
end
end
Estou pensando ao longo das linhas deste exemplo stackoverflow, exceto que acho que o problema aqui é que tipos nativos como BitString não podem ser substituídos.
Respostas
4 AdamMillerchip Sep 22 2020 at 16:30
Em vez de tentar substituir globalmente o protocolo de BitString, você pode envolver um UUID em sua própria estrutura e implementar o Jason.Encoderprotocolo para essa estrutura:
defmodule JsonUUID do
defstruct [:uuid]
defimpl Jason.Encoder do
def encode(%JsonUUID{uuid: uuid}, opts) when is_binary(uuid) do
uuid
|> Ecto.UUID.cast!()
|> Jason.Encode.string(opts)
end
end
end
Teste:
Jason.encode!(%JsonUUID{uuid: Ecto.UUID.bingenerate()})
=> "\"8cbf3df9-8408-4ce3-ac44-980a0f7dc19b\""
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?