From ca265053691d6f7f84a662c4141036e1f03cd676 Mon Sep 17 00:00:00 2001 From: Nduati Kuria <012nkuria@gmail.com> Date: Mon, 14 Oct 2024 15:49:51 +0300 Subject: [PATCH] Support optional fields in EventFilter typespecs (#144) The current typespec generator emits a dialyzer warning when nil values are set for the indexed topics of an `EventFilter`: ```elixir The function call will not succeed. Ethers.Contracts.ERC20.EventFilters.transfer(nil, nil) breaks the contract (Ethers.Types.t_address(), Ethers.Types.t_address()) :: Ethers.EventFilter.t() ``` This can be fixed by making the arguments nullable for events. --- lib/ethers/contract_helpers.ex | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ethers/contract_helpers.ex b/lib/ethers/contract_helpers.ex index 4229991..f0770e6 100644 --- a/lib/ethers/contract_helpers.ex +++ b/lib/ethers/contract_helpers.ex @@ -219,7 +219,7 @@ defmodule Ethers.ContractHelpers do def generate_event_typespecs(selectors, arity) do Enum.map(selectors, &Enum.take(&1.types, arity)) - |> do_generate_typescpecs() + |> do_generate_typescpecs(true) end def generate_struct_typespecs(args, selector) do @@ -229,12 +229,13 @@ defmodule Ethers.ContractHelpers do {:%, [], [{:__MODULE__, [], Elixir}, {:%{}, [], Enum.zip(args, types)}]} end - defp do_generate_typescpecs(types) do + defp do_generate_typescpecs(types, optional? \\ false) do Enum.zip_with(types, & &1) |> Enum.map(fn type_group -> type_group |> Enum.map(&Ethers.Types.to_elixir_type/1) |> Enum.uniq() + |> then(&if(optional?, do: [nil | &1], else: &1)) |> Enum.reduce(fn type, acc -> quote do unquote(type) | unquote(acc)