Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ce90960649 | |||
| e7e6bbda29 | |||
| 6ec94020ef | |||
| dc1b802c77 |
@@ -1,6 +1,11 @@
|
|||||||
defmodule IbanEx.Commons do
|
defmodule IbanEx.Commons do
|
||||||
@moduledoc false
|
@moduledoc false
|
||||||
|
|
||||||
|
@spec blank(nil | binary()) :: nil | binary()
|
||||||
|
def blank(nil), do: nil
|
||||||
|
def blank(""), do: nil
|
||||||
|
def blank(string) when is_binary(string), do: string
|
||||||
|
|
||||||
@spec normalize(binary()) :: binary()
|
@spec normalize(binary()) :: binary()
|
||||||
def normalize(string) do
|
def normalize(string) do
|
||||||
string
|
string
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ defmodule IbanEx.Country.Template do
|
|||||||
|
|
||||||
@callback size() :: size()
|
@callback size() :: size()
|
||||||
@callback rule() :: rule()
|
@callback rule() :: rule()
|
||||||
|
@callback incomplete_rule() :: rule()
|
||||||
@callback to_string(Iban.t(), joiner()) :: String.t()
|
@callback to_string(Iban.t(), joiner()) :: String.t()
|
||||||
@callback to_string(Iban.t()) :: String.t()
|
@callback to_string(Iban.t()) :: String.t()
|
||||||
|
|
||||||
@@ -39,11 +40,33 @@ def to_string(
|
|||||||
@spec size() :: integer()
|
@spec size() :: integer()
|
||||||
def size(), do: @size
|
def size(), do: @size
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Return Regex for parsing complete BBAN (part of IBAN string)
|
||||||
|
"""
|
||||||
@impl IbanEx.Country.Template
|
@impl IbanEx.Country.Template
|
||||||
@spec rule() :: Regex.t()
|
@spec rule() :: Regex.t()
|
||||||
def rule(), do: @rule
|
def rule(), do: @rule
|
||||||
|
|
||||||
defoverridable to_string: 1, to_string: 2, size: 0, rule: 0
|
@doc """
|
||||||
|
Return Regex without trailing “$” for parsing incomplete BBAN (part of IBAN string) (for partial suggestions)
|
||||||
|
"""
|
||||||
|
@impl IbanEx.Country.Template
|
||||||
|
@spec incomplete_rule() :: Regex.t()
|
||||||
|
def incomplete_rule() do
|
||||||
|
source =
|
||||||
|
@rule
|
||||||
|
|> Regex.source()
|
||||||
|
|> String.slice(0..-2//1)
|
||||||
|
|> String.replace("{", "{0,")
|
||||||
|
|
||||||
|
opts =
|
||||||
|
@rule
|
||||||
|
|> Regex.opts()
|
||||||
|
|
||||||
|
Regex.compile!(source, opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
defoverridable to_string: 1, to_string: 2, size: 0, rule: 0, incomplete_rule: 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -42,11 +42,29 @@ def parse(iban_string) do
|
|||||||
end
|
end
|
||||||
|
|
||||||
@spec parse_bban(binary(), <<_::16>>) :: map()
|
@spec parse_bban(binary(), <<_::16>>) :: map()
|
||||||
def parse_bban(bban_string, country_code) do
|
def parse_bban(bban_string, country_code, options \\ [incomplete: false])
|
||||||
regex = Country.country_module(country_code).rule()
|
|
||||||
for {key, val} <- Regex.named_captures(regex, bban_string),
|
def parse_bban(bban_string, country_code, incomplete: true) do
|
||||||
into: %{},
|
Country.country_module(country_code).incomplete_rule()
|
||||||
do: {String.to_atom(key), val}
|
|> parse_bban_by_regex(bban_string)
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_bban(bban_string, country_code, _options) do
|
||||||
|
Country.country_module(country_code).rule()
|
||||||
|
|> parse_bban_by_regex(bban_string)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parse_bban_by_regex(_regex, nil), do: %{}
|
||||||
|
defp parse_bban_by_regex(regex, bban_string) do
|
||||||
|
case Regex.named_captures(regex, bban_string) do
|
||||||
|
map when is_map(map) ->
|
||||||
|
for {key, val} <- map,
|
||||||
|
into: %{},
|
||||||
|
do: {String.to_atom(key), val}
|
||||||
|
|
||||||
|
nil ->
|
||||||
|
%{}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec country_code(iban_string()) :: country_code_string()
|
@spec country_code(iban_string()) :: country_code_string()
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ def iban_violates_country_rule?(iban) do
|
|||||||
rule <- country_module.rule() do
|
rule <- country_module.rule() do
|
||||||
!Regex.match?(rule, bban)
|
!Regex.match?(rule, bban)
|
||||||
else
|
else
|
||||||
{:error, _error} -> true
|
_ -> true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user