Current section
Files
Jump to
Current section
Files
lib/finnhub.ex
defmodule Finnhub do
@moduledoc """
Finnhub client.
To use the client, you are require to have a `FINNHUB_API_KEY` configured.
"""
@finnhub_auth_header "X-Finnhub-Token"
@base_path "https://finnhub.io/api/v1"
@base_uri URI.parse(@base_path)
require Logger
@doc "Get symbol's quote"
@spec quote(String.t()) :: {:ok, Finnhub.Quote.t()} | {:error, any()}
def quote(symbol) do
url = url("quote", %{"symbol" => symbol})
with {:ok, %HTTPoison.Response{body: body, status_code: 200}} <-
HTTPoison.get(url, headers(), follow_redirect: true),
{:ok, json} <- Jason.decode(body) do
Logger.info("[#{__MODULE__}] [#{symbol}] Polled")
Starchoice.decode(json, Finnhub.Quote)
else
{:ok, %{status_code: status_code} = response} ->
Logger.error("[#{__MODULE__}] [#{symbol}] [#{status_code}] Error polling #{symbol}")
{:error, response}
{:error, error} ->
Logger.error("[#{__MODULE__}] [#{symbol}] #{inspect(error)}")
{:error, error}
end
end
defp headers do
[
{@finnhub_auth_header, api_key()},
{"Content-Type", "application/json"}
]
end
defp api_key do
Application.get_env(:snowhite, __MODULE__)[:api_key]
end
defp url(path, query) do
URI.to_string(%URI{
@base_uri
| path: Path.join(@base_uri.path, path),
query: URI.encode_query(query)
})
end
end