Packages
dagger
0.12.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/mod/function.ex
defmodule Dagger.Mod.Function do
@moduledoc false
alias Dagger.Mod.Helper
alias Dagger.Mod.Object
@doc """
Define a Dagger function from the function definition.
"""
@spec define(Dagger.Client.t(), module(), Object.function_def()) :: Dagger.Function.t()
def define(%Dagger.Client{} = dag, module, {name, fun_def}) when is_atom(module) do
args = Keyword.fetch!(fun_def, :args)
return = Keyword.fetch!(fun_def, :return)
dag
|> Dagger.Client.function(
Helper.camelize(name),
define_type(dag, Dagger.Client.type_def(dag), return)
)
|> maybe_with_description(Object.get_function_doc(module, name))
|> with_args(args, dag)
end
defp maybe_with_description(function, nil), do: function
defp maybe_with_description(function, doc), do: Dagger.Function.with_description(function, doc)
defp with_args(fun, args, dag) do
args
|> Enum.reduce(fun, fn {name, arg_def}, fun ->
type = Keyword.fetch!(arg_def, :type)
type_def =
dag
|> define_type(Dagger.Client.type_def(dag), type)
|> maybe_with_optional(arg_def[:optional])
fun
|> Dagger.Function.with_arg(name, type_def)
end)
end
defp maybe_with_optional(type_def, optional?) do
if optional? do
Dagger.TypeDef.with_optional(type_def, true)
else
type_def
end
end
defp define_type(_dag, type_def, :integer) do
type_def
|> Dagger.TypeDef.with_kind(Dagger.TypeDefKind.integer_kind())
end
defp define_type(_dag, type_def, :boolean) do
type_def
|> Dagger.TypeDef.with_kind(Dagger.TypeDefKind.boolean_kind())
end
defp define_type(_dag, type_def, :string) do
type_def
|> Dagger.TypeDef.with_kind(Dagger.TypeDefKind.string_kind())
end
defp define_type(dag, type_def, {:list, type}) do
type_def
|> Dagger.TypeDef.with_list_of(define_type(dag, Dagger.Client.type_def(dag), type))
end
defp define_type(_dag, type_def, module) do
case Module.split(module) do
# A module that generated by codegen.
["Dagger", name] ->
type_def
|> Dagger.TypeDef.with_object(name)
[name] ->
type_def
|> Dagger.TypeDef.with_object(name)
end
end
end