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.2"}
  ]
end

Run tests

  mix test

Usage

  defmodule MyModule do
    use Acessor.Macros.Service # using the macro registers the service and enables logger

    def hello(name) do
      "Hello, " <> name
    end
  end

  defmodule MyModule2 do
    use Acessor.Macros.Service # using the macro registers the service and enables logger

    def bye(name, age) do
      "Hello, " <> name " with age " <> age
    end
  end

  services = %{:mymodule => MyModule, :byemodule => MyModule2}

  Acessor.config(services) # true

  Acessor.docs() # %{mymodule => [hello: 0], byemodule => [bye: 2]}
  # [info]  Module: mymodule - Functions: [hello: 0]
  # [info]  Module: byemodule - Functions: [bye: 2]
  
  {: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.docs() # get access of the registered services docs

  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.

docs/0 this method logs and returns all registerd services methods + arity inside a map

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

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