AtomEnforcer

AtomEnforcer exists to solve a problem encountered in production code- preventing run-time errors for mismatched atoms between sends and receieves, especially in GenServer APIs and handle_((call|cast|info) function heads.

The strategy is to explicitly allow certain atoms to exist within a module, and then, at compile time, raise an error if an atom is used which has not been allowed.

Getting Started

  1. add {:atom_enforcer, "~> 0.1"}, to your mix.deps
  2. add use AtomEnforcer, allowed_atoms: <atoms you want to use> to a module
  3. find your atom typos at compile time now

API

The only API for AtomEnforcer is the __using__ macro and it's options:

Salient Example

#TODO: improve this example
defmodule SomeGenServer do
use GenServer
use AtomEnforcer, allowed_atoms: [:api_call_1]
def start_link([]) do
GenServer.start_link(__MODULE__, [], [name: __MODULE__])
end
def api_call_1(args) do
GenServer.call(__MODULE__, {:api_call_1, args})
end
def init([]), do: {:ok, []}
# The misspelling on the next line will cause a CompileError to be thrown
def handle_call({:ap_call_1, args}, _from, state) do
{:reply, args, state}
end
end

Closing Comments

Please drop me a note if you end up using AtomEnforcer in something cool, or file an issue if you have difficulty, bugs, or ideas for a better API.