Packages

The library that allows you to swap dependencies in your app. Also it allows you to inject dependencies with function decorator.

Current section

Files

Jump to
swap README.md
Raw

README.md

# Swap

The library that allows you to swap dependencies in your app.
Also it allows you to inject dependencies with function decorator.

[CHANGELOG](https://github.com/madeinussr/exop/blob/master/CHANGELOG.md)

_Special thanks to [llxff](https://github.com/llxff) for great advices!_

## Installation

```elixir
def deps do
  [{:swap, "~> 1.0.0"}]
end
```

## Usage

### Global swap

You can define a global swap of modules with `Swap.Container` (placed, for example in /lib directory):

```elixir
defmodule Container do
  use Swap.Container

  swap SomeDependency, TestImplementation, env: :test
  swap SomeDependency, DevImplementation, env: :dev

  swap AnotherDependency, AnotherImplementation, env: [:dev, :test]
end
```

In this example the first argument module will be replaced with the second argument module in certain environment.
You can define multiple implementations per dependency, as well as multiple environments for a swap.

### Swap for a function

In the example below I show how to swap modules for a certain function:

```elixir
defmodule Dependency do
  def run, do: "dependency"
end  

defmodule Implementation do
  def run, do: "implementation"
end

defmodule Test do
  use Swap

  @decorate swap({Dependency, Implementation})
  def call, do: Dependency.run()

  def call2, do: Dependency.run()
end
```

Here `call/0` function returns `"implementation"` and `call2/0` returns `"dependency"`.

### Swap for a peace of code

Moreover you can swap modules for some peace of code. Just wrap that code into `swap do` block:

```elixir
defmodule Test do
  use Swap

  def call do
    swap Dependency, Implementation do
      Dependency.run()
    end
  end

  def call2, do: Dependency.run()
end
```

In this example results of `call/1` and `call2/1` invokation will be the same as in the example above.

## LICENSE

    Copyright © 2017 Andrey Chernykh ( andrei.chernykh@gmail.com )

    This work is free. You can redistribute it and/or modify it under the
    terms of the MIT License. See the LICENSE file for more details.