Current section
Files
Jump to
Current section
Files
lib/credo/check/consistency/exception_names.ex
defmodule Credo.Check.Consistency.ExceptionNames do
@moduledoc false
@checkdoc """
Exception names should end with a common suffix like "Error".
Try to name your exception modules consistently:
defmodule BadCodeError do
defexception [:message]
end
defmodule ParserError do
defexception [:message]
end
Inconsistent use should be avoided:
defmodule BadHTTPResponse do
defexception [:message]
end
defmodule HTTPHeaderException do
defexception [:message]
end
While this is not necessarily a concern for the correctness of your code,
you should use a consistent style throughout your codebase.
"""
@explanation [check: @checkdoc]
@collector Credo.Check.Consistency.ExceptionNames.Collector
use Credo.Check, run_on_all: true, base_priority: :high
@doc false
def run(source_files, exec, params \\ []) when is_list(source_files) do
@collector.find_and_append_issues(source_files, exec, params, &issues_for/3)
end
defp issues_for(expected, source_file, params) do
issue_meta = IssueMeta.for(source_file, params)
issue_locations = @collector.find_locations_not_matching(expected, source_file)
Enum.map(issue_locations, fn location ->
format_issue(issue_meta, [
{:message, message_for(expected, location[:trigger])} | location
])
end)
end
defp message_for({:prefix, expected}, trigger) do
message = """
Exception modules should be named consistently.
It seems your strategy is to prefix them with `#{expected}`,
but `#{trigger}` does not follow that convention."
"""
to_one_line(message)
end
defp message_for({:suffix, expected}, trigger) do
message = """
Exception modules should be named consistently.
It seems your strategy is to have `#{expected}` as a suffix,
but `#{trigger}` does not follow that convention.
"""
to_one_line(message)
end
def to_one_line(str) do
str
|> String.split()
|> Enum.join(" ")
end
end