lib/vintage_net/interface_renamer.ex

defmodule VintageNet.InterfaceRenamer do
  @moduledoc """
  Wrapper around the `ip` command for renaming interfaces
  """

  @callback rename_interface(VintageNet.ifname(), VintageNet.ifname()) ::
              :ok | {:error, String.t()}

  @doc "Renames an interface"
  @spec rename(VintageNet.ifname(), VintageNet.ifname()) :: :ok | {:error, String.t()}
  def rename(ifname, rename_to) do
    renamer().rename_interface(ifname, rename_to)
  end

  defp renamer() do
    case Application.get_env(:vintage_net, :interface_renamer) do
      nil -> VintageNet.InterfaceRenamer.IP
      module when is_atom(module) -> module
    end
  end
end