Current section
Files
Jump to
Current section
Files
lib/jiraffe.ex
defmodule Jiraffe do
@moduledoc """
Documentation for `Jiraffe`.
"""
use Tesla
@type auth_params() :: %{
basic:
%{email: String.t(), token: String.t()}
| %{username: String.t(), password: String.t()},
oauth2: %{access_token: String.t()},
personal_access_token: String.t(),
token: String.t()
}
@doc """
Reteruns a Tesla client with correct Base URL and Authorization headers
"""
@spec client(base_url :: String.t(), auth_params :: auth_params()) :: Tesla.Client.t()
def client(base_url, auth_params) do
Jiraffe.Client.new(base_url, auth_params)
end
@doc """
Streams pages of results from a Jira API endpoint
"""
@spec stream_pages(
get_page :: (Keyword.t() -> {:ok, map()} | {:error, any()}),
per_page :: non_neg_integer()
) :: Enum.t()
def stream_pages(get_page, per_page) do
Stream.resource(
fn -> 0 end,
fn
page_number when page_number < 0 ->
{:halt, page_number}
page_number ->
case get_page.(startAt: page_number * per_page, maxResults: per_page) do
{:ok, %{"isLast" => true} = page} -> {[page], -1}
{:ok, %{"isLast" => false} = page} -> {[page], page_number + 1}
_ -> {:halt, page_number}
end
end,
& &1
)
end
end