[![Build Status](](
[![Coverage Status](](

# mapi
Turn your Elixir module into an HTTP microservice API

Supports HTTP/1.1 and HTTP/2. Very much a work in progress.

## Installation

1. Add `mapi` to your list of dependencies in `mix.exs`:

  def deps do
      {:mapi, "~> 0.3.0"}

2. Configure your endpoints in `config.exs`

  config :mapi, endpoints: [
    {YourModule, [port: 4002]}

## Usage

Set up an example server for the `String` module with JSON responses.

  # config.exs
  config :mapi, endpoints: [
    {String, [port: 4002, type: :json]}

Once configured, call your server as if you were calling the function.
Mapi supports both HTTP/1.1 and HTTP/2.

  $ curl localhost:4002/upcase?q1="testing"

URL params are applied to the function in alphabetical order without respect
to the parameter names themselves. Use parameter names such as `q1, q2, ...`.
Parameters are strings, but will be cast to integers, atoms, and booleans if
applicable. All other types are not yet supported.

Currently only `GET` requests are supported.

## Responses

Mapi currently supports the following response types:

  * Plaintext
  * JSON
  * Erlang ETF

Configure them with a `:type` option of either `:text`, `:json`, or `:etf`,
respectively. If not specified, Mapi will default to plaintext.

All valid requests give a response of `200` status. Invalid paths will
return `404`. Valid paths with an incorrect number of parameters will return
`400`, and all other errors will return `500`.

## Roadmap TODO

* Configurable support for HTTP methods other than `GET`
* Body parameter decoding (for non-GET requests)
* Configurable endpoint webserver
* Support for nested paths, custom routing, etc