lib/data_provider/sort.ex

defmodule DataProvider.Sort do
  @moduledoc ~S"""
  Module with sorting params for `DataProvider`
  """

  defstruct options: []

  @typedoc ~S"""
  Sort options

  ## Fields

    * `options` - Keyword with data searching options for `DataProvider`

  """
  @type t() :: %__MODULE__{options: map()}

  @doc ~S"""
  Creates new `DataProvider.Sort` with received params
  """
  @spec create(Keyword.t) :: __MODULE__.t
  def create(options \\ [])
  def create(options), do: %__MODULE__{options: options}

  @doc ~S"""
  Merges `options` value of received `DataProvider.Sort` with `params` in
  second argument.

  ## Args

    * `sort` - `DataProvider.Sort` which need to merge

    * `param` - Keyword with new for merging

  """
  @spec merge_options(__MODULE__.t, Keyword.t) :: __MODULE__.t
  def merge_options(%__MODULE__{options: options} = sort, params), do: %{sort | options: options ++ params}

  @doc ~S"""
  Replaces `options` in `DataProvider.Sort` by received `params` map.

  ## Args

    * `sort` - `DataProvider.Sort` which need to replace

    * `param` - Keyword with new options for replacing

  """
  @spec put_options(__MODULE__.t, Keyword.t) :: __MODULE__.t
  def put_options(%__MODULE__{} = sort, params), do: %{sort | options: params}
end