File Coverage

blib/lib/YAML/PP/Schema/Core.pm
Criterion Covered Total %
statement 46 46 100.0
branch 4 4 100.0
condition n/a
subroutine 9 9 100.0
pod 1 1 100.0
total 60 60 100.0


line stmt bran cond sub pod time code
1 28     28   174143 use strict;
  28         61  
  28         982  
2 28     28   126 use warnings;
  28         115  
  28         2569  
3             package YAML::PP::Schema::Core;
4              
5             our $VERSION = 'v0.40.0'; # VERSION
6              
7 28         2294 use YAML::PP::Schema::JSON qw/
8             represent_int represent_float represent_literal represent_bool
9             represent_undef
10 28     28   603 /;
  28         59  
11              
12 28     28   123 use B;
  28         40  
  28         749  
13              
14 28     28   101 use YAML::PP::Common qw/ YAML_PLAIN_SCALAR_STYLE /;
  28         36  
  28         18703  
15              
16             my $RE_INT_CORE = qr{^([+-]?(?:[0-9]+))$};
17             my $RE_FLOAT_CORE = qr{^([+-]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)(?:[eE][+-]?[0-9]+)?)$};
18             my $RE_INT_OCTAL = qr{^0o([0-7]+)$};
19             my $RE_INT_HEX = qr{^0x([0-9a-fA-F]+)$};
20              
21 6     6   28 sub _from_oct { oct $_[2]->[0] }
22 10     10   49 sub _from_hex { hex $_[2]->[0] }
23              
24             sub register {
25 730     730 1 2504 my ($self, %args) = @_;
26 730         1255 my $schema = $args{schema};
27              
28             $schema->add_resolver(
29             tag => 'tag:yaml.org,2002:null',
30             match => [ equals => $_ => undef ],
31 730         3125 ) for (qw/ null NULL Null ~ /, '');
32             $schema->add_resolver(
33             tag => 'tag:yaml.org,2002:bool',
34             match => [ equals => $_ => $schema->true ],
35 730         2007 ) for (qw/ true TRUE True /);
36             $schema->add_resolver(
37             tag => 'tag:yaml.org,2002:bool',
38             match => [ equals => $_ => $schema->false ],
39 730         1878 ) for (qw/ false FALSE False /);
40 730         2313 $schema->add_resolver(
41             tag => 'tag:yaml.org,2002:int',
42             match => [ regex => $RE_INT_CORE => \&YAML::PP::Schema::JSON::_to_int ],
43             );
44 730         2532 $schema->add_resolver(
45             tag => 'tag:yaml.org,2002:int',
46             match => [ regex => $RE_INT_OCTAL => \&_from_oct ],
47             );
48 730         2011 $schema->add_resolver(
49             tag => 'tag:yaml.org,2002:int',
50             match => [ regex => $RE_INT_HEX => \&_from_hex ],
51             );
52 730         2042 $schema->add_resolver(
53             tag => 'tag:yaml.org,2002:float',
54             match => [ regex => $RE_FLOAT_CORE => \&YAML::PP::Schema::JSON::_to_float ],
55             );
56             $schema->add_resolver(
57             tag => 'tag:yaml.org,2002:float',
58             match => [ equals => $_ => 0 + "inf" ],
59 730         2257 ) for (qw/ .inf .Inf .INF +.inf +.Inf +.INF /);
60             $schema->add_resolver(
61             tag => 'tag:yaml.org,2002:float',
62             match => [ equals => $_ => 0 - "inf" ],
63 730         1677 ) for (qw/ -.inf -.Inf -.INF /);
64             $schema->add_resolver(
65             tag => 'tag:yaml.org,2002:float',
66             match => [ equals => $_ => 0 + "nan" ],
67 730         1812 ) for (qw/ .nan .NaN .NAN /);
68             $schema->add_resolver(
69             tag => 'tag:yaml.org,2002:str',
70 730     3330   3799 match => [ all => sub { $_[1]->{value} } ],
  3330         9033  
71             );
72              
73 730         1247 my $int_flags = B::SVp_IOK;
74 730         892 my $float_flags = B::SVp_NOK;
75 730         2329 $schema->add_representer(
76             flags => $int_flags,
77             code => \&represent_int,
78             );
79 730         1924 $schema->add_representer(
80             flags => $float_flags,
81             code => \&represent_float,
82             );
83 730         1621 $schema->add_representer(
84             undefined => \&represent_undef,
85             );
86             $schema->add_representer(
87             equals => $_,
88             code => \&represent_literal,
89 730         2128 ) for ("", qw/
90             true TRUE True false FALSE False null NULL Null ~
91             .inf .Inf .INF +.inf +.Inf +.INF -.inf -.Inf -.INF .nan .NaN .NAN
92             /);
93 730         8724 $schema->add_representer(
94             regex => qr{$RE_INT_CORE|$RE_FLOAT_CORE|$RE_INT_OCTAL|$RE_INT_HEX},
95             code => \&represent_literal,
96             );
97              
98 730 100       1573 if ($schema->bool_class) {
99 726         840 for my $class (@{ $schema->bool_class }) {
  726         1135  
100 726 100       1446 if ($class eq 'perl') {
101 136         356 $schema->add_representer(
102             bool => 1,
103             code => \&represent_bool,
104             );
105 136         233 next;
106             }
107             $schema->add_representer(
108 590         997 class_equals => $class,
109             code => \&represent_bool,
110             );
111             }
112             }
113              
114 730         2804 return;
115             }
116              
117             1;
118              
119             __END__