1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
package GraphQL::Type::InputObject;
use 5.014;
use strict;
use warnings;
use Moo;
use Types::Standard -all;
use GraphQL::Type::Library -all;
use GraphQL::MaybeTypeCheck;
use GraphQL::Debug qw(_debug);
extends qw(GraphQL::Type);
with qw(
GraphQL::Role::Input
GraphQL::Role::Nullable
GraphQL::Role::Named
GraphQL::Role::FieldsInput
GraphQL::Role::HashMappable
GraphQL::Role::FieldsEither
);
our $VERSION = '0.02';
use constant DEBUG => $ENV{GRAPHQL_DEBUG};
=head1 NAME
GraphQL::Type::InputObject - GraphQL input object type
=head1 SYNOPSIS
use GraphQL::Type::InputObject;
my $type = GraphQL::Type::InputObject->new(
name => 'InputObject',
fields => { field_name => { type => $scalar_type, resolve => sub { '' } }},
);
=head1 ATTRIBUTES
Has C<name>, C<description> from L<GraphQL::Role::Named>.
Has C<fields> from L<GraphQL::Role::FieldsInput>.
=head1 METHODS
=head2 is_valid
True if given Perl hash-ref is a valid value for this type.
=cut
method is_valid(Maybe[HashRef] $item) :ReturnType(Bool) {
return 1 if !defined $item;
my $fields = $self->fields;
return if grep !$fields->{$_}{type}->is_valid(
$item->{$_} // $fields->{$_}{default_value}
), keys %$fields;
1;
}
=head2 uplift
Turn given Perl entity into valid value for this type if possible. Applies
default values.
=cut
method uplift(Maybe[HashRef] $item) :ReturnType(Maybe[HashRef]) {
return $item if !defined $item;
my $fields = $self->fields;
$self->hashmap($item, $fields, sub {
my ($key, $value) = @_;
$fields->{$key}{type}->uplift(
$value // $fields->{$key}{default_value}
);
});
}
method graphql_to_perl(ExpectObject $item) :ReturnType(Maybe[HashRef]) {
return $item if !defined $item;
$item = $self->uplift($item);
my $fields = $self->fields;
$self->hashmap($item, $fields, sub {
$fields->{$_[0]}{type}->graphql_to_perl($_[1]);
});
}
method perl_to_graphql(ExpectObject $item) :ReturnType(Maybe[HashRef]) {
return $item if !defined $item;
$item = $self->uplift($item);
my $fields = $self->fields;
$self->hashmap($item, $fields, sub {
$fields->{$_[0]}{type}->perl_to_graphql($_[1]);
});
}
method from_ast(
HashRef $name2type,
HashRef $ast_node,
) :ReturnType(InstanceOf[__PACKAGE__]) {
$self->new(
$self->_from_ast_named($ast_node),
$self->_from_ast_fields($name2type, $ast_node, 'fields'),
);
}
has to_doc => (is => 'lazy', isa => Str);
sub _build_to_doc {
my ($self) = @_;
DEBUG and _debug('InputObject.to_doc', $self);
my @fieldlines = map {
my ($main, @description) = @$_;
(
@description,
$main,
)
} $self->_make_fieldtuples($self->fields);
join '', map "$_\n",
$self->_description_doc_lines($self->description),
"input @{[$self->name]} {",
(map length() ? " $_" : "", @fieldlines),
"}";
}
__PACKAGE__->meta->make_immutable();
1;
|