Packages
dagger
0.11.6
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.GraphQLClient
alias Dagger.Core.QueryBuilder.Selection
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 false
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 false
def execute(selection, client) do
q = Selection.build(selection)
case query(client, q) do
{:ok, %{"data" => nil, "errors" => errors}} ->
{:error, %Dagger.QueryError{errors: errors}}
{:ok, %{"data" => data}} ->
{:ok, select(data, Selection.path(selection))}
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