Current section
Files
Jump to
Current section
Files
lib/boldsign.ex
defmodule Boldsign do
@moduledoc """
BoldSign API Client.
This client is built on top of [Req](https://github.com/wojtekmach/req).
Following the "Small SDK" approach, `Boldsign.new/1` returns a `Req.Request`
struct that can be used with `Req`'s functions or passed to the resource
modules in this library.
"""
@doc """
Returns a new `Req.Request` pre-configured for BoldSign.
## Options
* `:api_key` - (Optional) Your BoldSign API key.
* `:access_token` - (Optional) Your BoldSign OAuth access token.
* `:region` - (Optional) `:us` (default), `:eu`, `:ca`, or `:au`.
* `:base_url` - (Optional) Override the base URL.
Remaining options are passed to `Req.new/1`.
"""
def new(opts \\ []) do
{api_key, opts} = Keyword.pop(opts, :api_key)
{access_token, opts} = Keyword.pop(opts, :access_token)
{region, opts} = Keyword.pop(opts, :region, :us)
{base_url, opts} = Keyword.pop(opts, :base_url, default_base_url(region))
if is_nil(api_key) and is_nil(access_token) do
raise ArgumentError, ":api_key or :access_token is required"
end
Req.new(base_url: base_url, headers: build_headers(api_key, access_token))
|> Req.merge(opts)
end
defp default_base_url(:us), do: "https://api.boldsign.com/v1"
defp default_base_url(:eu), do: "https://eu-api.boldsign.com/v1"
defp default_base_url(:ca), do: "https://ca-api.boldsign.com/v1"
defp default_base_url(:au), do: "https://au-api.boldsign.com/v1"
defp build_headers(api_key, access_token) do
[]
|> maybe_put_api_key(api_key)
|> maybe_put_access_token(access_token)
end
defp maybe_put_api_key(headers, nil), do: headers
defp maybe_put_api_key(headers, api_key), do: [{"X-API-KEY", api_key} | headers]
defp maybe_put_access_token(headers, nil), do: headers
defp maybe_put_access_token(headers, access_token), do: [{"Authorization", "Bearer #{access_token}"} | headers]
end