Packages
dagger
0.18.13
0.21.7
0.21.6
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.8
0.20.7
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0
0.19.11
0.19.10
0.19.9
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.19
0.18.18
0.18.17
0.18.16
0.18.15
0.18.14
0.18.13
0.18.12
0.18.11
0.18.10
0.18.9
0.18.8
0.18.7
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.2
0.17.1
0.17.0
0.16.3
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.0
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.2
0.0.0
retired
Dagger SDK for Elixir
Current section
Files
Jump to
Current section
Files
lib/dagger/core/client.ex
defmodule Dagger.Core.Client do
@moduledoc """
GraphQL client for Dagger.
"""
alias Dagger.Core.EngineConn
alias Dagger.Core.ExecError
alias Dagger.Core.GraphQL.Response
alias Dagger.Core.GraphQLClient
alias Dagger.Core.QueryBuilder, as: QB
defstruct [:url, :conn, :connect_opts]
@doc false
def connect(opts \\ []) do
with {:ok, opts} <- NimbleOptions.validate(opts, connect_schema()),
{:ok, conn} <- EngineConn.get(opts) do
host = EngineConn.host(conn)
{:ok,
%__MODULE__{
url: "http://#{host}/query",
conn: conn,
connect_opts: opts
}}
end
end
@doc false
def connect_schema() do
[
workdir: [
type: :string,
doc: "Sets the engine workdir."
],
log_output: [
type: {:or, [:atom, :pid]},
doc: "The log device to write the progress.",
default: :stderr
],
connect_timeout: [
type: :timeout,
doc: "Sets timeout when connect to the engine.",
default: :timer.seconds(10)
],
query_timeout: [
type: :timeout,
doc: "Sets timeout when executing a query.",
default: :infinity
]
]
end
@doc false
def close(%__MODULE__{conn: conn}) do
with :quit <- EngineConn.disconnect(conn) do
:ok
end
end
@doc """
Send the raw GraphQL query to the Dagger.
Returns a raw response from the Dagger.
"""
def query(%__MODULE__{connect_opts: connect_opts} = client, query)
when is_binary(query) do
GraphQLClient.request(client.url, EngineConn.token(client.conn), query, %{},
timeout: connect_opts[:query_timeout] || :timer.minutes(5)
)
end
@doc """
Send the `query_builder` to the Dagger and get the result from leaf node of
the query.
"""
def execute(client, query_builder) do
q = QB.build(query_builder)
case query(client, q) do
{:ok, %Response{errors: [error]}} ->
error =
case error.extensions["_type"] do
"EXEC_ERROR" ->
error.extensions
|> ExecError.from_map()
|> ExecError.with_original_error(error)
_ ->
error
end
{:error, error}
{:ok, %Response{data: data}} ->
{:ok, select(data, QB.path(query_builder))}
otherwise ->
otherwise
end
end
defp select(data, []), do: data
defp select(data, _selectors) when is_list(data) do
data
end
defp select(data, [selector | selectors]) do
select(Map.get(data, selector), selectors)
end
end