File Coverage

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


line stmt bran cond sub pod time code
1 25     25   14447 use strict;
  25         52  
  25         748  
2 25     25   145 use warnings;
  25         59  
  25         1559  
3             package YAML::PP::Schema::Core;
4              
5             our $VERSION = '0.036'; # VERSION
6              
7 25         1879 use YAML::PP::Schema::JSON qw/
8             represent_int represent_float represent_literal represent_bool
9             represent_undef
10 25     25   155 /;
  25         69  
11              
12 25     25   179 use B;
  25         60  
  25         1336  
13              
14 25     25   209 use YAML::PP::Common qw/ YAML_PLAIN_SCALAR_STYLE /;
  25         61  
  25         18165  
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   43 sub _from_oct { oct $_[2]->[0] }
22 8     8   66 sub _from_hex { hex $_[2]->[0] }
23              
24             sub register {
25 159     159 1 601 my ($self, %args) = @_;
26 159         320 my $schema = $args{schema};
27              
28             $schema->add_resolver(
29             tag => 'tag:yaml.org,2002:null',
30             match => [ equals => $_ => undef ],
31 159         720 ) for (qw/ null NULL Null ~ /, '');
32             $schema->add_resolver(
33             tag => 'tag:yaml.org,2002:bool',
34             match => [ equals => $_ => $schema->true ],
35 159         592 ) for (qw/ true TRUE True /);
36             $schema->add_resolver(
37             tag => 'tag:yaml.org,2002:bool',
38             match => [ equals => $_ => $schema->false ],
39 159         567 ) for (qw/ false FALSE False /);
40 159         693 $schema->add_resolver(
41             tag => 'tag:yaml.org,2002:int',
42             match => [ regex => $RE_INT_CORE => \&YAML::PP::Schema::JSON::_to_int ],
43             );
44 159         669 $schema->add_resolver(
45             tag => 'tag:yaml.org,2002:int',
46             match => [ regex => $RE_INT_OCTAL => \&_from_oct ],
47             );
48 159         647 $schema->add_resolver(
49             tag => 'tag:yaml.org,2002:int',
50             match => [ regex => $RE_INT_HEX => \&_from_hex ],
51             );
52 159         652 $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 159         642 ) 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 159         612 ) for (qw/ -.inf -.Inf -.INF /);
64             $schema->add_resolver(
65             tag => 'tag:yaml.org,2002:float',
66             match => [ equals => $_ => 0 + "nan" ],
67 159         587 ) for (qw/ .nan .NaN .NAN /);
68             $schema->add_resolver(
69             tag => 'tag:yaml.org,2002:str',
70 159     1065   944 match => [ all => sub { $_[1]->{value} } ],
  1065         3486  
71             );
72              
73 159         307 my $int_flags = B::SVp_IOK;
74 159         275 my $float_flags = B::SVp_NOK;
75 159         607 $schema->add_representer(
76             flags => $int_flags,
77             code => \&represent_int,
78             );
79 159         476 $schema->add_representer(
80             flags => $float_flags,
81             code => \&represent_float,
82             );
83 159         456 $schema->add_representer(
84             undefined => \&represent_undef,
85             );
86             $schema->add_representer(
87             equals => $_,
88             code => \&represent_literal,
89 159         555 ) 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 159         3114 $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 159 100       474 if ($schema->bool_class) {
99 26         45 for my $class (@{ $schema->bool_class }) {
  26         50  
100 26         97 $schema->add_representer(
101             class_equals => $class,
102             code => \&represent_bool,
103             );
104             }
105             }
106              
107 159         950 return;
108             }
109              
110             1;
111              
112             __END__