Slide 11
Slide 11 text
Friendly blame
defmodule KeyError do
# snip
def blame(%{term: term, key: key} = exception, stacktrace) do
message = message(key, term)
if is_atom(key) and (map_with_atom_keys_only?(term) or Keyword.keyword?(term)) do
hint = did_you_mean(key, available_keys(term))
{%{exception | message: message <> IO.iodata_to_binary(hint)}, stacktrace}
else
{%{exception | message: message}, stacktrace}
end
end
defp did_you_mean(missing_key, available_keys) do
suggestions =
for key <- available_keys,
distance = String.jaro_distance(Atom.to_string(missing_key), Atom.to_string(key)),
distance >= @threshold,
do: {distance, key}
case suggestions do
[] -> []
suggestions -> [". Did you mean one of:\n\n" | format_suggestions(suggestions)]
end
end
# snip
end