README.md

# ExLinkHeader

Parse or build HTTP Link headers in Elixir.

# Usage

```elixir
ExLinkHeader.parse!("<https://api.github.com/user/simonrand/repos?per_page=100&page=2>; rel=\"next\", <https://api.github.com/user/simonrand/repos?page=3&per_page=100>; rel=\"last\", <https://api.github.com/user/simonrand/repos?page=1&per_page=100>; rel=\"first\"")
#=> %ExLinkHeader{
 first: %ExLinkHeaderEntry{host: "api.github.com",
  path: "/user/simonrand/repos", params: %{page: "1", per_page: "100"},
  scheme: "https", attributes: %{},
  url: "https://api.github.com/user/simonrand/repos?page=1&per_page=100"},
 next: %ExLinkHeaderEntry{host: "api.github.com", path: "/user/simonrand/repos",
  params: %{page: "2", per_page: "100"}, scheme: "https", attributes: %{},
  url: "https://api.github.com/user/simonrand/repos?per_page=100&page=2"},
 last: %ExLinkHeaderEntry{host: "api.github.com", path: "/user/simonrand/repos",
  params: %{page: "3", per_page: "100"}, scheme: "https", attributes: %{},
  url: "https://api.github.com/user/simonrand/repos?page=3&per_page=100"},
 ...}

ExLinkHeader.parse!("")
#=> ** (ExLinkHeader.ParseError) Parse error: no valid links to parse
```

```elixir
%ExLinkHeader{
 first: %ExLinkHeaderEntry{host: "api.github.com",
  path: "/user/simonrand/repos", params: %{page: "1", per_page: "100"},
  scheme: "https", attributes: %{},
  url: "https://api.github.com/user/simonrand/repos?page=1&per_page=100"},
 next: %ExLinkHeaderEntry{host: "api.github.com", path: "/user/simonrand/repos",
  params: %{page: "2", per_page: "100"}, scheme: "https", attributes: %{},
  url: "https://api.github.com/user/simonrand/repos?per_page=100&page=2"},
 last: %ExLinkHeaderEntry{host: "api.github.com", path: "/user/simonrand/repos",
  params: %{page: "3", per_page: "100"}, scheme: "https", attributes: %{},
  url: "https://api.github.com/user/simonrand/repos?page=3&per_page=100"}} |> ExLinkHeader.build
#=> "<https://api.github.com//user/simonrand/repos?page=3&per_page=100>; rel=\"last\", <https://api.github.com//user/simonrand/repos?page=2&per_page=100>; rel=\"next\", <https://api.github.com//user/simonrand/repos?page=1&per_page=100>; rel=\"first\""
```

## Note a change to the `parse` method in v0.0.5

A `struct` is now returned for each link header as opposed to a map.

## Note a change in v0.0.4

Links with no `page` or `per_page` param previously returned `nil` by default for both these params, even if they did not exist - this is now no longer the case, `page` and `per_page` are now treated like any other query params. To return `nil` for these values you can supply defaults for any param when calling `parse` to ensure default values are returned, for example:

```
ExLinkHeader.parse!("<https://api.github.com/user/simonrand/repos?per_page=100>; rel=\"next\"", %{page: nil})
#=> %ExLinkHeader{next: %ExLinkHeaderEntry{attributes: %{}, host: "api.github.com",
  params: %{page: nil, per_page: "100"}, path: "/user/simonrand/repos",
  scheme: "https",
  url: "https://api.github.com/user/simonrand/repos?per_page=100"}}
```
_(Note: this is the struct based response for versions > 0.0.4)_

## Code Status

[![Build Status](https://travis-ci.org/simonrand/ex_link_header.svg?branch=master)](https://travis-ci.org/simonrand/ex_link_header)

## Installation

The package can be installed as:

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

        def deps do
          [{:ex_link_header, "~> 0.0.5"}]
        end

  2. Ensure ex_link_header is started before your application:

        def application do
          [applications: [:ex_link_header]]
        end

## License

Released under the Apache 2 License.

See [LICENSE](LICENSE) for more information.