lib/wireguardex/peer_config_builder.ex

defmodule Wireguardex.PeerConfigBuilder do
  @moduledoc ~S"""
  This module contains functions to create a `PeerConfig`  which represents
  a peer's configuration of persistent attributes. They do not change over
  time and are part of the configuration of a device.

  To create the defualt config use `peer_config/0` then you can apply each
  function in this module to specify the config.

  ## Examples

      iex> { :ok, public_key } = Wireguardex.get_public_key(Wireguardex.generate_private_key())
      ...> res =
      ...> device_config()
      ...> |> peers([
      ...>      peer_config()
      ...>      |> Wireguardex.PeerConfigBuilder.public_key(public_key)
      ...>      |> endpoint("127.0.0.1:1234")
      ...>      |> preshared_key(Wireguardex.generate_preshared_key())
      ...>      |> persistent_keepalive_interval(60)
      ...>      |> allowed_ips(["127.0.0.1/16"])
      ...> ])
      ...> |> Wireguardex.set_device("wg12345")
      ...> Wireguardex.delete_device("wg12345")
      ...> res
      :ok
  """

  @doc """
  Creates the default peer configuration that you can then specify which each of
  the provided functions.
  """
  def peer_config() do
    %Wireguardex.PeerConfig{}
  end

  @doc """
  The public key of the peer.
  """
  def public_key(peer_config, public_key) do
    %{peer_config | public_key: public_key}
  end

  @doc """
  The preshared key available to both peers (`nil` means no PSK is used).
  """
  def preshared_key(peer_config, preshared_key) do
    %{peer_config | preshared_key: preshared_key}
  end

  @doc """
  The endpoint this peer listens for connections on (`nil` means any).
  """
  def endpoint(peer_config, endpoint) do
    %{peer_config | endpoint: endpoint}
  end

  @doc """
  The interval for sending keepalive packets (`nil` means disabled).
  """
  def persistent_keepalive_interval(peer_config, persistent_keepalive_interval) do
    %{peer_config | persistent_keepalive_interval: persistent_keepalive_interval}
  end

  @doc """
  The allowed ip addresses this peer is allowed to have.
  """
  def allowed_ips(peer_config, allowed_ips) do
    %{peer_config | allowed_ips: allowed_ips}
  end
end