README.md

# fun_pipelinex  [![Hex Version](https://img.shields.io/hexpm/v/fun_pipelinex.svg)](https://hex.pm/packages/fun_pipelinex) [![docs](https://img.shields.io/badge/docs-hexpm-blue.svg)](https://hexdocs.pm/fun_pipelinex/)
fun_pipelinex is a package which filter function's args and return value by your custom Filters.
## Installation
Add fun_pipelinex to your list of dependencies in `mix.exs`:
```elixir
def deps do
  [{:fun_pipelinex, "~> 1.0.0"}]
end
```
Maybe you need to execute `export HEX_MIRROR="https://repo.hex.pm"` first.
Then run `mix deps.get`.
## Chain of Responsibility Pattern Implementation
## Usage
```elixir
defmodule API do
  use FunPipelinex
  
  # Define pipelines
  # Filters are ordered.
  pipeline :biz_in do
    filter(ArgsChecker)
    filter(HMacChecker)
  end

  pipeline :approve_permission do
    filter(:has_approve_permission)
  end

  pipeline :biz_out do
    filter(:fmt_resp)
  end

  # use pipe_through to wrap function
  # composite pipelines are allowed, pipelines are ordered too.
  pipe_through in: [:biz_in, :approve_permission], out: :biz_out do
    def approve(user, id, operation, reason) do
      {user, id, operation, reason}
    end
  end

  # implements filters in current module.
  def has_approve_permission(args) do
    user = Keyword.get(args, :user)
    if user == :sysadmin do
      # if success, must be {:ok, something} format.
      {:ok, args}
    else
      # if not match {:ok, something} format, it will stop and return.
      {:error, :no_permission}
    end
  end

  def fmt_resp(resp) do
    {:ok, resp}
  end
end

# Implements filters in independent module.
defmodule ArgsChecker do
  def call(args) do
    # if you change args, it doesn't matter, passing it to next filter.
    {:ok, args}
  end
end

defmodule HMacChecker do
  def call(args) do
    {:ok, args}
  end
end
```
## Contributing
Contributions to fun_pipelinex are very welcome!

Bug reports, documentation, spelling corrections... all of those (and probably more) are much appreciated contributions!