defmodule Resend do
@moduledoc """
Documentation for `Resend`.
"""
@config_module Resend.Client
@type config() ::
list(
{:api_key, String.t()}
| {:base_url, String.t()}
| {:client, atom()}
)
@doc """
Returns a Resend client.
Accepts a keyword list of config opts, though if omitted then it will attempt to load
them from the application environment.
"""
@spec client() :: Resend.Client.t()
@spec client(config()) :: Resend.Client.t()
def client(config \\ config()) do
Resend.Client.new(config)
end
@doc """
Loads config values from the application environment.
Config options are as follows:
```ex
config :resend, Resend.Client
api_key: "re_1234567",
base_url: "https://api.resend.com",
client: Resend.Client.TeslaClient
```
The only required config option is `:api_key`. If you would like to replace the
HTTP client used by Resend, configure the `:client` option. By default, this library
uses [Tesla](https://github.com/elixir-tesla/tesla), but changing it is as easy as
defining your own client module. See the `Resend.Client` module docs for more info.
"""
@spec config() :: config()
def config() do
config =
Application.get_env(:resend, @config_module) ||
raise """
Missing client configuration for Resend.
Configure your Resend API key in one of your config files, for example:
config :resend, #{inspect(@config_module)}, api_key: "re_1234567"
"""
validate_config!(config)
end
@doc false
@spec validate_config!(Resend.config()) :: Resend.config() | no_return()
def validate_config!(config) do
api_key =
Keyword.get(config, :api_key) ||
raise "Missing required config key for #{@config_module}: :api_key"
String.starts_with?(api_key, "re_") ||
raise "Resend API key should start with 're_', please check your configuration"
config
end
end