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 ($property->{'type'} eq 'boolean') {
48 $param_value{$property_name} = $given_params{$param_name}->{$property_name} ? JSON::true : JSON::false;
51 $param_value{$property_name} = $given_params{$param_name}->{$property_name};
54 $body_params{$param_name} = \%param_value;
55 } elsif ($param->{'type'} eq 'boolean') {
56 $body_params{$param_name} = $given_params{$param_name} ? JSON::true : JSON::false;
58 $body_params{$param_name} = $given_params{$param_name};
61 my $r = $self->{'resourceAccessor'}->{'api'}->new_request;
62 $r->set_uri($self->{'resourceAccessor'}->{'api'}->{'discoveryDocument'}->{'baseUrl'} . "/" . $path);
63 $r->set_method($method->{'httpMethod'});
64 $r->set_auth_token($self->{'resourceAccessor'}->{'api'}->{'authToken'});
65 $r->set_query_params(\%body_params) if %body_params;
66 $r->process_request();
68 my ($status_number, $status_phrase) = $r->get_status();
69 if ($status_number != 200) {
70 croak("API call failed: $status_number $status_phrase\n". $r->get_body());
72 $data = $r->get_body();
73 $headers = $r->get_headers();
74 my $result = JSON::decode_json($data);
75 if ($method->{'response'}->{'$ref'} =~ /List$/) {
76 Arvados::ResourceProxyList->new($result, $self->{'resourceAccessor'});
78 Arvados::ResourceProxy->new($result, $self->{'resourceAccessor'});