# `Infusion.Runtime.Form`
[🔗](https://github.com/mandar1045/infusion/blob/v0.1.0/runtime/lib/infusion/runtime/form.ex#L1)

Encodes nested data as `application/x-www-form-urlencoded`, the way Stripe
and Twilio expect it.

    iex> Infusion.Runtime.Form.encode(%{"metadata" => %{"order" => "6735"}})
    "metadata%5Border%5D=6735"

Maps nest with brackets (`metadata[order]=6735`). Lists depend on `style`:

  * `:indexed` (Stripe): `items[0][price]=p_1&expand[0]=customer`
  * `:repeat` (OpenAPI's default, Twilio): `StatusCallbackEvent=a&StatusCallbackEvent=b`

`nil` values are left out, so an optional parameter that was not given is
not sent.

# `encode`

```elixir
@spec encode(map() | keyword(), :indexed | :repeat) :: String.t()
```

Encodes `data` (a map or keyword list) as a form body.

# `pairs`

```elixir
@spec pairs(map() | keyword(), :indexed | :repeat) :: [{String.t(), String.t()}]
```

Flattens `data` into `[{"key[nested]", "value"}]` pairs.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
