Current section
Files
Jump to
Current section
Files
lib/open_street_map/http.ex
defmodule OpenStreetMap.Http do
use HTTPoison.Base
def request(:get, url, params) do
case get(url, [],
params: params,
timeout: 15_000,
recv_timeout: 15_000
) do
{:ok, %HTTPoison.Response{body: body}} ->
body
{:error, error} ->
raise "OpenStreetMap.HttpClient error: #{error}"
end
end
def request(:delete, url, params) do
case delete(url, [],
params: params,
timeout: 15_000,
recv_timeout: 15_000
) do
{:ok, %HTTPoison.Response{body: body}} ->
body
{:error, error} ->
raise "OpenStreetMap.HttpClient error: #{error}"
end
end
def request(:post, url, body_params, query_params) do
case post(
url,
Poison.encode!(body_params),
["Content-Type": "application/json"],
params: query_params,
timeout: 15_000,
recv_timeout: 15_000
) do
{:ok, %HTTPoison.Response{body: body}} ->
body
{:error, error} ->
raise "OpenStreetMap.HttpClient error: #{error}"
end
end
def process_request_url(url) do
"https://nominatim.openstreetmap.org/" <> url
end
def process_response_body(body) do
body
|> Poison.decode!()
|> atomize_keys()
|> case do
%{error: _} = r -> {:error, r}
data -> {:ok, data}
end
end
#######################################################
### Atomize Keys
#######################################################
@doc """
Convert map string keys to :atom keys
"""
defp atomize_keys(nil), do: nil
defp atomize_keys(%{__struct__: _} = struct) do
struct
end
defp atomize_keys(%{} = map) do
map
|> Enum.map(fn {k, v} -> {to_atom(k), atomize_keys(v)} end)
|> Enum.into(%{})
end
defp atomize_keys([head | rest]) do
[atomize_keys(head) | atomize_keys(rest)]
end
defp atomize_keys(not_a_map), do: not_a_map
defp to_atom(str) when is_bitstring(str), do: String.to_atom(str)
defp to_atom(str) when is_atom(str), do: str
end