lib/momento/validation.ex

defmodule Momento.Validation do
  import Momento.Error

  @spec validate_cache_name(cache_name :: String.t()) :: :ok | {:error, Momento.Error.t()}
  def validate_cache_name(cache_name) do
    validate_string(cache_name, "cache name")
  end

  @spec validate_sorted_set_name(sorted_set_name :: String.t()) ::
          :ok | {:error, Momento.Error.t()}
  def validate_sorted_set_name(sorted_set_name) do
    validate_string(sorted_set_name, "sorted set name")
  end

  @spec validate_string(string :: String.t(), name_type :: String.t()) ::
          :ok | {:error, Momento.Error.t()}
  defp validate_string(nil, string_name),
    do: {:error, invalid_argument("The #{string_name} cannot be nil")}

  defp validate_string(string, string_name) do
    with true <- is_binary(string),
         String.valid?(string) do
      :ok
    else
      _ -> {:error, invalid_argument("The #{string_name} must be a string")}
    end
  end
end