Skip to main content

lib/quack_db/identifier.ex

defmodule QuackDB.Identifier do
  @moduledoc false

  @spec valid?(atom() | String.t()) :: boolean()
  def valid?(value) when is_atom(value), do: value |> Atom.to_string() |> valid?()

  def valid?(<<?_, rest::binary>>), do: valid_rest?(rest)

  def valid?(<<first, rest::binary>>) when first in ?A..?Z or first in ?a..?z do
    valid_rest?(rest)
  end

  def valid?(_value), do: false

  defp valid_rest?(<<>>), do: true

  defp valid_rest?(<<?_, rest::binary>>), do: valid_rest?(rest)

  defp valid_rest?(<<char, rest::binary>>)
       when char in ?A..?Z or char in ?a..?z or char in ?0..?9 do
    valid_rest?(rest)
  end

  defp valid_rest?(_value), do: false
end