Skip to content

c-rack/cidr-elixir

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

147 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CIDR

Downloads Hex.pm 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"}
  ]
end

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 = "1.2.3.4/24" |> 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
256

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

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

The match!/2 function also supports IP strings:

iex(6)> cidr |> CIDR.match!("1.2.3.100")
true
iex(7)> cidr |> CIDR.match!("1.2.4.1")
false

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("1.2.3.100")
{:ok, true}
iex(9)> cidr |> CIDR.match("1.2.4.1")
{:ok, false}
iex(10)> cidr |> CIDR.match("1.2.3.1000")
{:error, "Tuple is not a valid IP address."}

IPv4 deaggregation works as well. It returns a list of the largest possible networks for an IPv4 range in the format of $first_ip-$last_ip:

iex(1)> CIDR.parse_range("192.168.1.0-192.168.2.0")
[
  %CIDR{first: {192, 168, 1, 0}, hosts: 256, last: {192, 168, 1, 255}, mask: 24},
  %CIDR{first: {192, 168, 2, 0}, hosts: 1, last: {192, 168, 2, 0}, mask: 32}
]

Contribution

See Collective Code Construction Contract (C4)

License

Mozilla Public License 2.0

About

Classless Inter-Domain Routing (CIDR) for Elixir

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 9

Languages