Packages

A library to access ViaCEP api

Current section

Files

Jump to
viacepex lib viacepex.ex
Raw

lib/viacepex.ex

defmodule Viacepex do
@doc """
Get the cep from Viacep API
Typical error reasons are:
* `:incorrect_format` - the format is not valid, the correct format is "\d{8}"
"""
@spec get(String.t) :: {:ok, map | nil} | {:error, list}
def get(cep) when is_bitstring(cep) do
case Viacepex.Cep.validate(cep) do
:ok ->
{:ok, Viacepex.Cep.get(cep) |> one()}
errors ->
errors
end
end
def get(_) do
raise ArgumentError, message: "Only string is accepted"
end
defp one(%{"erro" => true}), do: nil
defp one(cep), do: cep
@doc """
Same as `get/1` but raises an error if cep is format is incorrect
"""
@spec get!(String.t) :: map | no_return
def get!(cep) do
case get(cep) do
{:ok, nil} ->
raise Viacepex.NoResultsError, message: "Expected a result but got none"
{:ok, cep} ->
cep
{:error, _} ->
raise ArgumentError, message: "Incorrect format!"
end
end
@doc """
Search for state, city, street in Viacep API
`state` must be a two letter string, a Brazil UF, or the result
will be empty. `city` and `street_name` must be at least three characters long.
"""
@spec search(String.t, String.t, String.t) :: {:ok, list} | {:error, list}
def search(state, city, street_name)
when is_bitstring(state) and is_bitstring(city) and is_bitstring(street_name) do
validation_result = Viacepex.Cep.validate_search(state, city, street_name)
cond do
Enum.count(validation_result) == 0 ->
{:ok, Viacepex.Cep.search(state, city, street_name)}
true ->
{:error, validation_result}
end
end
def search(_, _, _) do
raise ArgumentError, message: "All parameters must be String.t"
end
end