meta/rpc/Utils/Format.pm (72 lines of code) (raw):
# Copyright 2021-present Intel Corporation.
#
# Licensed 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 Utils::Format;
use Term::ANSIColor;
use Env qw(PATH);
use Carp;
use namespace::autoclean;
use Moose;
sub _find_binaries {
my $class = shift;
my $name = shift;
my $ver = shift;
my @binaries;
push @binaries, grep { /\/$name(-?\d*[.]?\d*)?$/ } glob "$_/*"
for split /:/, $PATH;
my @binaries_ver;
@binaries_ver = grep { /$name-?$ver/ } @binaries if defined $ver;
return \@binaries, \@binaries_ver;
}
sub _formatter {
my $class = shift;
my $file = shift;
my $formatter = shift;
my $opts = shift;
my $ver = shift;
# Find clang-format binaries
my ( $formatters, $formatters_ver ) =
$class->_find_binaries( $formatter, $ver );
# Run expected version, or print warning and run another one
if ( @{$formatters_ver} ) {
system "$formatters->[0] --version";
system "$formatters_ver->[0] $opts " . $file;
}
else {
if ($ver) {
carp colored( "$formatter-$ver not found", 'dark yellow' );
print "\tUse "
. colored( '--no-format', 'bold' )
. " to disable formatting.\n";
}
if ( @{$formatters} ) {
print "\tUsing $formatters->[0] instead: " if $ver;
system "$formatters->[0] --version";
system "$formatters->[0] $opts " . $file;
}
elsif ( !$ver ) {
carp colored( "$formatter not found", 'dark yellow' );
print "\tUse "
. colored( '--no-format', 'bold' )
. " to disable formatting.\n";
}
}
return;
}
sub cpp {
my $class = shift;
my $file = shift;
my $ver = shift;
my $formatter = 'clang-format';
my $opts = '-i';
$ver //= '3.6';
return $class->_formatter( $file, $formatter, $opts, $ver );
}
sub python {
my $class = shift;
my $file = shift;
my $ver = shift;
my $formatter = 'yapf';
my $opts = '-i --style pep8';
$class->_formatter( $file, $formatter, $opts );
$formatter = 'autopep8';
$opts = '-iaa';
return $class->_formatter( $file, $formatter, $opts );
}
__PACKAGE__->meta->make_immutable;
1;