maru

Elixir RESTful Framework

  • Owner: elixir-maru/maru
  • Platform:
  • License:: BSD 3-Clause "New" or "Revised" License
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

Maru

REST-like API micro-framework for elixir inspired by grape.

Build Status
Hex.pm Version
Docs
Hex.pm Downloads

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

For more information, check out Guides and Examples

Main metrics

Overview
Name With Ownerelixir-maru/maru
Primary LanguageElixir
Program languageElixir (Language Count: 1)
Platform
License:BSD 3-Clause "New" or "Revised" License
所有者活动
Created At2014-12-31 07:07:57
Pushed At2019-09-13 14:08:13
Last Commit At2019-07-23 00:24:53
Release Count60
Last Release Namev0.13.2 (Posted on )
First Release Namev0.1.0 (Posted on )
用户参与
Stargazers Count1.3k
Watchers Count36
Fork Count87
Commits Count494
Has Issues Enabled
Issues Count81
Issue Open Count15
Pull Requests Count40
Pull Requests Open Count3
Pull Requests Close Count5
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private