exception_names.ex (2101B)
1 defmodule Credo.Check.Consistency.ExceptionNames do 2 use Credo.Check, 3 run_on_all: true, 4 base_priority: :high, 5 explanations: [ 6 check: """ 7 Exception names should end with a common suffix like "Error". 8 9 Try to name your exception modules consistently: 10 11 defmodule BadCodeError do 12 defexception [:message] 13 end 14 15 defmodule ParserError do 16 defexception [:message] 17 end 18 19 Inconsistent use should be avoided: 20 21 defmodule BadHTTPResponse do 22 defexception [:message] 23 end 24 25 defmodule HTTPHeaderException do 26 defexception [:message] 27 end 28 29 While this is not necessarily a concern for the correctness of your code, 30 you should use a consistent style throughout your codebase. 31 """ 32 ] 33 34 @collector Credo.Check.Consistency.ExceptionNames.Collector 35 36 @doc false 37 @impl true 38 def run_on_all_source_files(exec, source_files, params) do 39 @collector.find_and_append_issues(source_files, exec, params, &issues_for/3) 40 end 41 42 defp issues_for(expected, source_file, params) do 43 issue_meta = IssueMeta.for(source_file, params) 44 45 issue_locations = @collector.find_locations_not_matching(expected, source_file) 46 47 Enum.map(issue_locations, fn location -> 48 format_issue(issue_meta, [ 49 {:message, message_for(expected, location[:trigger])} | location 50 ]) 51 end) 52 end 53 54 defp message_for({:prefix, expected}, trigger) do 55 message = """ 56 Exception modules should be named consistently. 57 It seems your strategy is to prefix them with `#{expected}`, 58 but `#{trigger}` does not follow that convention. 59 """ 60 61 to_one_line(message) 62 end 63 64 defp message_for({:suffix, expected}, trigger) do 65 message = """ 66 Exception modules should be named consistently. 67 It seems your strategy is to have `#{expected}` as a suffix, 68 but `#{trigger}` does not follow that convention. 69 """ 70 71 to_one_line(message) 72 end 73 74 defp to_one_line(str) do 75 str 76 |> String.split() 77 |> Enum.join(" ") 78 end 79 end