Current section

Files

Jump to
durango lib dsl helpers.ex
Raw

lib/dsl/helpers.ex

defmodule Durango.Dsl.Helpers do
alias Durango.Dsl.DotAccess
def extract_labels(labels) when is_list(labels) do
labels
|> Enum.map(&base_name/1)
end
def extract_labels({:{}, _, args}) when is_list(args) do
extract_labels(args)
end
def extract_labels(labels) do
labels
|> base_name
|> List.wrap
end
def stringify(items, sep) when is_list(items) and is_binary(sep) do
items
|> Enum.map(fn item -> stringify(item) end)
|> Enum.join(sep)
end
def stringify({:.., _, [low, high]}) when is_integer(low) and is_integer(high) do
stringify(low)<>".."<>stringify(high)
end
def stringify({:{}, _, args}) do
stringify(args, ", ")
end
def stringify(n) when is_number(n) do
to_string(n)
end
def stringify(item) when is_atom(item) do
if Durango.Document.is_document?(item) do
item.__document__(:collection) |> to_string
else
to_string(item)
end
end
def stringify({:__aliases__, _, _} = item) do
item
|> var_name
|> stringify
end
def stringify({{:., _, [{base, _, nil}, attr]}, _, []}) do
to_string(base) <> "." <> to_string(attr)
end
def stringify({item, _, nil}) when is_atom(item) do
to_string(item)
end
def var_name({:__aliases__, _, parts}) do
parts
|> Module.concat
# |> case do
# # string when is_binary(string) ->
# # String.to_existing_atom(string)
# atom when is_atom(atom) ->
# atom
# end
end
def var_name({name, _, _}) when is_atom(name) do
name
end
def var_name(name) when is_atom(name) do
name
end
def var_name({{:., _, [{base, _, nil}, attr]}, _, []}) do
to_string(base) <> "." <> to_string(attr)
end
def base_name({{:., _, [{base, _, nil}, _attr]}, _, []}) do
base
end
def base_name(atom) when is_atom(atom) do
atom
end
def base_name({name, _, _}) when is_atom(name) do
name
end
def base_name(%DotAccess{attrs: [{:base, base} | _]}) do
base
end
end