Skip to main content

docs/getting-started/quick-start.md

# Quick Start

Get rendering in 5 minutes.

## Your First Template

The simplest Mau template is just plain text:

```elixir
{:ok, result} = Mau.render("Hello world", %{})
# result: "Hello world"
```

## Adding Variables

Use `{{ }}` to interpolate variables:

```elixir
template = "Hello {{ name }}!"
context = %{"name" => "Alice"}

{:ok, result} = Mau.render(template, context)
# result: "Hello Alice!"
```

## Accessing Properties

Access nested properties with dot notation:

```elixir
template = "{{ user.name }} is {{ user.age }} years old"
context = %{
  "user" => %{
    "name" => "Bob",
    "age" => 30
  }
}

{:ok, result} = Mau.render(template, context)
# result: "Bob is 30 years old"
```

## Using Filters

Transform values with filters using the pipe `|` syntax:

```elixir
template = "Welcome {{ user.name | capitalize }}!"
context = %{"user" => %{"name" => "alice"}}

{:ok, result} = Mau.render(template, context)
# result: "Welcome Alice!"
```

Chain multiple filters:

```elixir
template = "{{ message | strip | upper_case }}"
context = %{"message" => "  hello world  "}

{:ok, result} = Mau.render(template, context)
# result: "HELLO WORLD"
```

## Conditionals

Use `{% if %}` for conditional rendering:

```elixir
template = """
{% if user.active %}
  {{ user.name }} is active
{% endif %}
"""

context = %{"user" => %{"name" => "Charlie", "active" => true}}

{:ok, result} = Mau.render(template, context)
# result: "  Charlie is active\n"
```

Use `{% else %}` and `{% elsif %}`:

```elixir
template = """
{% if user.role == "admin" %}
  Admin Dashboard
{% elsif user.role == "user" %}
  User Dashboard
{% else %}
  Guest Area
{% endif %}
"""

context = %{"user" => %{"role" => "user"}}

{:ok, result} = Mau.render(template, context)
# result: "  User Dashboard\n"
```

## Loops

Iterate with `{% for %}`:

```elixir
template = """
<ul>
{% for item in items %}
  <li>{{ item.name }}</li>
{% endfor %}
</ul>
"""

context = %{
  "items" => [
    %{"name" => "Apple"},
    %{"name" => "Banana"},
    %{"name" => "Cherry"}
  ]
}

{:ok, result} = Mau.render(template, context)
```

Access loop information with `forloop`:

```elixir
template = """
{% for item in items %}
  {{ forloop.index }}: {{ item }}
{% endfor %}
"""

context = %{"items" => ["a", "b", "c"]}

{:ok, result} = Mau.render(template, context)
# result: "  1: a\n  2: b\n  3: c\n"
```

## Advanced: Map Directives

Transform nested maps with powerful directives:

```elixir
input = %{
  "users" => %{
    "#map" => [
      "{{$users}}",
      %{"name" => "{{$loop.item.name}}", "email" => "{{$loop.item.email}}"}
    ]
  }
}

context = %{
  "$users" => [
    %{"name" => "John", "email" => "john@example.com"},
    %{"name" => "Jane", "email" => "jane@example.com"}
  ]
}

{:ok, result} = Mau.render_map(input, context)
# result: %{
#   "users" => [
#     %{"name" => "John", "email" => "john@example.com"},
#     %{"name" => "Jane", "email" => "jane@example.com"}
#   ]
# }
```

## Common Operations

### Check Length of List

```elixir
template = "Items: {{ items | length }}"
context = %{"items" => [1, 2, 3]}

{:ok, result} = Mau.render(template, context)
# result: "Items: 3"
```

### Get First Item

```elixir
template = "First: {{ items | first }}"
context = %{"items" => ["a", "b", "c"]}

{:ok, result} = Mau.render(template, context)
# result: "First: a"
```

### Join List Items

```elixir
template = "Tags: {{ tags | join(', ') }}"
context = %{"tags" => ["elixir", "erlang", "otp"]}

{:ok, result} = Mau.render(template, context)
# result: "Tags: elixir, erlang, otp"
```

### Sort a List

```elixir
template = "{{ items | sort | join(', ') }}"
context = %{"items" => [3, 1, 2]}

{:ok, result} = Mau.render(template, context)
# result: "1, 2, 3"
```

## Next Steps

- [Basic Concepts](basic-concepts.md) - Learn core concepts
- [Your First Template](first-template.md) - Build a complete example
- [Template Language Reference](../reference/template-language.md) - Explore specific features
- [Email Templates Example](../examples/email-templates.md) - See real-world use cases

## Key Takeaways

✅ Use `{{ }}` for variables
✅ Use `{% %}` for control flow
✅ Chain filters with `|`
✅ Use `{{ }}` for arithmetic: `{{ 5 + 3 }}`
✅ Use `{{ }}` for comparisons: `{{ age > 18 }}`
✅ Filters transform data: `{{ text | upper_case }}`

You're ready to start using Mau! Try building a simple template and experiment with different features.