# trot
Trot is an Elixir web micro-framework based on Plug and Cowboy. The goal of Trot is to make common patterns in Plug easier to use, particularly when writing APIs, without sacrificing flexibility.
## Routes
Routes are specified using one of the HTTP method macros: `get/2`, `post/2`, `put/2`, `patch/2`, `delete/2`, `options/2`. The first argument is a the path to route to, and the second argument is the block of code to execute. Examples are below.
If `@path_root` is specified, it will be prefixed to all routes in that module.
### Responses
All of the following are valid return values from handlers and will be parsed into full HTTP responses:
- String of response body
- Status code, either numeric or an atom from `Plug.Conn.Status`
- `{code, body}`
- JSONable object
- `{code, object}`
- `{:redirect, location}`
- `%Plug.Conn{}`
## Templates
Some conviences are provided for using EEx, the default templating engine include with Elixir. When the application is compiled all of templates under a given path are loaded and compiled for faster rendering. A `render/2` function is generated for every template under the module attribute `@template_root`. By default, `@template_root` is "templates/".
### Example app using templates
defmodule PiedPiper do
use Trot.Router
use Trot.Template
@template_root "templates/root"
get "/compression" do
render("compression_results.html.eex", [weissman_score: 5.2])
end
end
### Example router application
defmodule SoLoMoApp.Router do
use Trot.Router
# Sets status code to 200 with an empty body
get "/" do
200
end
# Returns an empty body with a status code of 404
get "/bad" do
:bad_request
end
# Sets the status code to 200 with a text body
get "/text" do
"Thank you for your question."
end
# Sets the status code to 201 with a text body
get "/text/body" do
{201, "Thank you for your question."}
end
# Sets status code to 200 with a JSON-encoded body
get "/json" do
%{"hyper" => "social"}
end
# Sets the status code to 201 with a JSON-encoded body
get "/json/code" do
{201, %{"hyper" => "social"}}
end
# Set the response manually as when using Plug directly
get "/conn" do
send_resp(conn, 200, "optimal tip-to-tip efficiency")
end
# Pattern match part of the path into a variable
get "/presenter/:name" do
"The presenter is #{name}"
end
# Redirect the incoming request
get "/redirect" do
{:redirect, "/text/body"}
end
end