defmodule QuackDB.Struct do
@moduledoc """
SQL expression helpers for DuckDB STRUCT values.
These helpers return iodata and map directly to DuckDB struct functions.
"""
@doc "Builds `struct_extract(struct, field_or_index)`."
@spec extract(iodata(), iodata()) :: iodata()
def extract(struct_expression, field_or_index_expression) do
call("struct_extract", [struct_expression, field_or_index_expression])
end
@doc "Builds `struct_extract_at(struct, index)`."
@spec extract_at(iodata(), iodata()) :: iodata()
def extract_at(struct_expression, index_expression) do
call("struct_extract_at", [struct_expression, index_expression])
end
@doc "Builds `struct_contains(struct, value)`."
@spec contains(iodata(), iodata()) :: iodata()
def contains(struct_expression, value_expression) do
call("struct_contains", [struct_expression, value_expression])
end
@doc "Builds `struct_position(struct, value)`."
@spec position(iodata(), iodata()) :: iodata()
def position(struct_expression, value_expression) do
call("struct_position", [struct_expression, value_expression])
end
@doc "Builds `struct_values(struct)`."
@spec values(iodata()) :: iodata()
def values(struct_expression), do: call("struct_values", [struct_expression])
@doc "Builds `struct_concat(left, right)`."
@spec concat(iodata(), iodata()) :: iodata()
def concat(left_expression, right_expression) do
call("struct_concat", [left_expression, right_expression])
end
defp call(function, args) do
[function, "(", Enum.intersperse(args, ", "), ")"]
end
end