Packages
dagger
0.18.8
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/mod.ex
defmodule Dagger.Mod do
@moduledoc false
alias Dagger.Mod.Encoder
alias Dagger.Mod.Decoder
@doc """
Invoke a function.
"""
def invoke(module) when is_atom(module) do
case Dagger.Global.start_link() do
{:ok, _} -> invoke(Dagger.Global.dag(), module)
otherwise -> otherwise
end
end
def invoke(dag, module) do
fn_call = Dagger.Client.current_function_call(dag)
with {:ok, parent_name} <- Dagger.FunctionCall.parent_name(fn_call),
{:ok, fn_name} <- Dagger.FunctionCall.name(fn_call),
{:ok, parent_json} <- Dagger.FunctionCall.parent(fn_call),
{:ok, parent} <- Decoder.decode(parent_json, {:optional, module}, dag),
{:ok, input_args} <- Dagger.FunctionCall.input_args(fn_call),
input_args = fetch_args!(input_args),
{:ok, json} <- invoke(dag, module, parent, parent_name, fn_name, input_args) do
Dagger.FunctionCall.return_value(fn_call, json)
else
{:error, error} ->
IO.puts(:stderr, format_error(error))
exit({:shutdown, 2})
end
after
Dagger.Global.close()
end
# Register module.
def invoke(dag, module, _parent, "", _fn_name, _input_args) do
dag
|> Dagger.Mod.Module.define(module)
|> Encoder.validate_and_encode(Dagger.Module)
end
# Invoke function.
def invoke(dag, module, parent, _parent_name, fn_name, input_args) do
fun_name = fn_name |> Macro.underscore() |> String.to_existing_atom()
fun_def = module.__object__(:function, fun_name)
args = decode_args!(dag, input_args, fun_def.args)
args = if(fun_def.self, do: [parent | args], else: args)
return_type = fun_def.return
case apply(module, fun_name, args) do
{:error, _} = error -> error
{:ok, result} -> Encoder.validate_and_encode(result, return_type)
result -> Encoder.validate_and_encode(result, return_type)
end
end
defp fetch_args!(input_args) do
Enum.into(input_args, %{}, fn arg ->
{:ok, name} = Dagger.FunctionCallArgValue.name(arg)
{:ok, value} = Dagger.FunctionCallArgValue.value(arg)
{Macro.underscore(name), value}
end)
end
# Get the value from a given `input_args` and make it positional by `args_def`.
def decode_args!(dag, input_args, arg_defs) do
for {name, arg_def} <- arg_defs do
{:ok, value} =
input_args
|> Map.get(to_string(name))
|> Decoder.decode(arg_def[:type], dag)
value
end
end
defp format_error(%{__exception__: true} = exception), do: Exception.message(exception)
defp format_error(error) when is_binary(error) or is_atom(error), do: error
defp format_error(error), do: inspect(error)
end