defmodule PS2.API.Join do
@moduledoc """
A data structure representing a join on an API query. Create a join using %PS2.API.Join{} or the new/0 or new/1 functions.
"""
alias PS2.API.Join
defstruct [:collection, params: %{}, joins: []]
@type t() :: %Join{
collection: String.t() | nil,
params: map(),
joins: [t()]
}
@type opts :: [
collection: String.t(),
on: String.t(),
to: String.t(),
list: boolean(),
show: list(term()),
hide: list(term()),
inject_at: String.t(),
outer: boolean()
]
@spec new() :: t()
def new, do: %Join{}
@spec new(opts) :: t()
def new(opts),
do: %Join{
collection: Keyword.get(opts, :collection),
params:
for(
{key, val} <- Keyword.delete(opts, :collection),
into: %{},
do: {Atom.to_string(key), val}
)
}
end