File Coverage

blib/lib/JSON/TinyValidatorV4.pm
Criterion Covered Total %
statement 4 6 66.6
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 6 8 75.0


line stmt bran cond sub pod time code
1             package JSON::TinyValidatorV4;
2             $JSON::TinyValidatorV4::VERSION = '0.003';
3 1     1   1298 use File::ShareDir 'dist_file';
  1         19557  
  1         92  
4 1     1   292 use JavaScript::V8;
  0            
  0            
5             use Moo;
6              
7             use strict;
8             use warnings;
9              
10             has 'cx' => ( is => 'lazy' );
11              
12             =head1 NAME
13              
14             JSON::TinyValidatorV4 - JSON Validator for v4 JSON Schema
15              
16             =head1 SYNOPSIS
17              
18             use JSON::TinyValidatorV4;
19             use Data::Dumper;
20              
21             my $schema = {
22             type => 'object',
23             properties => {
24             latitude => { type => 'number' },
25             longitude => { type => 'number' }
26             }
27             };
28              
29             my $data = { longitude => -128.323746, latitude => -24.375870, elevation=> 23.1 };
30              
31             my $tv4 = JSON::TinyValidatorV4->new;
32              
33             print $tv4->validate( $data, $schema ), "\n"; # prints "1"
34             print $tv4->validate( $data, $schema, 0, 1 ), "\n"; # prints "0"
35              
36             print Dumper( $tv4->validateResult( $data, $schema, 0, 1 ) );
37             # prints:
38             # $VAR1 = {
39             # 'valid' => 0,
40             # 'error' => {
41             # 'message' => 'Unknown property (not in schema)',
42             # 'dataPath' => '/elevation',
43             # ...
44             # },
45             # 'missing' => []
46             # };
47              
48             =head1 DESCRIPTION
49              
50             This package is a wrapper for Tiny Validator. It uses json-schema draft v4
51             to validate simple values and complex objects. For details see also SEE ALSO.
52              
53             =cut
54              
55             sub _build_cx {
56             my $cx = JavaScript::V8::Context->new();
57             open( my $fh, "<", dist_file( 'JSON-TinyValidatorV4', 'tv4.min.js' ) ) or die "tv4.min.js: $!";
58             $cx->eval( do { local $/; <$fh> } );
59             close $fh;
60             return $cx;
61             }
62              
63             =pod
64              
65             =head2 validate( $data, $schema, [ $checkRecursive=0, $banUnknownProperties=0 ] )
66              
67             validates $data with $schema. $checkRecursive and $banUnknownProperties are false
68             by default. returns 0 or 1.
69              
70             =cut
71              
72             sub validate {
73             my ( $self, @args ) = @_;
74             $self->cx->bind( args => \@args );
75             return $self->cx->eval('tv4.validate.apply(this,args)') // die $@;
76             }
77              
78             =pod
79              
80             =head2 validateResult( $data, $schema, [ $checkRecursive=0, $banUnknownProperties=0 ] )
81              
82             validates $data with $schema. $checkRecursive and $banUnknownProperties are false
83             by default. returns an result hash:
84              
85             {
86             valid => 0,
87             error => {...},
88             missing => [...]
89             }
90              
91             =cut
92              
93             sub validateResult {
94             my ( $self, @args ) = @_;
95             $self->cx->bind( args => \@args );
96             return $self->cx->eval('r={};tv4.validate.apply(r,args);r') // die $@;
97             }
98              
99             =head1 SEE ALSO
100              
101             Tiny Validator at github: L
102              
103             =head1 AUTHORS
104              
105             Michael Langner, mila at cpan dot org
106              
107             =head1 THANKS
108              
109             This package uses an embedded copy of
110             Tiny Validator (L)
111             to do all the validation work.
112              
113             =head1 COPYRIGHT & LICENSE
114              
115             Copyright 2015 Michael Langner, all rights reserved.
116              
117             This program is free software; you can redistribute it and/or modify it under the
118             same terms as Perl itself.
119              
120             =cut
121              
122             !0; # 3a59124cfcc7ce26274174c962094a20