summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--raku/phone-number/Phone.rakumod36
1 files changed, 35 insertions, 1 deletions
diff --git a/raku/phone-number/Phone.rakumod b/raku/phone-number/Phone.rakumod
index f2c828c..ef214b1 100644
--- a/raku/phone-number/Phone.rakumod
+++ b/raku/phone-number/Phone.rakumod
@@ -12,5 +12,39 @@ constant @errors = (
    'exchange code cannot start with one',
 );
 
-sub clean-number ($number) is export {
+sub clean-number(Str $number --> Str) is export {
+    die @errors[3] if $number.contains: /<alpha>/;
+
+    # <punct> matches "(";
+    die @errors[4] if $number.contains: /<[!:]>/;
+
+    given $number.comb.grep(/\d/)>>.Int {
+        when .elems == 11 {
+            die @errors[0] if .[0] !== 1;
+
+            # Area code.
+            die @errors[5] if .[1] == 0;
+            die @errors[6] if .[1] == 1;
+
+            # Exchange code.
+            die @errors[7] if .[4] == 0;
+            die @errors[8] if .[4] == 1;
+
+            return .skip.join;
+        }
+        when .elems == 10 {
+            # Area code.
+            die @errors[5] if .[0] == 0;
+            die @errors[6] if .[0] == 1;
+
+            # Exchange code.
+            die @errors[7] if .[3] == 0;
+            die @errors[8] if .[3] == 1;
+
+            return .join;
+        }
+        when .elems > 11 { die @errors[1] }
+        when .elems < 10 { die @errors[2] }
+        default { return .join }
+    }
 }