App-BoolFindGrep

 view release on metacpan or  search on metacpan

lib/App/BoolFindGrep/Find.pm  view on Meta::CPAN

    is  => q(rw),
    isa => sub {
        (          ( -e $_[0] && -r $_[0] && -f $_[0] && -s $_[0] )
                || ( $_[0] eq q(-) || $_[0] =~ /\Astdin\z/i ) )
            || die;
    }
);
has files_delim => (
    is      => q(rw),
    default => undef,
);
has file_expr => (
    is      => q(rw),
    isa     => sub { die if @_ > 1; die if ref $_[0]; },
    default => undef,
);
has find_type => (
    is  => q(rw),
    isa => sub {
        ( grep { $_[0] eq $_ } qw[glob literal regexp] ) > 0 or die;
    },
    default => q(regexp),
);
has find_ignore_case => (
    is      => q(rw),
    isa     => sub { ( $_[0] == 0 || $_[0] == 1 ) or die; },
    default => 0,
);
has directory => (
    is  => q(rw),
    isa => sub {
        @{ $_[0] } == ( grep { -d $_ && -r $_ } @{ $_[0] } ) or die;
    },
    default => sub { [q(.)] },
);
has patterns => ( is => q(rw), default => sub { {}; }, );
has found    => ( is => q(rw), default => sub { {}; }, );
has files    => ( is => q(rw), default => sub { []; }, );

sub process {
    my $self = shift;

    die if defined $self->files_delim() && !( defined $self->files_from() );
    die if defined $self->files_from()  && defined $self->file_expr();
    die
        if defined $self->files_from()
        && @{ $self->directory() } != 1
        && $self->directory->[0] ne q(.);

    if ( defined $self->files_from() ) {
        $self->_get_made_list();
    }
    else { $self->_finder(); }

    return 1;
} ## end sub process

sub _get_made_list {
    my $self = shift;

    local $INPUT_RECORD_SEPARATOR = $self->files_delim();

    my $fh
        = $self->files_from() =~ /\A(?:-|stdin)\z/i
        ? \*STDIN
        : IO::File->new( $self->files_from(), q(r) );

    while ( my $file = readline $fh ) {
        chomp $file;
        croak sprintf q('%s': irregular file.), $file if !-f $file;
        push @{ $self->files() }, $file;
    }

    return 1;
} ## end sub _get_made_list

sub _finder {
    my $self = shift;

    unless ( defined $self->file_expr() ) {
        find sub { push @{ $self->files() }, $File::Find::name if -f },
            @{ $self->directory() };
    }

    $self->_process_patterns();

    find sub {
        if ( -f $_ ) {
            if ( %{ $self->patterns() } ) {
                foreach my $pattern ( keys %{ $self->patterns() } ) {
                    my $re = $self->patterns->{$pattern};
                    $self->found->{$File::Find::name}{$pattern} //= 0;
                    $self->found->{$File::Find::name}{$pattern}++ if m{$re};
                }
            }
        }
    }, @{ $self->directory() };

    return 1;
} ## end sub _finder

sub _process_patterns {
    my $self = shift;

    foreach my $pattern ( keys %{ $self->patterns() } ) {
        my $value = $pattern;
        foreach ( $self->find_type() ) {
            if ( $_ eq q(literal) ) { $value = quotemeta $value; }
            elsif ( $_ eq q(glob) ) {
                $value = glob_to_regex_string($value);
                $value.= q(\z);
            }
        }
        $value = $self->find_ignore_case() == 1 ? qr{$value}i : qr{$value};
        $self->patterns->{$pattern} = $value;
    }

    return 1;
} ## end sub _process_patterns

no Moo;



( run in 0.883 second using v1.01-cache-2.11-cpan-e1769b4cff6 )