README.md

# 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:

```elixir
iex>   name = assign(:name)	
iex>   property(:name, name)
``` 

```elixir
iex>   property(:name, @name)
``` 

##### Sample test cases:

```elixir
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

1. 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

```elixir
	names = assign(:children)

	object(:person) do
	    property :name, @name 
	    object(:company, @company)
	    array(:children, names) do
	    	%{name: item}
	    end
	end
```

2. Add use statement for `ExBuilder.View`

```elixir
	
	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](https://hex.pm/packages/exbuilder), the package can be installed as:

  1. Add `exbuilder` to your list of dependencies in `mix.exs`:

    ```elixir
    def deps do
      [{:exbuilder, "~> 0.1"}]
    end
    ```