ExBuilder
Simple library to support Ruby style builder-like JSON and XML templates.
Templates should be placed into web/templates directory in the root of the project and have builder extension.
All templates will be compiled into functions and available via ExBuilder.View module.
Passing Parameters
Parameters, passed to the generated function as a keyword list, are available inside template via assign/1 macro.
For convenience, Eex style variables notation: @var_name, is supported and can be used inside templates in the same way assign(var_name) is used.
Following code samples produce identical outcome:
iex> name = assign(:name)
iex> property(:name, name)iex> property(:name, @name)Sample test cases:
iex> document do
iex> object(:sample, %{name: "Joe"})
iex> end
%{sample: %{name: "Joe"}}
iex> document do
iex> name = assign(:name)
iex> property(:name, name)
iex> end
%{sample: %{name: "Joe"}}
iex> document do
iex> object(:sample, %{name: "Joe"}) do
iex> object(:children) do
iex> object(:child, %{name: "Phil"})
iex> end
iex> end
iex> end
%{sample: %{name: "Joe", children: %{child: %{name: "Phil"}}}}
Using ExBuilder.View with simple Plug application
-
Place following code into template file in web/templates/sample.builder.
Note that Eex style variables @var_name is used inside templates in the same way
assign(var_name)is used
names = assign(:children)
object(:person) do
property :name, @name
object(:company, @company)
array(:children, names) do
%{name: item}
end
end-
Add use statement for
ExBuilder.View
defmodule MyApp.Api do
use Plug.Router
plug :match
plug :dispatch
use ExBuilder.View
get "/info.json" do
send_resp(conn, 200, render_json("sample", name: "John Smith", children: ["Jeff"], company: %{name: "Company Name"}))
end
get "/info.xml" do
send_resp(conn, 200, render_xml("sample", name: "John Smith", children: ["Jeff"], company: %{name: "Company Name"}))
end
end
Installation
From Hex, the package can be installed as:
-
Add
exbuilderto your list of dependencies inmix.exs:
def deps do
[{:exbuilder, "~> 0.1"}]
end