defmodule Dagger do
@moduledoc """
The [Dagger](https://dagger.io/) SDK for Elixir.
See `getting_start.livemd` for starter point.
"""
defstruct [:client, :query]
@doc """
Connecting to Dagger.
## Options
#{NimbleOptions.docs(Dagger.Internal.Client.connect_schema())}
"""
def connect(opts \\ []) do
with {:ok, graphql_client} <- Dagger.Internal.Client.connect(opts) do
client = %Dagger.Client{
client: graphql_client,
selection: Dagger.QueryBuilder.Selection.query()
}
case Dagger.Client.check_version_compatibility(client, Dagger.EngineConn.engine_version()) do
{:error, reason} -> IO.warn("failed to check version compatibility: #{inspect(reason)}")
_ -> nil
end
{:ok, client}
end
end
@doc """
Similar to `connect/1` but raise exception when found an error.
"""
def connect!(opts \\ []) do
case connect(opts) do
{:ok, query} -> query
error -> raise "Cannot connect to Dagger engine, cause: #{inspect(error)}"
end
end
@doc """
Disconnecting Dagger.
"""
def close(%Dagger.Client{client: client}) do
Dagger.Internal.Client.close(client)
end
end