Rail is a helper macros for "Railway oriented programming".
It helps you handle error cases at almost no cost with rail, >>>, and def macro.
If you are not comfortable with "Railway oriented programming", see Railway oriented programming
def deps do
[
{:rail, "~> 1.1.0"}
]
enduse Rail introduces new syntax left <- right,
- which bind
valueto left when right is{:ok, value}orvalue - or skips entire code block when right is
{:error, _}or:error.
defmodule Target do
use Rail
def div(num, denom) do
denom <- check_denom(denom)
num / denom
end
def check_denom(0) do
{:error, :div_by_zero}
end
def check_denom(n) do
# same with {:ok, n}
n
end
end
iex> Calc.div(10, 2)
5.0
iex> Calc.div(10, 0)
{:error, :div_by_zero}rail/1 is available inside other code blocks.
iex> rail do
... x <- {:ok, 1}
... y <- {:ok, 2}
...
... x + y
... end
3left >>> right is similar to |>, but
- applies right function only when left is
valueor{:ok, value}. - support both function and call expression, which makes it compatible with
|>.
iex> 1 >>> fn v -> Integer.to_string(v) end
"1"
iex> {:ok, 1} >>> fn v -> Integer.to_string(v) end
"1"
iex> {:ok, 1} >>> Integer.to_string()
"1"
iex> {:error, :div_by_zero} >>> Integer.to_string()
{:error, :div_by_zero}For more examples, see Rail