Current section

Files

Jump to
cssex lib helpers interpolations.ex~
Raw

lib/helpers/interpolations.ex~

defmodule CSSEx.Helpers.Interpolations do
# replaces the value if it mentions a cssex variable and that variable is bound
# in either the local_scope (first match) or the global scope (second match)
def maybe_replace_val(<<"@$$", var_name::binary>>, %{local_scope: ls})
when is_map_key(ls, var_name),
do: {:ok, Map.fetch!(ls, var_name)}
def maybe_replace_val(<<"@$$", var_name::binary>>, %{scope: scope})
when is_map_key(scope, var_name),
do: {:ok, Map.fetch!(scope, var_name)}
def maybe_replace_val(<<"@$$", var_name::binary>>, _data),
do: {:error, {:not_declared, var_name}}
def maybe_replace_val(val, data) do
case Regex.scan(~r/<\$(.+?)\$>/u, val) do
[] ->
{:ok, val}
tokens ->
Enum.reduce_while(tokens, {:ok, val}, fn [token, var_name], {_result, acc} ->
case var_name do
<<"@$$", _::binary>> ->
case maybe_replace_val(var_name, data) do
{:ok, replaced} -> {:cont, {:ok, String.replace(acc, token, replaced)}}
error -> {:halt, error}
end
_ ->
case maybe_replace_val("@$$" <> var_name, data) do
{:ok, replaced} -> {:cont, {:ok, String.replace(acc, token, replaced)}}
error -> {:halt, error}
end
end
end)
end
end
end