I’m using Dialyzer to check over some code that uses the mongodb package. I’ve got a function that abstracts the Mongo.insert_one/4
function and adds in some extra logging for certain conditions:
def insert(collection, args) do
case Mongo.insert_one(mongo_pid(), collection, args) do
{:ok, %Mongo.InsertOneResult{acknowledged: true, inserted_id: id}} ->
{:ok, %{"_id" => id}}
# Check for 11000 error (usually this means a duplicate)
{:error, %Mongo.WriteError{write_errors: [%{"code" => 11_000} | _]} = err} -> {:error, "Duplicate entry"}
{:error, err} -> {:error, err}
end
end
When I run dialyzer, I get the following error:
The pattern can never match the type.
Pattern:
{:error, _err = %Mongo.WriteError{:write_errors => [%{<<99, 111, 100, 101>> => 11000} | _]}}
Type:
:ok
| {:error,
%Mongo.Error{
:__exception__ => _,
:code => number(),
:host => binary(),
:message => binary()
}}
| {:ok,
%Mongo.InsertOneResult{
:acknowledged => false,
:inserted_id => nil | %BSON.ObjectId{:value => <<_::96>>}
}}
After looking at the mongodb source code I can see that it appears to miss a viable return type:
@type result(t) :: :ok | {:ok, t} | {:error, Mongo.Error.t()}
should be (I think) something like:
@type result(t) :: :ok | {:ok, t} | {:error, Mongo.Error.t()} | {:error, Mongo.WriteError.t()}
My questions are:
- Am I correct in thinking that the dialyzer error in my app is resulting from what appears to be an incorrect type definition in a dependency (
mongodb
in this case)? - Apart from filing an issue, what are the ways to configure dialyzer to ignore that particular error in that specific place?
- Why doesn’t Dialyzer catch this problem in
mongodb
? I cloned the repo, I fired up Dialyzer, and it shows no errors. Is that expected? Common?