irahardianto / elixir-idioms
Elixir and OTP idioms: pattern matching, `with` pipelines, GenServer and supervision tree architecture, fault-tolerant concurrency, and ExUnit testing. Use when developing, refactoring, or reviewing Elixir and Phoenix applications or OTP systems.
Elixir Idioms and Patterns
Elixir rewards immutability, pattern matching, and the OTP supervision model. Idiomatic Elixir = functional, fault-tolerant, process-oriented.
Scope: Elixir coding idioms. Test naming: .agents/rules/testing-strategy.md.
Pattern Matching
Pattern match everything — function heads, case, with:
`elixir
def handle_result({:ok, task}), do: {:reply, task}
def handleresult({:error, :notfound}), do: {:error, 404}
def handle_result({:error, reason}), do: {:error, 500, reason}`withfor happy-path pipelines:`elixir
with {:ok, user} <- fetchuser(userid),
{:ok, task} <- create_task(user, params),
:ok <- notify(user, task) do
{:ok, task}
end`
OTP and Supervision
GenServer for stateful processes:
`elixir
defmodule TaskCache do
use GenServerdef startlink(opts), do: GenServer.startlink(MODULE, %{}, opts)
def get(pid, id), do: GenServer.call(pid, {:get, id})@impl true
def handlecall({:get, id}, from, state) do
{:reply, Map.get(state, id), state}
end
end`- Supervision trees — "let it crash" philosophy. Supervisors restart failed children.
- Never
try/catchin normal flow — let processes crash and restart cleanly.
Pipe Operator
|>for data transformation pipelines:`elixir
tasks
|> Enum.filter(&(&1.active))
|> Enum.sort_by(& &1.priority, :desc)
|> Enum.map(&TaskView.render/1)`- First argument must be the piped value. Design APIs pipe-friendly.
Naming
- snake_case for functions, variables, atoms, module attributes.
- PascalCase for module names.
?suffix for boolean functions:active?/1.!suffix for functions that raise:get!/1(vsget/1returning{:ok, _}).
Testing
ExUnit:
`elixir
defmodule TaskServiceTest do
use ExUnit.Case, async: truetest "creates task with valid params" do
{:ok, task} = TaskService.create(%{title: "Test", priority: :high})
assert task.title == "Test"
end
end`- Mox for mock-based testing (behaviour contracts).
Formatting and Static Analysis
| Tool | Purpose | Command |
|---|---|---|
mix format | Formatting | mix format |
| Credo | Linting | mix credo --strict |
| Dialyzer | Type checking | mix dialyzer |
mix deps.audit | CVE scanning | mix deps.audit |
Related
- Code Idioms and Conventions .agents/rules/code-idioms-and-conventions.md
- Error Handling Principles .agents/rules/error-handling-principles.md
- Testing Strategy .agents/rules/testing-strategy.md
- Concurrency and Threading Principles @.agents/rules/concurrency-and-threading-principles.md