Jason codifica binario in UUID in Elixir
Sep 22 2020
Sto cercando di pensare a un modo pulito per sovrascrivere il Jason Encoder per binario che mi consenta di estrarre gli UUID dal binario. Ecco cosa vorrei fare in 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
Sto pensando sulla falsariga di questo esempio di stackoverflow, tranne che penso che il problema qui sia che i tipi nativi come BitString non possono essere sovrascritti.
Risposte
4 AdamMillerchip Sep 22 2020 at 16:30
Invece di provare a sovrascrivere globalmente il protocollo per BitString, puoi racchiudere un UUID nella sua struttura e implementare il Jason.Encoderprotocollo per quella struttura:
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
Test:
Jason.encode!(%JsonUUID{uuid: Ecto.UUID.bingenerate()})
=> "\"8cbf3df9-8408-4ce3-ac44-980a0f7dc19b\""