Current section

Files

Jump to
snowhite lib sunrise_sunset.ex
Raw

lib/sunrise_sunset.ex

defmodule SunriseSunset do
require Logger
@type coord :: {float(), float()}
@spec get(coord(), Timex.Types.date()) :: {:ok, SunsetSunrise.Response.t()} | {:error, any()}
def get(coord, date) do
with {:ok, %{body: json}} <- call(path(coord, date)),
{:ok, %{"status" => "OK", "results" => results}} <- Jason.decode(json) do
{:ok, SunriseSunset.Response.decode(results)}
else
{:error, error} -> {:error, error}
{:ok, %{"status" => status}} -> {:error, status}
error -> {:error, error}
end
end
defp call(url) do
result = HTTPoison.get(url)
case result do
{:ok, %{status_code: status}} ->
Logger.info("[#{__MODULE__}] [#{status}] #{url}")
{:error, error} ->
Logger.warn("[#{__MODULE__}] failed: #{error}")
end
result
end
@base_url "https://api.sunrise-sunset.org/json"
defp path({lng, lat}, date) do
query = URI.encode_query(%{lng: lng, lat: lat, date: format_date(date), formatted: 0})
Enum.join([@base_url, query], "?")
end
defp format_date(date), do: Enum.join([date.year, date.month, date.day], "-")
end