Closed mogeko closed 1 year ago
This problem can be solved by @fallback_to_any
.
defprotocol Bento.Encoder do
@type bencodable :: atom() | String.t() | integer() | map() | Enumerable.t()
@type t :: iodata()
@fallback_to_any true
@spec encode(bencodable) :: t | :error
def encode(value)
end
defimpl Bento.Encoder, for: Any do
def encode(_any), do: :error
end
Now, any type that does not meet expectations (e.g. Tuple, PID, Port...) will return :error
instead of reporting an error.
Or, as a better choice, we can raise an Bento.EncodeError
directly.
defimpl Bento.Encoder, for: Any do
def encode(_any), do: raise Bento.EncodeError
end
It can be rescued by Bento.encode/1
.
When
Bento.encode/1
encounters a Tuple, an error will be reported.