Packages
dagger
0.12.3
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
@doc """
Define a Dagger function.
"""
def define(dag, {name, fun_def}, doc_content) do
args = 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(doc_content)
|> with_args(args, dag)
end
defp maybe_with_description(function, doc) when doc in [:none, :hidden], do: function
defp maybe_with_description(function, %{"en" => doc}) do
Dagger.Function.with_description(function, doc)
end
defp with_args(fun_def, args, dag) do
args
|> Enum.reduce(fun_def, fn {name, info}, fun_def ->
type = Keyword.fetch!(info, :type)
type_def =
define_type(dag, Dagger.Client.type_def(dag), type)
|> then(&maybe_with_optional(&1, info[:optional]))
fun_def
|> 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
# TODO: support type list.
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