GraphQL-Plugin-Convert-OpenAPI
view release on metacpan or search on metacpan
lib/GraphQL/Plugin/Convert/OpenAPI.pm view on Meta::CPAN
}
sub _resolve_schema_ref {
my ($obj, $schema) = @_;
my $ref = $obj->{'$ref'};
return $obj if !$ref;
$ref =~ s{^#}{};
$schema->get($ref);
}
sub _kind2name2endpoint {
my ($paths, $schema, $name2type, $type2info) = @_;
my %kind2name2endpoint;
for my $path (keys %$paths) {
for my $method (grep $paths->{$path}{$_}, @METHODS) {
my $info = $paths->{$path}{$method};
my $op_id = $info->{operationId} || $method.'_'._trim_name($path);
my $fieldname = _trim_name($op_id);
my $kind = $METHOD2MUTATION{$method} ? 'mutation' : 'query';
$type2info->{ucfirst $kind}{field2operationId}{$fieldname} = $op_id;
my @successresponses = map _resolve_schema_ref($_, $schema),
map $info->{responses}{$_},
grep /^2/, keys %{$info->{responses}};
DEBUG and _debug("_kind2name2endpoint($path)($method)($fieldname)($op_id)", $info->{responses}, \@successresponses);
my @responsetypes = map _get_type(
$_->{schema}, $fieldname.'Return',
$name2type,
$type2info,
), @successresponses;
@responsetypes = ('String') if !@responsetypes; # void return
my $union = _make_union(
\@responsetypes,
$name2type,
);
lib/GraphQL/Plugin/Convert/OpenAPI.pm view on Meta::CPAN
$type2info,
);
$type2info->{$pseudo_type}{field2is_hashpair}{$argfield} = $is_hashpair
if $is_hashpair;
$type2info->{$pseudo_type}{field2type}{$argfield} = $type;
($argfield => {
type => _apply_modifier($_->{required} && 'non_null', $type),
$_->{description} ? (description => $_->{description}) : (),
})
} @parameters;
DEBUG and _debug("_kind2name2endpoint($fieldname) params", \%args);
my $description = $info->{summary} || $info->{description};
$kind2name2endpoint{$kind}->{$fieldname} = +{
type => $union,
$description ? (description => $description) : (),
%args ? (args => \%args) : (),
};
}
}
(\%kind2name2endpoint);
}
# possible "kind"s: scalar enum type input union interface
# mutates %$name2typeused - is boolean
sub _walk_type {
my ($name, $name2typeused, $name2type) = @_;
DEBUG and _debug("OpenAPI._walk_type", $name, $name2typeused);#, $name2type
return if $name2typeused->{$name}; # seen - stop
return if $TYPE2SCALAR{$name}; # builtin scalar - stop
$name2typeused->{$name} = 1;
lib/GraphQL/Plugin/Convert/OpenAPI.pm view on Meta::CPAN
);
}
# now interface-consumers and can now put in interface fields too
for my $name (grep $defs->{$_}{allOf}, keys %$defs) {
_get_spec_from_info(
_trim_name($name), $defs->{$name},
\%name2type,
\%type2info,
);
}
my ($kind2name2endpoint) = _kind2name2endpoint(
$openapi_schema->get("/paths"), $openapi_schema,
\%name2type,
\%type2info,
);
for my $kind (keys %$kind2name2endpoint) {
$name2type{ucfirst $kind} = +{
kind => 'type',
name => ucfirst $kind,
fields => { %{ $kind2name2endpoint->{$kind} } },
};
}
my %name2typeused;
_walk_type(ucfirst $_, \%name2typeused, \%name2type)
for keys %$kind2name2endpoint;
push @ast, map $name2type{$_}, keys %name2typeused;
+{
schema => GraphQL::Schema->from_ast(\@ast),
root_value => OpenAPI::Client->new($openapi_schema->data, %appargs),
resolver => make_field_resolver(\%type2info),
};
}
=encoding utf-8
( run in 0.256 second using v1.01-cache-2.11-cpan-2b1a40005be )