Current section

Files

Jump to
rivet_utils lib module.ex
Raw

lib/module.ex

defmodule Rivet.Utils.Module do
alias Transmogrify.Snakecase
import String
@doc """
iex> :module_id = mod_to_id_key(Core.Tools.Module)
iex> :module_id = mod_to_idname(Core.Tools.Module)
"""
def mod_to_id_key(mod), do: mod_to_name_string(mod) |> id_key()
# so the deprecated path still works; this should compile out
defdelegate mod_to_idname(mod), to: __MODULE__, as: :mod_to_id_key
@doc """
Note: "name" in name string implies snake, not module/pascal case
iex> :narf = mod_to_name(Core.Tools.Narf)
iex> "narf" = mod_to_name(Core.Tools.Narf, :string)
"""
def mod_to_name(mod, output \\ :atom)
def mod_to_name(mod, :atom), do: mod_to_name_string(mod) |> to_atom()
def mod_to_name(mod, :string), do: mod_to_name_string(mod)
defp mod_to_name_string(m), do: mod_basename_snake(m)
@doc """
iex> ModuleName = mod_basename(Core.Tools.ModuleName)
iex> ModuleName = mod_basename(Core.Tools.ModuleName, :module)
iex> "module_name" = mod_basename(Core.Tools.ModuleName, :string)
iex> :module_name = mod_basename(Core.Tools.ModuleName, :atom)
"""
def mod_basename(mod, output \\ :module)
def mod_basename(mod, :module), do: [mod_basename_(mod)] |> Module.concat()
def mod_basename(mod, :string), do: mod_basename_snake(mod)
def mod_basename(mod, :atom), do: mod_basename_snake(mod) |> to_atom()
defp mod_basename_(mod), do: List.last(Module.split(mod))
defp mod_basename_snake(mod), do: mod_basename_(mod) |> Snakecase.convert()
@doc """
iex> Core.Db.IsParent = mod_parent(Core.Db.IsParent.Log)
iex> Core.Db.IsParent = mod_parent(Core.Db.IsParent.Log, :module)
iex> ["Core", "Db", "IsParent"] = mod_parent(Core.Db.IsParent.Log, :list)
"""
def mod_parent(mod, output_case \\ :module)
def mod_parent(mod, :module), do: mod_parent_module(mod)
def mod_parent(mod, :list), do: mod_parent_list(mod)
defp mod_parent_module(mod), do: mod_parent_list(mod) |> Module.concat()
defp mod_parent_list(mod), do: Module.split(mod) |> Enum.drop(-1)
@doc """
iex> :ip_id = id_key(:ips)
iex> :ip_id = id_key(:ip)
iex> :ip_id = id_key("ip")
iex> :ip_id = id_key("long_prefix_ip")
"""
def id_key(input) when is_atom(input), do: id_key(Atom.to_string(input))
def id_key(input) when is_binary(input) do
String.split(input, "_")
|> List.last()
|> String.trim_trailing("s")
|> Kernel.<>("_id")
|> to_atom()
end
@doc """
iex> :module_id = mod_id_key(Some.Long.Modules)
"""
def mod_id_key(input), do: mod_basename(input, :atom) |> id_key()
end