[![ Version](](
[![Build Status](](
[![Coverage Status](](
[![Inline docs](](

[Classless Inter-Domain Routing](
(CIDR) utilities for [Elixir](

## Setup

To use this library, just add `:cidr` as a dependency to your `mix.exs` file:

defp deps do
    {:cidr, ">= 1.1.0"}

## Usage

Passing an IP address string into `CIDR.parse` returns a `%CIDR{}` struct.
It contains the first and the last address of the range as Erlang IP tuples,
the amount of hosts the range covers and the network mask.

iex(1)> cidr = "" |> CIDR.parse
%CIDR{first: {1, 2, 3, 0}, last: {1, 2, 3, 255}, hosts: 256, mask: 24}

You can query the struct for all of its fields:

iex(2)> cidr.first
{1, 2, 3, 0}
iex(3)> cidr.hosts

And use it to see if other IP addresses fall in the same range:

iex(4)> cidr |> CIDR.match!({1,2,3,100})
iex(5)> cidr |> CIDR.match!({1,2,4,1})

The `match!/2` function also supports IP strings:

iex(6)> cidr |> CIDR.match!("")
iex(7)> cidr |> CIDR.match!("")

Please note that `match!/2` throws an `ArgumentError` when you pass in a value
that does not represent a valid IP address or when you try to match an IPv4
address with an IPv6 range and vice-versa.
We also provide `match/2`, a non-throwing version that returns tagged tuples:

iex(8)> cidr |> CIDR.match("")
{:ok, true}
iex(9)> cidr |> CIDR.match("")
{:ok, false}
iex(10)> cidr |> CIDR.match("")
{:error, "Tuple is not a valid IP address."}

## Contribution

See [Collective Code Construction Contract (C4)](

## License

[Mozilla Public License 2.0](LICENSE)