Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

lpil/total

Basic exhaustiveness checking of unions in Elixir

lpil/total.json
{
"createdAt": "2019-06-23T20:30:40Z",
"defaultBranch": "master",
"description": "Basic exhaustiveness checking of unions in Elixir",
"fullName": "lpil/total",
"homepage": "",
"language": "Elixir",
"name": "total",
"pushedAt": "2019-06-23T20:31:14Z",
"stargazersCount": 16,
"topics": [
"elixir-lang",
"exhaustiveness-checking",
"macros"
],
"updatedAt": "2023-11-10T18:14:07Z",
"url": "https://github.com/lpil/total"
}

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