lib/ash/query/function/string_split.ex

defmodule Ash.Query.Function.StringSplit do
  @options [
    trim?: [
      type: :boolean,
      default: false,
      doc:
        "Wether or not to trim empty strings from the beginning or end of the result. Equivalent to the `trim` option to `String.split/3`"
    ]
  ]

  @moduledoc """
  Split a string into a list of strings

  Splits a string on the given delimiter. The delimiter defaults to a single space. Also supports options.

  Keep in mind, this function does *not* support regexes the way that `String.split/3` does, only raw strings.

      string_split(employee_code)
      string_split(full_name, "foo")
      string_split(full_name, "foo", trim?: true)

  ## Options

  #{Spark.OptionsHelpers.docs(@options)}
  """

  use Ash.Query.Function, name: :string_split

  def args,
    do: [
      [:string],
      [:string, :string],
      [:string, :string, {:keyword, fields: @options}]
    ]

  def new([string]) do
    {:ok, %__MODULE__{arguments: [string, " ", []]}}
  end

  def new([string, delimiter]) do
    {:ok, %__MODULE__{arguments: [string, delimiter, []]}}
  end

  def new(args) do
    {:ok, %__MODULE__{arguments: args}}
  end

  def evaluate(%{arguments: [value, delimiter, opts]}) do
    split(value, delimiter, opts)
  end

  defp split(value, delimiter, opts) do
    split_opts =
      if opts[:trim?] do
        [trim: true]
      else
        []
      end

    {:known, String.split(value, delimiter, split_opts)}
  end
end