defmodule Ravix.RQL.Tokens.Update do
@moduledoc """
RQL Update tokens
"""
defstruct token: :update,
fields: []
alias Ravix.RQL.Tokens.Update
@type t :: %Update{
token: atom(),
fields: list(map())
}
@doc """
Creates a new "set" update operation
Returns a `Ravix.RQL.Tokens.Update`
## Examples
iex> import alias Ravix.RQL.Tokens.Update
iex> set("field1", 10) |> set("field2", "a")
"""
@spec set(Update.t(), atom() | String.t(), any) :: Ravix.RQL.Tokens.Update.t()
def set(update \\ %Update{}, field, value) do
%Update{
update
| fields: update.fields ++ [%{name: field, value: value, operation: :set}]
}
end
@doc """
Creates a new "increment" update operation
Returns a `Ravix.RQL.Tokens.Update`
## Examples
iex> import alias Ravix.RQL.Tokens.Update
iex> inc("field1", 10)
"""
@spec inc(Update.t(), atom() | String.t(), number()) :: Ravix.RQL.Tokens.Update.t()
def inc(update \\ %Update{}, field, value) when is_number(value) do
%Update{
update
| fields: update.fields ++ [%{name: field, value: value, operation: :inc}]
}
end
@doc """
Creates a new "decrement" update operation
Returns a `Ravix.RQL.Tokens.Update`
## Examples
iex> import alias Ravix.RQL.Tokens.Update
iex> dec("field1", 10)
"""
@spec dec(Update.t(), atom() | String.t(), number()) :: Ravix.RQL.Tokens.Update.t()
def dec(update \\ %Update{}, field, value) when is_number(value) do
%Update{
update
| fields: update.fields ++ [%{name: field, value: value, operation: :dec}]
}
end
end