Packages
dagger
0.16.0
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)
opts =
arg_def
|> Keyword.take([:doc, :default_path, :ignore])
|> Enum.reject(fn {_, value} -> is_nil(value) end)
|> Enum.map(&normalize_arg_option/1)
fun
|> Dagger.Function.with_arg(name, type_def, opts)
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, :float) do
type_def
|> Dagger.TypeDef.with_kind(Dagger.TypeDefKind.float_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, {:optional, type}) do
dag
|> define_type(type_def, type)
|> Dagger.TypeDef.with_optional(true)
end
defp define_type(_dag, type_def, module) do
case Module.split(module) do
["Dagger", "Void"] ->
type_def
|> Dagger.TypeDef.with_kind(Dagger.TypeDefKind.void_kind())
|> Dagger.TypeDef.with_optional(true)
# 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
defp normalize_arg_option({:doc, doc}), do: {:description, doc}
defp normalize_arg_option(opt), do: opt
end