defmodule Ash.Query.Call do
@moduledoc "Represents a function call/AST node in an Ash query expression"
defstruct [:name, :args, relationship_path: [], operator?: false]
defimpl Inspect do
import Inspect.Algebra
def inspect(%{name: :if, operator?: false, args: [condition, blocks]} = call, opts) do
if Keyword.keyword?(blocks) do
if Keyword.has_key?(blocks, :else) do
concat([
nest(
concat([
group(concat(["if ", to_doc(condition, opts), " do"])),
line(),
to_doc(blocks[:do], opts)
]),
2
),
line(),
"else",
nest(
concat([
line(),
to_doc(blocks[:else], opts)
]),
2
),
line(),
"end"
])
else
concat([
nest(
concat([
group(concat(["if ", to_doc(condition, opts), " do"])),
line(),
to_doc(blocks[:do], opts)
]),
2
),
line(),
"end"
])
end
else
do_inspect(call, opts)
end
end
def inspect(call, inspect_opts) do
do_inspect(call, inspect_opts)
end
defp do_inspect(call, inspect_opts) do
if call.operator? do
concat([
to_doc(Enum.at(call.args, 0), inspect_opts),
" ",
to_string(call.name),
" ",
to_doc(Enum.at(call.args, 1), inspect_opts)
])
else
prefix =
if call.relationship_path == [] do
""
else
Enum.map_join(call.relationship_path, ".", &to_string/1) <> "."
end
concat([
prefix,
to_string(call.name),
container_doc("(", call.args, ")", inspect_opts, &to_doc/2, separator: ", ")
])
end
end
end
end