lib/outkit/client.ex

defmodule Outkit.Client do
  @moduledoc """
  This module encapsulates auth and config data for API requests.

  ## Example

      # Create a client with API credentials manually
      client = Outkit.Client.new(key: "my-key", secret: "my-secret", passphrase: "my-passphrase")

      # Create a client with an config options set
      client = Outkit.Client.new(opts: [return_response: true])

  """

  defstruct(
    key: nil,
    secret: nil,
    passphrase: nil,
    endpoint: "https://api.outkit.io/v1/",
    opts: []
  )

  def new(), do: %__MODULE__{}

  def new(endpoint: endpoint) do
    %__MODULE__{endpoint: format_endpoint(endpoint)}
  end

  def new(opts: opts) do
    %__MODULE__{opts: opts}
  end

  def new(endpoint: endpoint, opts: opts) do
    %__MODULE__{endpoint: format_endpoint(endpoint), opts: opts}
  end

  def new(key: k, secret: s, passphrase: p) do
    %__MODULE__{key: k, secret: s, passphrase: p}
  end

  def new(key: k, secret: s, passphrase: p, endpoint: endpoint) do
    %__MODULE__{key: k, secret: s, passphrase: p, endpoint: format_endpoint(endpoint)}
  end

  def new(key: k, secret: s, passphrase: p, opts: opts) do
    %__MODULE__{key: k, secret: s, passphrase: p, opts: opts}
  end

  def new(key: k, secret: s, passphrase: p, endpoint: endpoint, opts: opts) do
    %__MODULE__{key: k, secret: s, passphrase: p, endpoint: format_endpoint(endpoint), opts: opts}
  end

  defp format_endpoint(endpoint) do
    if String.ends_with?(endpoint, "/") do
      endpoint
    else
      endpoint <> "/"
    end
  end
end