Current section
Files
Jump to
Current section
Files
lib/hex.ex
defmodule Wand.Hex do
@moduledoc false
alias HTTPoison.{Error, Response}
@http Wand.Interfaces.Http.impl()
@base "https://hex.pm/"
@headers [{"Accept", "application/json"}]
def releases(package) do
URI.parse(@base)
|> URI.merge("/api/packages/#{URI.encode(package)}")
|> @http.get(@headers)
|> parse_response
end
defp parse_response({:ok, %Response{status_code: 200, body: body}}) do
WandCore.Poison.decode(body)
|> parse_json
end
defp parse_response({:ok, %Response{status_code: 404}}) do
{:error, :not_found}
end
defp parse_response({:ok, %Response{}}), do: {:error, :bad_response}
defp parse_response({:error, %Error{}}), do: {:error, :no_connection}
defp parse_json({:ok, %{"releases" => releases}}) do
releases =
Enum.map(releases, &Map.get(&1, "version"))
|> Enum.reject(&(&1 == nil or Version.parse(&1) == :error))
case releases do
[] -> {:error, :not_found}
releases -> {:ok, releases}
end
end
defp parse_json(_), do: {:error, :bad_response}
end