helpThe type specification has too many types for the function

I am unable to understand the error thrown by dialyzer, I am sending a csv file for download to user on click

error by dialyzer
The type specification has too many types for the function.

Function:
ServiceProvider.Controllers.ReportsController.csv_data/2

Extra type:
binary()

Success typing:
[any()] | %Stream{:done => nil, :funs => nonempty_maybe_improper_list(), _ => _}

________________________________________________________________________________
done (warnings were emitted)
Halting VM with exit status 2


  @spec csv_data(past_days :: non_neg_integer(), team_id :: String.t()) :: iodata()
  def csv_data(past_days, team_id) when past_days > 0 and past_days <= 1000 do
  alias NimbleCSV.RFC4180, as: CSV
    
    Team
    |> Repo.get(team_id)
    |> TeamContext.list_accounts_for_export(past_days)
    |> Enum.map(
      &[
        name(&1),
        date_added(&1),
        ref(&1),
        account_ref(&1),
        date_of_enroll(&1),
        account_status_and_class(TeamContext.get_status(&1)).status,
        follow_up(&1),
        assigned_to(&1.team_user)
      ]
    )
    |> List.insert_at(0, @csv_file_headers)
    |> CSV.dump_to_iodata()
  end

I believe you just place the type names in the param spec rather than the variable names themselves.

so

csv_data(past_days :: non_neg_integer(), team_id :: String.t()) :: iodata()

would be

csv_data(non_neg_integer, String.t) :: iodata

I’ve looked at typespec guides, but have not used dialyzer heavily. Still, might be worth a try.

This, may be of assistance, it is the documentation of defining the spec for a function.

Ah apologies, this documentation does in fact show that you can type on the params directly.

It seems you’re sending a stream to that method, and so the dialyzer is telling you to use any() in the type spec for that param rather than string.