JSON-Schema-Modern-Document-OpenAPI
view release on metacpan or search on metacpan
lib/OpenAPI/Modern.pm view on Meta::CPAN
use strict;
use warnings;
package OpenAPI::Modern;
# vim: set ts=8 sts=2 sw=2 tw=100 et :
# ABSTRACT: Validate HTTP requests and responses against an OpenAPI document
# KEYWORDS: validation evaluation JSON Schema OpenAPI Swagger HTTP request response
our $VERSION = '0.020';
use 5.020; # for fc, unicode_strings features
use Moo;
use strictures 2;
use experimental qw(signatures postderef);
use if "$]" >= 5.022, experimental => 're_strict';
no if "$]" >= 5.031009, feature => 'indirect';
no if "$]" >= 5.033001, feature => 'multidimensional';
no if "$]" >= 5.033006, feature => 'bareword_filehandles';
use Carp 'croak';
use Safe::Isa;
use Ref::Util qw(is_plain_hashref is_plain_arrayref is_ref);
use List::Util 'first';
use Scalar::Util 'looks_like_number';
use Feature::Compat::Try;
use Encode 2.89;
use URI::Escape ();
use JSON::Schema::Modern 0.531;
use JSON::Schema::Modern::Utilities 0.531 qw(jsonp unjsonp canonical_uri E abort is_equal);
use JSON::Schema::Modern::Document::OpenAPI;
use MooX::HandlesVia;
use MooX::TypeTiny 0.002002;
use Types::Standard 'InstanceOf';
use constant { true => JSON::PP::true, false => JSON::PP::false };
use namespace::clean;
has openapi_document => (
is => 'ro',
isa => InstanceOf['JSON::Schema::Modern::Document::OpenAPI'],
required => 1,
handles => {
openapi_uri => 'canonical_uri', # Mojo::URL
openapi_schema => 'schema', # hashref
},
);
# held separately because $document->evaluator is a weak ref
has evaluator => (
is => 'ro',
isa => InstanceOf['JSON::Schema::Modern'],
required => 1,
handles => [ qw(get_media_type add_media_type) ],
);
around BUILDARGS => sub ($orig, $class, @args) {
my $args = $class->$orig(@args);
if (exists $args->{openapi_document}) {
$args->{evaluator} = $args->{openapi_document}->evaluator;
}
else {
# construct document out of openapi_uri, openapi_schema, evaluator, if provided.
croak 'missing required constructor arguments: either openapi_document, or openapi_uri'
if not exists $args->{openapi_uri};
croak 'missing required constructor arguments: either openapi_document, or openapi_schema'
if not exists $args->{openapi_schema};
$args->{evaluator} //= JSON::Schema::Modern->new(validate_formats => 1, max_traversal_depth => 80);
$args->{openapi_document} = JSON::Schema::Modern::Document::OpenAPI->new(
canonical_uri => $args->{openapi_uri},
schema => $args->{openapi_schema},
evaluator => $args->{evaluator},
);
$args->{evaluator}->add_schema($args->{openapi_document});
}
return $args;
};
sub validate_request ($self, $request, $options = {}) {
my $state = {
( run in 0.610 second using v1.01-cache-2.11-cpan-ceb78f64989 )