577e4ea47ab29ea6c2305f121876aa48566b4a33
[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 ($given_params{$param_name}->{$property_name} eq undef) {
48                     $param_value{$property_name} = JSON::null;
49                 }
50                 elsif ($property->{'type'} eq 'boolean') {
51                     $param_value{$property_name} = $given_params{$param_name}->{$property_name} ? JSON::true : JSON::false;
52                 }
53                 else {
54                     $param_value{$property_name} = $given_params{$param_name}->{$property_name};
55                 }
56             }
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;
60         } else {
61             $body_params{$param_name} = $given_params{$param_name};
62         }
63     }
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();
70     my $data, $headers;
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());
74     }
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'});
80     } else {
81         Arvados::ResourceProxy->new($result, $self->{'resourceAccessor'});
82     }
83 }
84
85 1;