Current section

Files

Jump to
zigler lib zig _parameter.ex
Raw

lib/zig/_parameter.ex

defmodule Zig.Parameter do
@moduledoc false
@enforce_keys ~w[type cleanup in_out]a
defstruct @enforce_keys
alias Zig.Type
@type t :: %__MODULE__{
type: Type.t(),
cleanup: boolean,
in_out: boolean
}
@type opts :: :noclean | [:noclean | {:cleanup, boolean}]
def new(type, options) do
struct!(__MODULE__, [type: type] ++ normalize_options(options))
end
@options ~w[cleanup]a
def normalize_options(options) do
options
|> List.wrap()
|> Enum.flat_map(fn
:noclean -> [cleanup: false]
:in_out -> [in_out: true, cleanup: false]
{k, _} = kv when k in @options -> [kv]
end)
|> then(&Keyword.merge([cleanup: true, in_out: false], &1))
end
def render_accessory_variables(parameter, index) do
Type.render_accessory_variables(parameter.type, parameter, "arg#{index}")
end
def render_payload_options(parameter, index) do
parameter.type
|> Type.payload_options("arg#{index}")
|> then(fn
options when parameter.in_out -> Keyword.put(options, :in_out, "&arg#{index}")
options -> options
end)
|> assemble_payload_options
end
defp assemble_payload_options(options) do
[".{", Enum.map(options, fn {k, v} -> ~s(.#{k} = #{v},) end), "},"]
end
def render_cleanup(parameter, index) do
cond do
parameter.cleanup ->
Type.render_cleanup(parameter.type, index)
:else ->
".{.cleanup = false},"
end
end
end