Acessor

Description

acessor is a library to make it easy to orchestrate multiple services while using Elixir processes.

Installation

the package can be installed by adding acessor to your list of dependencies in mix.exs:

def deps do
[
{:acessor, "~> 0.1.1"}
]
end

Run tests

mix test

Usage

defmodule MyModule do
use Acessor.Macros.Service
def hello(name) do
"Hello, " <> name
end
end
services = %{:mymodule => MyModule}
Acessor.config(services) # true
{:response, response} = Acessor.invoke(:mymodule, :hello, ["Bob"])
assert response == "Hello, Bob"

Use Cases

acessor is useful when you have multiple services in your ecosystem, and you need to invoke them all the time. This could eliminate code duplication where all services could be centralized inside a library/repo for example:

# this could be a new library/repo used across services
defmodule MyService1 do
def make_rest_request(_), do: :rest1
end
defmodule MyService2 do
def make_rest_request(_), do: :rest2
end
services = %{:service_1 => MyService1, :service_2 => MyService2}
Acessor.config(services)
Acessor.invoke(:service_1, :make_rest_request, []) # {:response, :rest1}
Acessor.invoke(:service_2, :make_rest_request, []) # {:response, :rest2}

Methods

config/1 - services (inside %{})

this method adds your services to the acessor, making it possible to invoke any methods after this initial setup.

invoke/3 - service_name, method, args (inside [])

this method uses GenServer to invoke your registered service, returning: {:response, response} or {:noresponse, nil}