lib/docker_api/endpoints/network.ex

defmodule DockerAPI.Endpoints.Network do
  use DockerAPI.Base, "/networks"

  alias DockerAPI.{Connection, Error}

  @moduledoc since: "0.4.0"
  @moduledoc """
  Networks are user-defined networks that containers can be attached to. See the networking documentation for more information.

  ## Official document

  https://docs.docker.com/engine/api/v1.41/#tag/Network
  """

  @type id() :: String.t()

  @type t() :: %__MODULE__{id: id(), connection: Connection.t()}

  @doc since: "0.4.0"
  @spec list(
          conn :: Connection.t(),
          params :: Connection.params(),
          headers :: Connection.headers()
        ) ::
          {:ok, [t(), ...]} | {:error, Error.t()}
  def list(conn, params \\ %{}, headers \\ []) do
    Connection.get(conn, path_for(), params, headers)
    |> handle_json_response()
    |> case do
      {:ok, json} ->
        {:ok, Enum.map(json, &new(&1["Id"], conn))}

      error ->
        error
    end
  end

  @doc since: "0.4.0"
  @spec list!(
          conn :: Connection.t(),
          params :: Connection.params(),
          headers :: Connection.headers()
        ) ::
          [t(), ...]
  def list!(conn, params \\ %{}, headers \\ []) do
    list(conn, params, headers)
    |> bang!()
  end

  @doc since: "0.4.0"
  @spec inspect(
          network :: t(),
          params :: Connection.params(),
          headers :: Connection.headers()
        ) ::
          {:ok, term()} | {:error, Error.t()}
  def inspect(network, params \\ %{}, headers \\ []) do
    Connection.get(network.connection, path_for(network), params, headers)
    |> handle_json_response()
  end

  @doc since: "0.4.0"
  @spec inspect!(
          network :: t(),
          params :: Connection.params(),
          headers :: Connection.headers()
        ) ::
          term()
  def inspect!(network, params \\ %{}, headers \\ []) do
    inspect(network, params, headers)
    |> bang!()
  end

  @doc since: "0.4.0"
  @spec remove(
          network :: t(),
          params :: Connection.params(),
          headers :: Connection.headers()
        ) ::
          :ok | {:error, Error.t()}
  def remove(network, params \\ %{}, headers \\ []) do
    Connection.delete(network.connection, path_for(network), params, headers)
    |> handle_no_response()
  end

  @doc since: "0.4.0"
  @spec remove(
          network :: t(),
          params :: Connection.params(),
          headers :: Connection.headers()
        ) ::
          :ok
  def remove!(network, params \\ %{}, headers \\ []) do
    remove(network, params, headers)
    |> bang!()
  end

  @doc since: "0.4.0"
  @spec create(
          conn :: Connection.t(),
          params :: Connection.params(),
          body :: Connection.body(),
          headers :: Connection.headers()
        ) ::
          {:ok, t()} | {:error, Error.t()}
  def create(conn, params \\ %{}, body \\ nil, headers \\ []) do
    Connection.post(conn, path_for(:create), params, body, headers)
    |> handle_json_response()
    |> case do
      {:ok, json} ->
        {:ok, new(json["Id"], conn)}

      error ->
        error
    end
  end

  @doc since: "0.4.0"
  @spec create!(
          conn :: Connection.t(),
          params :: Connection.params(),
          body :: Connection.body(),
          headers :: Connection.headers()
        ) ::
          t()
  def create!(conn, params \\ %{}, body \\ nil, headers \\ []) do
    create(conn, params, body, headers)
    |> bang!()
  end

  @doc since: "0.4.0"
  @spec connect(
          conn :: Connection.t(),
          params :: Connection.params(),
          body :: Connection.body(),
          headers :: Connection.headers()
        ) ::
          :ok | {:error, Error.t()}
  def connect(network, params \\ %{}, body \\ nil, headers \\ []) do
    Connection.post(network.connection, path_for(network, :connect), params, body, headers)
    |> handle_no_response()
  end

  @doc since: "0.4.0"
  @spec connect!(
          conn :: Connection.t(),
          params :: Connection.params(),
          body :: Connection.body(),
          headers :: Connection.headers()
        ) ::
          :ok
  def connect!(network, params \\ %{}, body \\ nil, headers \\ []) do
    connect(network, params, body, headers)
    |> bang!()
  end

  @doc since: "0.4.0"
  @spec disconnect(
          network :: t(),
          params :: Connection.params(),
          body :: Connection.body(),
          headers :: Connection.headers()
        ) ::
          :ok | {:error, Error.t()}
  def disconnect(network, params \\ %{}, body \\ nil, headers \\ []) do
    Connection.post(network.connection, path_for(network, :disconnect), params, body, headers)
    |> handle_no_response()
  end

  @doc since: "0.4.0"
  @spec disconnect!(
          network :: t(),
          params :: Connection.params(),
          body :: Connection.body(),
          headers :: Connection.headers()
        ) ::
          :ok
  def disconnect!(network, params \\ %{}, body \\ nil, headers \\ []) do
    disconnect(network, params, body, headers)
    |> bang!()
  end

  @doc since: "0.4.0"
  @spec prune(
          conn :: Connection.t(),
          params :: Connection.params(),
          body :: Connection.body(),
          headers :: Connection.headers()
        ) ::
          {:ok, term()} | {:error, Error.t()}
  def prune(conn, params \\ %{}, body \\ nil, headers \\ []) do
    Connection.post(conn, path_for(:prune), params, body, headers)
    |> handle_json_response()
  end

  @doc since: "0.4.0"
  @spec prune!(
          conn :: Connection.t(),
          params :: Connection.params(),
          body :: Connection.body(),
          headers :: Connection.headers()
        ) ::
          term()
  def prune!(conn, params \\ %{}, body \\ nil, headers \\ []) do
    prune(conn, params, body, headers)
    |> bang!()
  end
end