App-FilenameTypeUtils

 view release on metacpan or  search on metacpan

lib/App/FilenameTypeUtils.pm  view on Meta::CPAN

our $VERSION = '0.003'; # VERSION

my %argsopt = (
    quiet => {
        schema => 'bool*',
        cmdline_aliases => {q=>{}},
    },
    detail => {
        schema => 'bool*',
        cmdline_aliases => {l=>{}},
    },
);

sub _gen_wrapper {
    my $what = shift;

    sub {
        my ($orig, %args) = (shift, @_);
        my $detail = delete $args{detail};
        my $quiet  = delete $args{quiet};
        my $res0 = $orig->(@_);
        my $boolres = $res0 ? 1:0;
        my $hashres = $boolres ? $res0 : {};
        [200, "OK", $detail ? $hashres : $boolres, {
            ('cmdline.result' => $quiet ? "" : "Filename '$args{filename}' ".($boolres ? "indicates" : "does NOT indicate")." being $what") x !$detail,
            'cmdline.exit_code' => $boolres ? 0 : 1,
        }];
    };
}

require Filename::Type::Archive;
gen_modified_sub(
    base_name => 'Filename::Type::Archive::check_archive_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('an archive'),
);

require Filename::Type::Audio;
gen_modified_sub(
    base_name => 'Filename::Type::Audio::check_audio_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('an audio file'),
);

require Filename::Type::Backup;
gen_modified_sub(
    base_name => 'Filename::Type::Backup::check_backup_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('a backup file'),
);

require Filename::Type::Compressed;
gen_modified_sub(
    base_name => 'Filename::Type::Compressed::check_compressed_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('a compressed file'),
);

require Filename::Type::Ebook;
gen_modified_sub(
    base_name => 'Filename::Type::Ebook::check_ebook_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('an ebook'),
);

require Filename::Type::Executable;
gen_modified_sub(
    base_name => 'Filename::Type::Executable::check_executable_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('an executable'),
);

require Filename::Type::Image;
gen_modified_sub(
    base_name => 'Filename::Type::Image::check_image_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('an image (picture)'),
);

require Filename::Type::Media;
gen_modified_sub(
    base_name => 'Filename::Type::Media::check_media_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('a media (image/audio/video) file'),
);

require Filename::Type::Video;
gen_modified_sub(
    base_name => 'Filename::Type::Video::check_video_filename',
    add_args => {
        %argsopt,
    },
    modify_meta => sub {
        $_[0]{result_naked} = 0;
        # XXX we should adjust the examples instead
        delete $_[0]{examples};
    },
    wrap_code => _gen_wrapper('a video file'),
);

1;
# ABSTRACT: CLIs for Filename::Type::*

__END__

=pod

=encoding UTF-8

=head1 NAME

App::FilenameTypeUtils - CLIs for Filename::Type::*

=head1 VERSION

This document describes version 0.003 of App::FilenameTypeUtils (from Perl distribution App-FilenameTypeUtils), released on 2024-12-21.

=head1 SYNOPSIS

=head1 DESCRIPTION

This distribution includes several utilities related to Filename::Type::*
modules:

=over

=item 1. L<check-archive-filename>

=item 2. L<check-audio-filename>

=item 3. L<check-backup-filename>

=item 4. L<check-compressed-filename>

=item 5. L<check-ebook-filename>

=item 6. L<check-executable-filename>

=item 7. L<check-image-filename>

=item 8. L<check-media-filename>

=item 9. L<check-video-filename>

=back

=head1 FUNCTIONS


=head2 check_archive_filename

Usage:

 check_archive_filename(%args) -> [$status_code, $reason, $payload, \%result_meta]

Check whether filename indicates being an archive file.

This function is not exported.

Arguments ('*' denotes required arguments):

=over 4

=item * B<detail> => I<bool>

(No description)

=item * B<filename>* => I<str>

(No description)

=item * B<ignore_case> => I<bool> (default: 1)

Whether to match case-insensitively.

=item * B<quiet> => I<bool>

(No description)


=back

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code
(200 means OK, 4xx caller error, 5xx function error). Second element
($reason) is a string containing error message, or something like "OK" if status is
200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth
element (%result_meta) is called result metadata and is optional, a hash
that contains extra information, much like how HTTP response headers provide additional metadata.

Return value:  (bool|hash)


Return false if no archive suffixes detected. Otherwise return a hash of
information, which contains these keys: C<archive_name>, C<archive_suffix>,
C<compressor_info>, C<filename_without_suffix>.



=head2 check_audio_filename

Usage:

 check_audio_filename(%args) -> [$status_code, $reason, $payload, \%result_meta]

Check whether filename indicates being an audio file.

This function is not exported.

Arguments ('*' denotes required arguments):

=over 4

=item * B<detail> => I<bool>

(No description)

=item * B<filename>* => I<filename>

(No description)

=item * B<quiet> => I<bool>

(No description)


=back

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code
(200 means OK, 4xx caller error, 5xx function error). Second element
($reason) is a string containing error message, or something like "OK" if status is
200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth
element (%result_meta) is called result metadata and is optional, a hash
that contains extra information, much like how HTTP response headers provide additional metadata.

Return value:  (bool|hash)


Return false if no archive suffixes detected. Otherwise return a hash of
information.



=head2 check_backup_filename

Usage:

 check_backup_filename(%args) -> [$status_code, $reason, $payload, \%result_meta]

Check whether filename indicates being a backup file.

This function is not exported.

Arguments ('*' denotes required arguments):

=over 4

=item * B<ci> => I<bool> (default: 1)

Whether to match case-insensitively.

=item * B<detail> => I<bool>

(No description)

=item * B<filename>* => I<str>

(No description)

=item * B<quiet> => I<bool>

(No description)


=back

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code
(200 means OK, 4xx caller error, 5xx function error). Second element
($reason) is a string containing error message, or something like "OK" if status is
200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth
element (%result_meta) is called result metadata and is optional, a hash
that contains extra information, much like how HTTP response headers provide additional metadata.

Return value:  (bool|hash)


Return false if not detected as backup name. Otherwise return a hash, which may
contain these keys: C<original_filename>. In the future there will be extra
information returned, e.g. editor name (if filename indicates backup from
certain backup program), date (if filename contains date information), and so
on.



=head2 check_compressed_filename

Usage:

 check_compressed_filename(%args) -> [$status_code, $reason, $payload, \%result_meta]

Check whether filename indicates being compressed.

This function is not exported.

Arguments ('*' denotes required arguments):

=over 4

=item * B<detail> => I<bool>

(No description)

=item * B<filename>* => I<str>

(No description)

=item * B<ignore_case> => I<bool> (default: 1)

Whether to match case-insensitively.

=item * B<quiet> => I<bool>

(No description)


=back

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code
(200 means OK, 4xx caller error, 5xx function error). Second element
($reason) is a string containing error message, or something like "OK" if status is
200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth
element (%result_meta) is called result metadata and is optional, a hash
that contains extra information, much like how HTTP response headers provide additional metadata.

Return value:  (bool|hash)


Return false if no compressor suffixes detected. Otherwise return a hash of
information, which contains these keys: C<compressor_name>, C<compressor_suffix>,
C<uncompressed_filename>.



=head2 check_ebook_filename

Usage:

 check_ebook_filename(%args) -> [$status_code, $reason, $payload, \%result_meta]



( run in 0.522 second using v1.01-cache-2.11-cpan-df04353d9ac )