Skip to main content

lib/treedx/auth.ex

defmodule TreeDxSdk.AuthProvider do
  @moduledoc false
  @callback get_token(term()) :: {:ok, String.t()} | {:error, term()}
end

defmodule TreeDxSdk.Auth do
  @moduledoc false

  def static_bearer_token_provider(token), do: {:static_bearer_token, token}

  def resolve_authorization_header(%TreeDxSdk.Config{auth_provider: provider})
      when not is_nil(provider) do
    with {:ok, token} <- resolve_provider(provider) do
      {:ok, {"Authorization", "Bearer #{token}"}}
    end
  end

  def resolve_authorization_header(%TreeDxSdk.Config{token: token}) when is_binary(token) do
    {:ok, {"Authorization", "Bearer #{token}"}}
  end

  def resolve_authorization_header(%TreeDxSdk.Config{}), do: {:ok, nil}

  defp resolve_provider({:static_bearer_token, token}), do: {:ok, token}
  defp resolve_provider({module, state}) when is_atom(module), do: module.get_token(state)
  defp resolve_provider(fun) when is_function(fun, 0), do: {:ok, fun.()}
  defp resolve_provider(fun) when is_function(fun, 1), do: fun.(:token)
end