README.md

# openroad

A cowboy middleware, that is an OTP application, to make sending responses more convenient.

## Build

    $ rebar3 compile

## Usage

### Rebar Config

Add openroad to your rebar.config dependency list.

    {deps, [openroad]}.

Make sure the openroad application is started before using.

If you want to do templating you'll need to configure erlydtl.

    {erlydtl_opts,  [{doc_root, "src/views"}]}.

This tells erlydtl which directory your view templates are in.

You'll also have to configure the erlydtl rebar3_plugin to compile the views into erlang modules.

    {plugins, [
        {rebar3_erlydtl_plugin, ".*", {git, "https://github.com/tsloughter/rebar3_erlydtl_plugin.git", {branch, "master"}}}
    ]}.

    {provider_hooks, [
                      {pre, [{compile, {erlydtl, compile}}]}
                     ]}.

### Cowboy

openroad provides a single module to be used: openroad_response.

openroad_response is a cowboy middleware. Insert it at the end of the middleware list.

    start(_StartType, _StartArgs) ->
	    Dispatch = cowboy_router:compile([{'_', [{<<"/">>, hello_handler, #{}}]}]),
	    {ok, _} = cowboy:start_clear(my_http_listener,
		[{port, 8080}],
		#{env => #{dispatch => Dispatch},
		  middlewares => [cowboy_router,
				  cowboy_handler,
				  openroad_response]}
	    ),
	    openroad_example_sup:start_link().

### Handler

Then you can set up your handler like so:

    -module(hello_handler).
    -export([init/2]).

    init(Req, Env) ->
        {ok, Req#{resp => {text, <<"Hello, World!">>}}, Env}.

## Routes

openroad supports text, json, html, and template as responses.

### Text

This will automatically set the content-type header to "text/plain; charset=utf-8".

    {ok, Req#{resp => {text, <<"Hello, World!">>}}, Env}

### Json

This will automatically set the content-type header to "application/json; charset=utf-8".

    {ok, Req#{resp => {json, #{<<"hello">> => <<"world">>}}}, Env}.

### Html

This will automatically set the content-type header to "text/html; charset=utf-8".

Setup the views as instructed above, then simply use the view module name in the response.

    {ok, Req#{resp => {html, {hello_view_dtl, #{message => <<"Hello, World!">>}}}}, Env}.

If you want to build a composite view simply make a list of views.

    {ok, Req#{resp => {html, [{header_view_dtl, #{}},
                              {body_view_dtl, #{message => <<"Hello, World!">>}},
                              {footer_view_dtl, #{}}]}}, Env}.

### Template

openroad provides a way to do templating that isn't strictly html. In contrast to html responses,
generic template views do not automatically set the content-type header.

    {ok, Req#{resp => {template, {hello_view_dtl, #{message => <<"Hello, World!">>}, <<"text/xml">>}}}, Env}.

## Contributing

Send patches to:

    ~fancycade/public-inbox@lists.sr.ht

If you are new to email based git workflows please refer to this [tutorial](https://git-send-email.io/).

## License

Apache v2