1 package Arvados::ResourceMethod;
10 return $self->_init(@_);
16 $self->{'resourceAccessor'} = shift;
17 $self->{'method'} = shift;
24 my $method = $self->{'method'};
26 my $path = $method->{'path'};
29 my %given_params = @_;
30 while (my ($param_name, $param) = each %{$method->{'parameters'}}) {
31 if ($param->{'required'} && !exists $given_params{$param_name}) {
32 croak("Required parameter not supplied: $param_name");
34 elsif ($param->{'location'} eq 'path') {
35 $path =~ s/{\Q$param_name\E}/$given_params{$param_name}/eg;
37 elsif (!exists $given_params{$param_name}) {
40 elsif ($param->{'type'} eq 'object') {
43 while (($property_name, $property) = each %{$param->{'properties'}}) {
44 if (!exists $given_params{$param_name}->{$property_name}) {
47 elsif ($given_params{$param_name}->{$property_name} eq undef) {
48 $param_value{$property_name} = JSON::null;
50 elsif ($property->{'type'} eq 'boolean') {
51 $param_value{$property_name} = $given_params{$param_name}->{$property_name} ? JSON::true : JSON::false;
54 $param_value{$property_name} = $given_params{$param_name}->{$property_name};
57 $body_params{$param_name} = \%param_value;
58 } elsif ($param->{'type'} eq 'boolean') {
59 $body_params{$param_name} = $given_params{$param_name} ? JSON::true : JSON::false;
61 $body_params{$param_name} = $given_params{$param_name};
64 my $r = $self->{'resourceAccessor'}->{'api'}->new_request;
65 $r->set_uri($self->{'resourceAccessor'}->{'api'}->{'discoveryDocument'}->{'baseUrl'} . "/" . $path);
66 $r->set_method($method->{'httpMethod'});
67 $r->set_auth_token($self->{'resourceAccessor'}->{'api'}->{'authToken'});
68 $r->set_query_params(\%body_params) if %body_params;
69 $r->process_request();
71 my ($status_number, $status_phrase) = $r->get_status();
72 if ($status_number != 200) {
73 croak("API call failed: $status_number $status_phrase\n". $r->get_body());
75 $data = $r->get_body();
76 $headers = $r->get_headers();
77 my $result = JSON::decode_json($data);
78 if ($method->{'response'}->{'$ref'} =~ /List$/) {
79 Arvados::ResourceProxyList->new($result, $self->{'resourceAccessor'});
81 Arvados::ResourceProxy->new($result, $self->{'resourceAccessor'});