Packages
dagger
0.20.2
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.Scope
alias Dagger.Mod.Registry
@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, scope} <- Scope.from_fn_call(fn_call),
{:ok, json} <- invoke(dag, module, scope) 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, %Scope{parent_name: ""}) do
dag
|> Dagger.Mod.Module.define(module)
|> Encoder.validate_and_encode(Dagger.Module)
end
# Constructor call.
def invoke(dag, module, %Scope{fn_name: ""} = scope) do
fun_def = module.__object__(:function, :init)
args = Scope.args!(scope, fun_def.args, dag)
return_type = fun_def.return
execute_function(module, :init, args, return_type)
end
# Invoke function.
def invoke(dag, root_module, %Scope{} = scope) do
registry = Registry.register(root_module)
module = Registry.get_module_by_name!(registry, scope.parent_name)
{:ok, parent} = Scope.into_module(scope, module, dag)
fun_name = Scope.fn_name(scope)
fun_def = module.__object__(:function, fun_name)
args =
scope
|> Scope.args!(fun_def.args, dag)
|> then(fn args ->
if(fun_def.self, do: [parent | args], else: args)
end)
return_type = fun_def.return
execute_function(module, fun_name, args, return_type)
end
defp execute_function(module, fun_name, args, return_type) do
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 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