defmodule GoogleCivicApi.Impl.Representatives do
@moduledoc """
Documentation for `GoogleCivicApi`.
"""
@doc """
Looks up political geography and representative information for a single address.
## Examples
iex> GoogleCivicApi.Impl.Representatives.byAddress()
[ %{
locations: [
%{
address: %{
city: "Baltimore",
line1: "111 North Calvert Street",
state: "MD"
}
}
],
name: "Marilyn Bentley",
party: "Democratic Party",
phones: ["(410) 333-3733"]
}]
"""
@type address ::
{city :: String.t(), line1 :: String.t(), state :: String.t(), zip :: String.t()}
@type official :: {
locations :: [address],
phones :: list(String.t()),
name :: String.t(),
party :: String.t()
}
@spec by_address(String.t()) :: [official]
def by_address(address) do
{:ok, %HTTPoison.Response{body: %{"officials" => officials}}} =
("representatives?" <> "address=#{URI.encode(address)}")
|> GoogleCivicApi.Impl.Base.get()
Enum.map(officials, fn x -> filter_(x) end)
end
defp filter_(%{"address" => a, "party" => party, "name" => n, "phones" => p}) do
%{
locations: Enum.map(a, fn x -> filter_address(x) end),
party: party,
name: n,
phones: p
}
end
defp filter_address(%{"city" => c, "line1" => l1, "state" => state, "zip" => _}) do
%{address: %{city: c, line1: l1, state: state}}
end
end