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