Current section
Files
Jump to
Current section
Files
lib/friendlyid.ex
defmodule FriendlyID do
@moduledoc """
Documentation for `FriendlyID`.
"""
# XXX: Should word lists be stored here, or loaded every time, or.. ?
@doc """
Generates a friendly ID of a given length.
Takes an optional options:
{
:transform: true
:separator: ""
}
## Examples
iex> :rand.seed(:exsplus, {101, 102, 103})
iex> FriendlyID.generate(2)
"SugaredYear"
iex> FriendlyID.generate(3, separator: "-")
"Mountainous-Quintessential-Wealth"
iex> FriendlyID.generate(3, separator: "-", transform: &:string.uppercase/1)
"GLEAMING-FAINT-PHILOSOPHY"
"""
@spec generate(pos_integer, keyword) :: binary
def generate(size, options \\ []) when is_integer(size) and size > 0 do
default = [transform: &:string.titlecase/1, separator: ""]
options = Keyword.merge(default, options)
{:ok, predicates} = File.read(Path.join(:code.priv_dir(:friendlyid), "predicates.txt"))
predicates_list = predicates |> String.split("\n", trim: true)
{:ok, objects} = File.read(Path.join(:code.priv_dir(:friendlyid), "objects.txt"))
objects_list = objects |> String.split("\n", trim: true)
ids = Enum.take_random(predicates_list, size-1) ++ Enum.take_random(objects_list, 1)
Enum.join(Enum.map(ids, options[:transform]), options[:separator])
end
end