Current section

Files

Jump to
igniter lib igniter code string.ex
Raw

lib/igniter/code/string.ex

defmodule Igniter.Code.String do
@moduledoc """
Utilities for working with strings.
"""
alias Sourceror.Zipper
@doc "Returns true if the node represents a literal string, false otherwise."
@spec string?(Zipper.t()) :: boolean()
def string?(zipper) do
case zipper.node do
v when is_binary(v) ->
true
{:__block__, meta, [v]} when is_binary(v) ->
is_binary(meta[:delimiter])
_ ->
false
end
end
@doc "Updates a node representing a string with the result of the given function"
@spec update_string(Zipper.t(), (String.t() -> {:ok, String.t()} | :error)) ::
{:ok, Zipper.t()} | :error
def update_string(zipper, func) do
case zipper.node do
v when is_binary(v) ->
with {:ok, new_str} <- func.(v) do
{:ok, Zipper.replace(zipper, new_str)}
end
{:__block__, meta, [v]} when is_binary(v) ->
if is_binary(meta[:delimiter]) do
with {:ok, new_str} <- func.(v) do
{:ok, Zipper.replace(zipper, {:__block__, meta, [new_str]})}
end
else
:error
end
_ ->
:error
end
end
end