Popularity
9.6
Stable
Activity
0.0
Stable
1,312
39
80
Monthly Downloads: 1,550
Programming language: Elixir
License: BSD 3-clause "New" or "Revised" License
Tags:
REST And API
Latest version: v0.14.0-dev
maru alternatives and similar packages
Based on the "REST and API" category.
Alternatively, view maru alternatives based on common mentions on social networks and blogs.
-
Ash Framework
A declarative and extensible framework for building Elixir applications. -
detergentex
Elixir binding to Detergent erlang library used to call WSDL/SOAP Services
Elixir and Phoenix Application Security Platform
Replace Snyk, reCaptcha, and Cloudflare bot defense with the only application security platform built for Elixir and Phoenix.
Promo
paraxial.io
Do you think we are missing an alternative of maru or a related project?
Popular Comparisons
README
Maru
REST-like API micro-framework for elixir inspired by grape.
Installation
To get started with Maru, add the following to mix.exs
:
def deps() do
[
{:maru, "~> 0.14"},
{:plug_cowboy, "~> 2.0"},
# Optional dependency, you can also add your own json_library dependency
# and config with `config :maru, json_library, YOUR_JSON_LIBRARY`.
{:jason, "~> 1.1"}
]
end
Usage
lib/my_app/server.ex:
defmodule MyApp.Server do
use Maru.Server, otp_app: :my_app
end
defmodule Router.User do
use MyApp.Server
namespace :user do
route_param :id do
get do
json(conn, %{user: params[:id]})
end
desc "description"
params do
requires :age, type: Integer, values: 18..65
requires :gender, type: Atom, values: [:male, :female], default: :female
group :name, type: Map do
requires :first_name
requires :last_name
end
optional :intro, type: String, regexp: ~r/^[a-z]+$/
optional :avatar, type: File
optional :avatar_url, type: String
exactly_one_of [:avatar, :avatar_url]
end
# post do
# ...
# end
end
end
end
defmodule Router.Homepage do
use MyApp.Server
resources do
get do
json(conn, %{hello: :world})
end
mount Router.User
end
end
defmodule MyApp.API do
use MyApp.Server
before do
plug Plug.Logger
plug Plug.Static, at: "/static", from: "/my/static/path/"
end
plug Plug.Parsers,
pass: ["*/*"],
json_decoder: Jason,
parsers: [:urlencoded, :json, :multipart]
mount Router.Homepage
rescue_from Unauthorized, as: e do
IO.inspect(e)
conn
|> put_status(401)
|> text("Unauthorized")
end
rescue_from [MatchError, RuntimeError], with: :custom_error
rescue_from :all, as: e do
conn
|> put_status(Plug.Exception.status(e))
|> text("Server Error")
end
defp custom_error(conn, exception) do
conn
|> put_status(500)
|> text(exception.message)
end
end
In your Application
module, add Server
as a worker:
defmodule MyApp.Application do
use Application
def start(_type, _args) do
children = [
MyApp.Server
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
end
end
Then configure maru
:
# config/config.exs
config :my_app, MyApp.Server,
adapter: Plug.Cowboy,
plug: MyApp.API,
scheme: :http,
port: 8880
config :my_app,
maru_servers: [MyApp.Server]
Or let maru
works with confex
:
config :my_app, MyApp.Server,
adapter: Plug.Cowboy,
plug: MyApp.API,
scheme: :http,
port: {:system, "PORT"}
defmodule MyApp.Server do
use Maru.Server, otp_app: :my_app
def init(_type, opts) do
Confex.Resolver.resolve(opts)
end
end