README.md

# convert_http_query

[![Package Version](https://img.shields.io/hexpm/v/convert_http_query)](https://hex.pm/packages/convert_http_query)
[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/convert_http_query/)

**Encode and decode HTTP queries from/to Gleam types**

Easily convert your Gleam types to HTTP queries. This is particularly useful to have typed queries automatically encoded in your frontend and decoded in your backend.

## Installation

```sh
gleam add convert_http_query@1
```

## Usage

```gleam
import convert
import convert/http/query

pub type User {
  User(name: String, age: Int, children: List(String))
}

pub fn user_converter() {
  convert.object({
    use name <- convert.field("name", fn (v: User) { Ok(v.name) }, convert.string())
    use age <- convert.field("age", fn (v: User) { Ok(v.age) }, convert.int())
    use children <- convert.field("children", fn (v: User) { Ok(v.children) }, convert.list(convert.string()))

    convert.success(User(name:, age:, children:))
  })
}

pub fn main() {
  User("John", 42, ["Alice", "Bob"])
  |> query.encode(user_converter())
  // => [
  //  #("name", "John"),
  //  #("age", "42"),
  //  #("children.0", "Alice"),
  //  #("children.1", "Bob"),
  // ]

  [
    #("name", "Thomas"),
    #("age", "27"),
  ]
  |> query.decode(user_converter())
  // => User("Thomas", 27, [])
}
```

Further documentation can be found at <https://hexdocs.pm/convert_http_query>.

## Features

- Encode and decode HTTP queries from and to Gleam types
- Support for all Gleam primitive types
- Support for lists, results, optionals, dicts
- Allow decoding to objects and enums

## Limitations

Not all dict keys are supported. Currently, only primitive types such as Bool, Int, Float, String and BitArray.

## Development

```sh
gleam run   # Run the project
gleam test  # Run the tests
```