Kubernetes-REST/lib/Kubernetes/REST/Result2Hash.pm
package Kubernetes::REST::Result2Hash;
use Moo;
use JSON::MaybeXS;
use Kubernetes::REST::Error;
has parser => (is => 'ro', default => sub { JSON::MaybeXS->new });
sub result2return {
my ($self, $call, $req, $response) = @_;
if ($response->status >= 400) {
return $self->process_error($response);
} else {
return 1 if (not defined $response->content);
return $self->process_response($response);
}
}
sub process_response {
my ($self, $response) = @_;
my $struct = eval {
$self->parser->decode($response->content);
};
Kubernetes::REST::Error->throw(
type => 'UnparseableResponse',
message => 'Can\'t parse response ' . $response->content . ' with error ' . $@
) if ($@);
return $struct;
}
sub process_error {
my ($self, $response) = @_;
my $struct = eval {
$self->parser->decode($response->content);
};
Kubernetes::REST::Error->throw(
type => 'UnparseableResponse',
message => 'Can\'t parse JSON content',
detail => $response->content,
) if ($@);
# Throw a Kubernetes::REST::RemoteError exception from
# the info in $struct
# {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Unauthorized","reason":"Unauthorized","code":401}
Kubernetes::REST::RemoteError->throw(
status => $response->status,
type => 'RemoteError',
message => "$struct->{ message }: $struct->{ reason }",
);
}
1;