Implement Jason.Encoder on Postgrex.INET type

Hi, I have a usecase for retrieving Postgrex.INET structs from my repo (I will only be reading not writing), however no matter what I do, some error gets thrown

hachiware  | ** (Protocol.UndefinedError) protocol Jason.Encoder not implemented for type Postgrex.INET (a struct), Jason.Encoder protocol must always be explicitly implemented.
hachiware  |
hachiware  | If you own the struct, you can derive the implementation specifying which fields should be encoded to JSON:
hachiware  |
hachiware  |     @derive {Jason.Encoder, only: […]}
hachiware  |     defstruct …
hachiware  |
hachiware  | It is also possible to encode all fields, although this should be used carefully to avoid accidentally leaking private information when new fields are added:
hachiware  |
hachiware  |     @derive Jason.Encoder
hachiware  |     defstruct …
hachiware  |
hachiware  | Finally, if you don’t own the struct you want to encode to JSON, you may use Protocol.derive/3 placed outside of any module:
hachiware  |
hachiware  |     Protocol.derive(Jason.Encoder, NameOfTheStruct, only: […])
hachiware  |     Protocol.derive(Jason.Encoder, NameOfTheStruct)
hachiware  |
hachiware  |
hachiware  | Got value:
hachiware  |
hachiware  |     %Postgrex.INET{address: {0, 0, 0, 0}, netmask: 0}
hachiware  |
hachiware  |     (jason 1.4.4) lib/jason.ex:164: Jason.encode!/2
hachiware  |     (hachiware 0.1.0) lib/hachiware/sse/connection_implementation.ex:11: Hachiware.Sse.ConnectionImplementation.send/1
hachiware  |     (hachiware 0.1.0) lib/hachiware/poller/runner.ex:20: anonymous fn/5 in Hachiware.Poller.Runner.run/1
hachiware  |     (elixir 1.18.4) lib/agent/server.ex:23: Agent.Server.handle_call/3
hachiware  |     (stdlib 7.1) gen_server.erl:2470: :gen_server.try_handle_call/4
hachiware  |     (stdlib 7.1) gen_server.erl:2499: :gen_server.handle_msg/3
hachiware  |     (stdlib 7.1) proc_lib.erl:333: :proc_lib.init_p_do_apply/3

After trying the Protocol.derive recommendation, it now says that Jason.Encoder is not implemented for type Tuple, I’m wondering if anyone has also experienced this and if there is any workaround to get this to work

The issue there is that how you’re encoding it attempts to just encode each key and value. You should not use @derive, but fully implement the protocol for it with defimpl. Even better would be to make a custom type to wrap that, which casts it to a struct that you control, and implement the protocol for that struct.

Hey SFLR, thank you for pointing me in the right direction, here is the code I wrote to parse the Postgrex.INET struct for anyone else who may stumble across this thread

defimpl Jason.Encoder, for: Postgrex.INET do
  def encode(%Postgrex.INET{address: address, netmask: netmask}, opts) do
    Jason.Encode.map(%{address: Tuple.to_list(address), netmask: netmask}, opts)
  end
end