392251f48f9ff04ef1511a1b76f0f0732622a3cf
[arvados.git] / sdk / perl / lib / Arvados / ResourceMethod.pm
1 package Arvados::ResourceMethod;
2 use Carp;
3 use Data::Dumper;
4
5 sub new
6 {
7     my $class = shift;
8     my $self = {};
9     bless ($self, $class);
10     return $self->_init(@_);
11 }
12
13 sub _init
14 {
15     my $self = shift;
16     $self->{'resourceAccessor'} = shift;
17     $self->{'method'} = shift;
18     return $self;
19 }
20
21 sub execute
22 {
23     my $self = shift;
24     my $method = $self->{'method'};
25
26     my $path = $method->{'path'};
27
28     my %body_params;
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");
33         }
34         elsif ($param->{'location'} eq 'path') {
35             $path =~ s/{\Q$param_name\E}/$given_params{$param_name}/eg;
36         }
37         elsif (!exists $given_params{$param_name}) {
38             ;
39         }
40         elsif ($param->{'type'} eq 'object') {
41             my %param_value;
42             my ($p, $v);
43             while (($property_name, $property) = each %{$param->{'properties'}}) {
44                 if (!exists $given_params{$param_name}->{$property_name}) {
45                     ;
46                 }
47                 elsif ($property->{'type'} eq 'boolean') {
48                     $param_value{$property_name} = $given_params{$param_name}->{$property_name} ? JSON::true : JSON::false;
49                 }
50                 else {
51                     $param_value{$property_name} = $given_params{$param_name}->{$property_name};
52                 }
53             }
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;
57         } else {
58             $body_params{$param_name} = $given_params{$param_name};
59         }
60     }
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();
67     my $data, $headers;
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());
71     }
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'});
77     } else {
78         Arvados::ResourceProxy->new($result, $self->{'resourceAccessor'});
79     }
80 }
81
82 1;