File Coverage

blib/lib/Wurm/Grub/REST.pm
Criterion Covered Total %
statement 61 80 76.2
branch 32 60 53.3
condition 2 6 33.3
subroutine 14 16 87.5
pod 6 6 100.0
total 115 168 68.4


line stmt bran cond sub pod time code
1             package Wurm::Grub::REST;
2              
3 1     1   14205 use strict;
  1         2  
  1         24  
4 1     1   3 use warnings;
  1         2  
  1         25  
5 1     1   356 use parent qw(Wurm::let);
  1         209  
  1         3  
6              
7 1     1   384 use Wurm;
  1         1  
  1         5  
8              
9             sub new {
10 1     1 1 11 my ($self, $map) = @_;
11              
12 1   50     10 $map //= {
13             'text/html' => 'html',
14             'application/json' => 'json',
15             'text/xml' => 'xml',
16             'application/xml' => 'xml',
17             };
18              
19 1 50       4 die "invalid type map" unless 'HASH' eq ref $map;
20              
21             $self->SUPER::new->gate(sub {
22 0     0   0 my $meal = shift;
23              
24 0         0 for my $accept (split ',', $meal->{env}{HTTP_ACCEPT}) {
25 0         0 my $node = $map->{$accept};
26 0 0       0 $meal->{vent}{$node} = 1
27             if defined $node;
28             }
29              
30 0         0 $meal->{grit}{id} = Wurm::bend($meal);
31 0         0 return;
32 1         8 });
33             }
34              
35             sub get {
36 1     1 1 2 my ($self, $one, $all) = @_;
37              
38 1 50       2 die "invalid handler" unless 'CODE' eq ref $one;
39 1 50       3 die "invalid handler" unless 'CODE' eq ref $all;
40              
41             $self->SUPER::get(sub {
42 4     4   14 my $meal = shift;
43             my $cast = defined $meal->{grit}{id}
44 4 100       11 ? $one->($meal)
45             : $all->($meal)
46             ;
47 4 100       23 return defined $cast ? $cast : Wurm::_404();
48 1         6 });
49             }
50              
51             sub post {
52 1     1 1 2 my ($self, $post) = @_;
53              
54 1 50       3 die "invalid handler" unless 'CODE' eq ref $post;
55              
56             $self->SUPER::post(sub {
57 0     0   0 my $meal = shift;
58              
59             return Wurm::_400()
60 0 0       0 if defined $meal->{grit}{id};
61              
62 0         0 my $cast = $post->($meal);
63 0 0       0 return $cast
64             if defined $cast;
65              
66             return Wurm::_400()
67 0 0       0 unless defined $meal->{grit}{id};
68              
69 0   0     0 my $uri = $meal->{seen} // '';
70 0 0       0 $uri .= '/' if '/' ne substr($uri, length($uri) - 1, 1);
71 0         0 $uri .= $meal->{grit}{id};
72              
73 0         0 return Wurm::_201($uri);
74 1         7 });
75             }
76              
77             sub put {
78 1     1 1 1 my ($self, $new, $old) = @_;
79              
80 1 50       3 die "invalid handler" unless 'CODE' eq ref $new;
81 1 50       3 die "invalid handler" unless 'CODE' eq ref $old;
82              
83             $self->SUPER::put(sub {
84 4     4   2 my $meal = shift;
85 4         5 my $flag = defined $meal->{grit}{id};
86 4 100       12 my $cast = $flag
87             ? $old->($meal)
88             : $new->($meal)
89             ;
90 4 100       17 return $cast
91             if defined $cast;
92              
93             return Wurm::_400()
94 2 100       7 unless defined $meal->{grit}{id};
95              
96 1   50     9 my $uri = $meal->{seen} // '';
97 1 50       6 $uri .= '/' if '/' ne substr($uri, length($uri) - 1, 1);
98 1         3 $uri .= $meal->{grit}{id};
99              
100 1 50       7 return $flag ? Wurm::_302($uri) : Wurm::_201($uri);
101 1         8 });
102             }
103              
104             sub patch {
105 1     1 1 1 my ($self, $one, $all) = @_;
106              
107 1 50       4 die "invalid handler" unless 'CODE' eq ref $one;
108              
109             $self->SUPER::patch(sub {
110 4     4   4 my $meal = shift;
111              
112 4         4 my $cast;
113 4 100       7 if(defined $meal->{grit}{id}) {
114 2         5 $cast = $one->($meal);
115 2 50       8 return Wurm::_400() unless defined $meal->{grit}{id};
116 2 100       7 return Wurm::_404() unless defined $cast;
117             }
118             else {
119 2 50       9 return Wurm::_404() unless defined $all;
120 0         0 $cast = $all->($meal);
121 0 0       0 return Wurm::_400() unless defined $cast;
122             }
123 1         3 return $cast;
124 1         6 });
125             }
126              
127             sub delete {
128 1     1 1 1 my ($self, $one, $all) = @_;
129              
130 1 50       3 die "invalid handler" unless 'CODE' eq ref $one;
131              
132             return $self->SUPER::delete(sub {
133 4     4   5 my $meal = shift;
134              
135 4         3 my $cast;
136 4 100       8 if(defined $meal->{grit}{id}) {
137 2         3 $cast = $one->($meal);
138 2 50       9 return Wurm::_400() unless defined $meal->{grit}{id};
139 2 100       6 return Wurm::_404() unless defined $cast;
140             }
141             else {
142 2 50       6 return Wurm::_404() unless defined $all;
143 0         0 $cast = $all->($meal);
144 0 0       0 return Wurm::_400() unless defined $cast;
145             }
146 1         3 return $cast;
147 1         6 });
148             }
149              
150             '.oOo.' # in wurm i trust
151             __END__