Current section
Files
Jump to
Current section
Files
lib/komodo/helpers.ex
defmodule Komodo.Helpers do
@valid_variable_char "[\\w_$]"
@doc """
Converts a string path spec to an array for use in the komodo javascript library
Example:
iex> Komodo.Helpers.arguments_path("&1.inner[2].name")
"0.inner.2.name"
"""
def arguments_path(path_string) when is_binary(path_string) do
[first_part | rest] =
path_string
|> String.replace(~r/\[(#{@valid_variable_char}+)\]/, ".\\1")
|> String.split(".")
unless first_part =~ ~r/^&\d+$/ do
raise "The first part of the path needs to have the form '&n' for integer n, e.g. '&2'"
end
"&" <> path_0 = first_part
path_0 = ((path_0 |> String.to_integer()) - 1) |> Integer.to_string()
path = [path_0 | rest]
unless Enum.all?(path, fn part -> part =~ ~r/^#{@valid_variable_char}+$/ end) do
raise "Unable to parse path '#{path_string}' - every part must have characters that match the regex #{@valid_variable_char}"
end
Enum.join(path, ".")
end
def normalise_callback_spec(event_name) when is_binary(event_name) do
[event_name]
end
def normalise_callback_spec({event_name, path_string})
when is_binary(event_name) and is_binary(path_string) do
[event_name, arguments_path(path_string)]
end
def normalise_callback_spec({event_name, path_strings})
when is_binary(event_name) and is_list(path_strings) do
[event_name, Enum.map(path_strings, &arguments_path/1)]
end
def normalise_callback_spec({event_name, path_string_lookup = %{}})
when is_binary(event_name) do
[
event_name,
path_string_lookup
|> Enum.map(fn {k, v} -> {k, arguments_path(v)} end)
|> Enum.into(%{})
]
end
end