Diin

Master Hex.pm Version

Diin is a simple convenience wrapper for directly injecting dependencies into Elixir functions.

Installation

Add diin to your list of dependencies in mix.exs:

def deps do
  [
    {:diin, "~> 0.1.0"}
  ]
end

Usage

def get_object(id, opts \\ []) do
  # Define the default dependencies this function uses to do it's work
  deps = Diin.parse(opts, %{http: HTTPoison})
  # Use dependencies to do work
  deps.http_module.get!("https://foo.bar/#{id}")
end

# Now you can easily change dependencies when calling the function
get_object(1, deps: %{http: TestHTTPClient})

Things get more interesting when you pass dependencies to nested functions.

def nested_do_work(raw, opts \\ []) do
  # Set the default HTML parser function
  deps = Diin.parse(opts, %{
    html_parser: &MochiWeb.parse/1,
    transformer: fn val -> val end,
  })
  # Do the deed
  raw
  |> deps.html_parser.()
  |> deps.transformer.()
end

def do_work(raw, opts \\ []) do
  # Change some dependencies
  opts =
    [deps: %{transformer: &do_transformation/1}] ++ opts
  # Now, `nested_do_work` will use the transformer function passed above instead of the default one.
  nested_do_work(raw, opts)
end

# Passing in a different dependency for `html_parser` still works!
do_work(raw, deps: %{html_parser: &Html5Ever.parse/1})