defmodule NifValidator do @moduledoc """ Documentation for NifValidator. """ @dni_size 9 @dni_checkcontrol [ "T", "R", "W", "A", "G", "M", "Y", "F", "P", "D", "X", "B", "N", "J", "Z", "S", "Q", "V", "H", "L", "C", "K", "E" ] @doc """ ## Examples iex> NifValidator.valid?("123amix") false """ def valid?(nif) when is_list(nif), do: nif |> to_string |> valid? def valid?(nif) when byte_size(nif) < @dni_size, do: nif |> String.pad_leading(@dni_size, "0") |> valid? def valid?(<>) do numbers |> Integer.parse() |> case do {integer_numbers, ""} -> String.upcase(letter) == checksum_letter(rem(integer_numbers, 23)) _ -> false end end def valid?(_), do: false @dni_checkcontrol |> Enum.with_index() |> Enum.map(fn {letter, index} -> def checksum_letter(unquote(index)), do: unquote(letter) end) end