OK Elixir

Efficient error handling in elixir pipelines. See Handling Errors in Elixir for a more detailed explanation

Documentation for OK is available on hexdoc


Available in Hex, the package can be installed as:

  1. Add ok to your list of dependencies in mix.exs:

    def deps do
      [{:ok, "~> 0.2.0"}]


The erlang convention for functions that can fail is to return a result tuple A result tuple is a two-tuple tagged either as a success(:ok) or a failure(:error).

The OK module works with result tuples by treating them as a result monad.

{:ok, value} | {:error, reason}

‘~>>’ Macro

This macro allows pipelining result tuples through a pipeline of functions. The ~>> macro is the is equivalent to bind/flat_map in other languages.

import OK, only: :macros

def get_employee_data(file, name) do
  {:ok, file}
  ~>> File.read
  ~>> Poison.decode
  ~>> Dict.fetch(name)

def handle_user_data({:ok, data}), do: IO.puts("Contact at #{data["email"]}")
def handle_user_data({:error, :enoent}), do: IO.puts("File not found")
def handle_user_data({:error, {:invalid, _}}), do: IO.puts("Invalid JSON")
def handle_user_data({:error, :key_not_found}), do: IO.puts("Could not find employee")

|> handle_user_data