package Mojolicious::Plugin::Vparam::Phone;
use Mojo::Base -strict;
use Mojolicious::Plugin::Vparam::Common;
sub check_phone($) {
return 'Value not defined' unless defined $_[0];
return 'Value is not set' unless length $_[0];
return 'The number should be in the format +...'
unless $_[0] =~ m{^\+\d};
return 'The number must be a minimum of 11 digits'
unless $_[0] =~ m{^\+\d{11}};
return 'The number should be no more than 16 digits'
unless $_[0] =~ m{^\+\d{11,16}(?:\D|$)};
return 'Wrong format'
unless $_[0] =~ m{^\+\d{11,16}(?:[pw]\d+)?$};
return 0;
}
sub fix_phone($$$) {
my ($sign, $phone, $code) = @_;
if( $code eq 'ru' ) {
unless( $sign ) {
s{^8}{7} for $phone;
}
}
return $phone;
}
sub parse_phone($$$$) {
my ($str, $country, $region, $fix_code) = @_;
return undef unless $str;
# Clear
s{[.,]}{w}g, s{[^0-9pw+]}{}ig, s{w{2,}}{w}ig, s{p{2,}}{p}ig for $str;
# Split
my ($sign, $phone, $pause, $add) = $str =~ m{^(\+)?(\d+)([wp])?(\d+)?$}i;
return undef unless $phone;
# Add country and region codes if defined
$phone = $region . $phone if $region and 11 > length $phone;
$phone = $country . $phone if $country and 11 > length $phone;
return undef unless 10 <= length $phone;
# Some country deprication fix
$phone = fix_phone $sign, $phone, $fix_code;
$str = '+' . $phone;
$str = $str . lc $pause if defined $pause;
$str = $str . $add if defined $add;
return $str;
}
sub register {
my ($class, $self, $app, $conf) = @_;
$app->vtype(
phone =>
pre => sub { parse_phone
trim( $_[1] ),
$conf->{phone_country},
$conf->{phone_region},
$conf->{phone_fix}
},
valid => sub { check_phone $_[1] },
);
return;
}
1;