Skip to content

Commit 3e3858e

Browse files
committed
code refactor
1 parent f230727 commit 3e3858e

File tree

6 files changed

+102
-100
lines changed

6 files changed

+102
-100
lines changed

lib/polish_validators/common.ex

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
defmodule PolishValidators.Common do
2+
import String, only: [split: 3, length: 1, to_integer: 1]
3+
import Enum, only: [map: 2]
4+
import Kernel, except: [length: 1]
5+
6+
#@moduledoc """
7+
#Provides common functions to polish validators.
8+
#"""
9+
10+
@moduledoc false
11+
12+
@doc """
13+
Validate length of passed string.
14+
15+
## Examples
16+
17+
iex> PolishValidators.Common.validate_length("1234", 4)
18+
{ :ok, "1234" }
19+
20+
iex> PolishValidators.Common.validate_length("1234", [2, 4])
21+
{ :ok, "1234" }
22+
23+
iex> PolishValidators.Common.validate_length("1234", 5)
24+
{ :error, "Invalid length" }
25+
26+
"""
27+
def validate_length(string, valid_length) do
28+
valid_length = cond do
29+
is_number(valid_length) -> [valid_length]
30+
is_list(valid_length) -> valid_length
31+
end
32+
33+
cond do
34+
length(string) in valid_length -> { :ok, string }
35+
true -> { :error, "Invalid length" }
36+
end
37+
end
38+
39+
@doc """
40+
Validate passed checksum with control digit.
41+
42+
## Examples
43+
44+
iex> PolishValidators.Common.validate_checksum(2, 2)
45+
{ :ok, "Valid" }
46+
47+
iex> PolishValidators.Common.validate_checksum(2, 1)
48+
{ :error, "Wrong checksum" }
49+
50+
"""
51+
def validate_checksum(checksum, control_digit) do
52+
if (checksum == control_digit) do
53+
{ :ok, "Valid" }
54+
else
55+
{ :error, "Wrong checksum" }
56+
end
57+
end
58+
59+
@doc """
60+
Convert string to list of integers.
61+
62+
## Examples
63+
64+
iex> PolishValidators.Common.to_integers_list("123")
65+
[1, 2, 3]
66+
67+
"""
68+
def to_integers_list(number) do
69+
to_string(number)
70+
|> split("", trim: true)
71+
|> map(&(to_integer(&1)))
72+
end
73+
end

lib/polish_validators/iban.ex

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
defmodule PolishValidators.Iban do
2-
import String, only: [replace_prefix: 3, slice: 2, to_integer: 1, length: 1]
3-
import Kernel, except: [length: 1]
2+
import String, only: [replace_prefix: 3, slice: 2, to_integer: 1]
3+
import PolishValidators.Common
44

55
@moduledoc """
66
Provides function validate/1 to check IBAN (PL) number.
@@ -24,34 +24,21 @@ defmodule PolishValidators.Iban do
2424
{ :error, "Invalid length" }
2525
2626
"""
27-
2827
def validate(iban) do
2928
iban_length = replace_prefix(iban, "PL", "")
30-
|> validate_length
29+
|> validate_length(26)
3130

3231
case iban_length do
3332
{ :ok, iban } ->
34-
validate_checksum(iban)
33+
calculate_checksum(iban)
34+
|> validate_checksum(1)
3535
_ -> iban_length
3636
end
3737
end
3838

39-
defp validate_length(iban) do
40-
case length(iban) do
41-
26 -> { :ok, iban }
42-
_ -> { :error, "Invalid length" }
43-
end
44-
end
45-
46-
defp validate_checksum(iban) do
47-
checksum = "#{slice(iban, 2..-1)}2521#{slice(iban, 0..1)}"
48-
|> to_integer
49-
|> rem(97)
50-
51-
if (checksum == 1) do
52-
{ :ok, "Valid" }
53-
else
54-
{ :error, "Wrong checksum" }
55-
end
39+
defp calculate_checksum(iban) do
40+
"#{slice(iban, 2..-1)}2521#{slice(iban, 0..1)}"
41+
|> to_integer
42+
|> rem(97)
5643
end
5744
end

lib/polish_validators/nip.ex

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
defmodule PolishValidators.Nip do
2-
import String, only: [split: 3, to_integer: 1, length: 1]
32
import Enum, only: [zip: 1, reduce: 3, map: 2]
43
import List, only: [last: 1]
5-
import Kernel, except: [length: 1]
4+
import PolishValidators.Common
65

76
@weights [6, 5, 7, 2, 3, 4, 5, 6, 7]
87

@@ -25,47 +24,26 @@ defmodule PolishValidators.Nip do
2524
{ :error, "Invalid length" }
2625
2726
"""
28-
2927
def validate(nip) do
30-
nip_length = validate_length(nip)
28+
nip_length = validate_length(nip, 10)
3129

3230
case nip_length do
3331
{ :ok, nip } ->
3432
nip_integers_list = to_integers_list(nip)
3533
[nip_integers_list, @weights]
3634
|> zip
3735
|> calculate_checksum
38-
|> validate_checksum(nip_integers_list)
36+
|> validate_checksum(last(nip_integers_list))
3937
_ -> nip_length
4038
end
4139
end
4240

43-
defp validate_length(nip) do
44-
case length(nip) do
45-
10 -> { :ok, nip }
46-
_ -> { :error, "Invalid length" }
47-
end
48-
end
49-
50-
defp to_integers_list(nip) do
51-
to_string(nip)
52-
|> split("", trim: true)
53-
|> map(&(to_integer(&1)))
54-
end
55-
5641
defp calculate_checksum(nip) do
5742
reduce(nip, 0, &reduce_checksum/2)
43+
|> rem(11)
5844
end
5945

6046
defp reduce_checksum(nip, acc) do
6147
acc + elem(nip, 0) * elem(nip, 1)
6248
end
63-
64-
defp validate_checksum(checksum, nip_integers_list) do
65-
if rem(checksum, 11) == last(nip_integers_list) do
66-
{ :ok, "Valid" }
67-
else
68-
{ :error, "Wrong checksum" }
69-
end
70-
end
7149
end

lib/polish_validators/pesel.ex

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
defmodule PolishValidators.Pesel do
2-
import String, only: [split: 3, length: 1, to_integer: 1]
32
import Enum, only: [zip: 1, reduce: 3, map: 2]
43
import List, only: [last: 1]
5-
import Kernel, except: [length: 1]
4+
import PolishValidators.Common
65

76
@weights [1, 3, 7, 9, 1, 3, 7, 9, 1, 3]
87

@@ -27,48 +26,28 @@ defmodule PolishValidators.Pesel do
2726
"""
2827
#def validate(pesel) do#when is_binary(pesel) do
2928
def validate(pesel) do
30-
pesel_length = validate_length(pesel)
29+
pesel_length = validate_length(pesel, 11)
3130

3231
case pesel_length do
3332
{ :ok, pesel } ->
3433
pesel_integers_list = to_integers_list(pesel)
3534
[pesel_integers_list, @weights]
3635
|> zip
3736
|> calculate_checksum
38-
|> validate_checksum(pesel_integers_list)
37+
|> validate_checksum(last(pesel_integers_list))
3938
_ -> pesel_length
4039
end
4140
end
4241

43-
defp to_integers_list(pesel) do
44-
to_string(pesel)
45-
|> split("", trim: true)
46-
|> map(&(to_integer(&1)))
47-
end
48-
49-
defp validate_length(pesel) do
50-
case length(pesel) do
51-
11 -> { :ok, pesel }
52-
_ -> { :error, "Invalid length" }
53-
end
54-
end
55-
5642
defp calculate_checksum(pesel) do
57-
reduce(pesel, 0, &reduce_checksum/2)
43+
(10 - (reduce(pesel, 0, &reduce_checksum/2) |> rem(10)))
44+
|> rem(10)
5845
end
5946

6047
defp reduce_checksum(pesel, acc) do
6148
acc + elem(pesel, 0) * elem(pesel, 1)
6249
end
6350

64-
defp validate_checksum(checksum, pesel_integers_list) do
65-
if (10 - (rem(checksum, 10))) |> rem(10) == last(pesel_integers_list) do
66-
{ :ok, "Valid" }
67-
else
68-
{ :error, "Wrong checksum" }
69-
end
70-
end
71-
7251
#def validate(pesel) do
7352
# throw "Pesel must be a string."
7453
#end

lib/polish_validators/regon.ex

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
defmodule PolishValidators.Regon do
2-
import String, only: [split: 3, to_integer: 1, length: 1]
3-
import Enum, only: [zip: 1, reduce: 3, map: 2]
2+
import String, only: [length: 1]
3+
import Enum, only: [zip: 1, reduce: 3]
44
import List, only: [last: 1]
55
import Kernel, except: [length: 1]
6+
import PolishValidators.Common
67

78
@weights9 [8, 9, 2, 3, 4, 5, 6, 7]
89
@weights14 [2, 4, 8, 5, 0, 9, 7, 3, 6, 1, 2, 4, 8]
@@ -32,17 +33,16 @@ defmodule PolishValidators.Regon do
3233
{ :error, "Invalid length" }
3334
3435
"""
35-
3636
def validate(regon) do
37-
regon_length = validate_length(regon)
37+
regon_length = validate_length(regon, [9, 14])
3838

3939
case regon_length do
4040
{ :ok, regon } ->
4141
regon_integers_list = to_integers_list(regon)
4242
[regon_integers_list, weights(regon)]
4343
|> zip
4444
|> calculate_checksum
45-
|> validate_checksum(regon_integers_list)
45+
|> validate_checksum(last(regon_integers_list))
4646
_ -> regon_length
4747
end
4848
end
@@ -54,32 +54,12 @@ defmodule PolishValidators.Regon do
5454
end
5555
end
5656

57-
defp validate_length(regon) do
58-
case length(regon) do
59-
n when n in [9, 14] -> { :ok, regon }
60-
_ -> { :error, "Invalid length" }
61-
end
62-
end
63-
64-
defp to_integers_list(regon) do
65-
to_string(regon)
66-
|> split("", trim: true)
67-
|> map(&(to_integer(&1)))
68-
end
69-
7057
defp calculate_checksum(regon) do
7158
reduce(regon, 0, &reduce_checksum/2)
59+
|> rem(11)
7260
end
7361

7462
defp reduce_checksum(regon, acc) do
7563
acc + elem(regon, 0) * elem(regon, 1)
7664
end
77-
78-
defp validate_checksum(checksum, regon_integers_list) do
79-
if rem(checksum, 11) == last(regon_integers_list) do
80-
{ :ok, "Valid" }
81-
else
82-
{ :error, "Wrong checksum" }
83-
end
84-
end
8565
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
defmodule PolishValidatorsCommonTest do
2+
use ExUnit.Case
3+
doctest PolishValidators.Common
4+
end
5+

0 commit comments

Comments
 (0)