Current section

Files

Jump to
dogma lib dogma rule function_name.ex
Raw

lib/dogma/rule/function_name.ex

defmodule Dogma.Rule.FunctionName do
@moduledoc """
A rule that disallows function names not in `snake_case`.
`snake_case` is when only lowercase letters are used, and words are separated
with underscores, rather than spaces.
For example, this rule considers these function definition valid:
def my_mood do
:happy
end
defp my_belly do
:full
end
But it considers these invalid:
def myMood do
:sad
end
defp myBelly do
:empty
end
"""
@behaviour Dogma.Rule
alias Dogma.Script
alias Dogma.Error
alias Dogma.Util.Name
def test(script, _config = [] \\ []) do
script |> Script.walk( &check_node(&1, &2) )
end
defp check_node({:def, _, [{name, meta, _}|_]} = node, errors) do
check_function(name, meta, node, errors)
end
defp check_node({:defp, _, [{name, meta, _}|_]} = node, errors) do
check_function(name, meta, node, errors)
end
defp check_node(node, errors) do
{node, errors}
end
# If the function is named by unquoting something then we can't check it
defp check_function({:unquote,_,_} , _meta, node, errors) do
{node, errors}
end
defp check_function(name, meta, node, errors) do
if name |> to_string |> Name.probably_snake_case? do
{node, errors}
else
{node, [error( meta[:line] ) | errors]}
end
end
defp error(pos) do
%Error{
rule: __MODULE__,
message: "Function names should be in snake_case",
line: pos,
}
end
end