Packages
maru
0.7.0
0.14.0-pre.1
0.13.2
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
REST-like API micro-framework for elixir inspired by grape.
Current section
Files
Jump to
Current section
Files
lib/maru/plugs/router.ex
defmodule Maru.Plugs.Router do
alias Maru.Router.Resource
alias Plug.Conn
def init(opts) do
router = opts |> Keyword.fetch! :router
'Elixir.' ++ _ = Atom.to_char_list router
version = opts |> Keyword.fetch! :version
%Resource{path: path, param_context: param_context} = opts |> Keyword.get :resource, %Resource{}
{router, path, version, param_context}
end
def call(%Conn{private: %{maru_version: v1}}=conn_orig, {router, path, v2, param_context})
when is_nil(v2) or v1 == v2 do
%{ maru_resource_path: maru_resource_path,
maru_route_path: maru_route_path,
maru_param_context: maru_param_context
} = conn_orig.private
case Maru.Router.Path.lstrip(maru_resource_path, path) do
nil -> conn_orig
{:ok, rest} ->
conn_orig
|> Conn.put_private(:maru_resource_path, rest)
|> Conn.put_private(:maru_route_path, maru_route_path ++ path)
|> Conn.put_private(:maru_param_context, maru_param_context ++ param_context)
|> router.call([])
|> case do
%Conn{halted: true} = conn -> conn
%Conn{} -> conn_orig
end
end
end
def call(conn, _) do
conn
end
end