Basic exhaustiveness checking of unions in Elixir
APACHE-2.0 License
Simple exhaustiveness checking of tuple + atom based unions.
defmodule MyType do
require Total
# define a union
Total.defunion(method() :: :get | :post | {:other, term()})
end
defmodule Elsewhere do
require MyType
# This is OK, all variants are covered
def method_string(m) do
MyType.method_case m do
:get -> "GET"
:post -> "POST"
{:other, t} -> t
end
end
# This is a compile time error: missing `{:other, term()}`
def method_string(m) do
MyType.method_case m do
:get -> "GET"
:post -> "POST"
end
end
end
The exhaustiness checking is very basic: bare atoms are checked and tuples have their tag and length checked, but their arguments are unchecked.
All other terms and guard clauses are ignored.
def deps do
[
{:total, "~> 0.1.0"}
]
end