lib/Search/Elasticsearch/Util.pm (79 lines of code) (raw):
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
package Search::Elasticsearch::Util;
use Moo;
use Search::Elasticsearch::Error();
use Scalar::Util qw(blessed);
use Module::Runtime qw(compose_module_name is_module_name use_module);
use Sub::Exporter -setup => {
exports => [ qw(
parse_params
to_list
load_plugin
new_error
throw
upgrade_error
is_compat
)
]
};
#===================================
sub to_list {
#===================================
grep {defined} ref $_[0] eq 'ARRAY' ? @{ $_[0] } : @_;
}
#===================================
sub parse_params {
#===================================
my $self = shift;
my %params;
if ( @_ % 2 ) {
throw(
"Param",
'Expecting a HASH ref or a list of key-value pairs',
{ params => \@_ }
) unless ref $_[0] eq 'HASH';
%params = %{ shift() };
}
else {
%params = @_;
}
return ( $self, \%params );
}
#===================================
sub load_plugin {
#===================================
my ( $base, $spec ) = @_;
$spec ||= "+$base";
return $spec if blessed $spec;
my ( $class, $version );
if ( ref $spec eq 'ARRAY' ) {
( $class, $version ) = @$spec;
}
else {
$class = $spec;
}
unless ( $class =~ s/\A\+// ) {
$class = compose_module_name( $base, $class );
}
$version ? use_module( $class, $version ) : use_module($class);
}
#===================================
sub throw {
#===================================
my ( $type, $msg, $vars ) = @_;
die Search::Elasticsearch::Error->new( $type, $msg, $vars, 1 );
}
#===================================
sub new_error {
#===================================
my ( $type, $msg, $vars ) = @_;
return Search::Elasticsearch::Error->new( $type, $msg, $vars, 1 );
}
#===================================
sub upgrade_error {
#===================================
my ( $error, $vars ) = @_;
return
ref($error) && $error->isa('Search::Elasticsearch::Error')
? $error
: Search::Elasticsearch::Error->new( "Internal", $error, $vars || {},
1 );
}
#===================================
sub is_compat {
#===================================
my ( $attr, $one, $two ) = @_;
my $role
= $one->does('Search::Elasticsearch::Role::Is_Sync')
? 'Search::Elasticsearch::Role::Is_Sync'
: 'Search::Elasticsearch::Role::Is_Async';
return if eval { $two->does($role); };
my $class = ref($two) || $two;
die "$attr ($class) does not do $role";
}
1;
# ABSTRACT: A utility class for internal use by Search::Elasticsearch