aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/Open311/Endpoint/Schema/Regex.pm
blob: a79542198f7264b3aed0b7d3eab6bec203ea7b12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use strict; use warnings;
package Open311::Endpoint::Schema::Regex;
use parent 'Data::Rx::CommonType::EasyNew';

use Carp ();

sub type_uri {
    'tag:wiki.open311.org,GeoReport_v2:rx/regex',
}

sub guts_from_arg {
    my ($class, $arg, $rx) = @_;
    $arg ||= {};

    my $pattern = delete $arg->{pattern};
    my $message = delete $arg->{message};
    if (my @unexpected = keys %$arg) {
        Carp::croak sprintf "Unknown arguments %s in constructing %s",
            (join ',' => @unexpected), $class->type_uri;
    }

    return {
        str_schema => $rx->make_schema('//str'),
        pattern => qr/$pattern/,
        message => $message,
    };
}

sub assert_valid {
    my ($self, $value) = @_;

    $self->{str_schema}->assert_valid( $value );

    return 1 if $value =~ $self->{pattern};

    $self->fail({
        error => [ qw(type) ],
        message => $self->{message} || "found value doesn't match regex",
        value => $value,
    })
}

1;