defmodule WalkscoreEx do
@moduledoc """
This is an Elixir client for the [WalkScore API](https://www.walkscore.com/professional/api.php).
Make sure you add `walkscore_ex` to your mix.exs and then run `mix deps.get`.
```elixir
def deps do
[
{:walkscore_ex, "~> 0.0.1"}
]
end
```
In order to use WalkscoreEx, you must register and receive an API key from WalkScore
and save that value in your config, eg:
```elixir
config :walkscore_ex, walkscore_api_key: "YOUR_API_KEY_FROM_WALKSCORE"
```
"""
@base_walkscore_api_url "https://api.walkscore.com/score?format=json"
@walk_api_key Application.get_env(:walkscore_ex, :walkscore_api_key)
@doc """
This method accepts the string parameters latitude, longitude, and address.
It makes an API call to the WalkScore API and returns a decoded JSON response.
## Examples
```elixir
# params
latitude = "38.897675"
longitude = "-77.036547"
address = "1600 Pennsylvania Avenue NW, Washington, DC, USA"
# API call
response = WalkscoreEx.get_score(latitude, longitude, address)
# value of `response`
%{
"description" => "Very Walkable",
"help_link" => "https://www.redfin.com/how-walk-score-works",
"logo_url" => "https://cdn.walk.sc/images/api-logo.png",
"more_info_icon" => "https://cdn.walk.sc/images/api-more-info.gif",
"more_info_link" => "https://www.redfin.com/how-walk-score-works",
"snapped_lat" => 38.898,
"snapped_lon" => -77.037,
"status" => 1,
"updated" => "2023-02-13 03:39:18.898986",
"walkscore" => 83,
"ws_link" => "https://www.walkscore.com/score/1600-Pennsylvania-Avenue-NW-Washington-DC-USA/lat=38.897675/lng=-77.036547"
}
```
"""
def get_score(latitude, longitude, address) do
walkscore_url = format_url(latitude, longitude, address, @walk_api_key)
HTTPoison.start()
response = HTTPoison.get!(walkscore_url)
Poison.decode!(response.body)
end
def format_url(lat, lon, address, api_key) do
URI.encode(
"#{@base_walkscore_api_url}&wsapikey=#{api_key}&address=#{address}&lat=#{lat}&lon=#{lon}"
)
end
end