App-CrockfordBase32Utils

 view release on metacpan or  search on metacpan

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

        {
            summary => 'Generate a formatted random code',
            argv => ['-f', '###-###-###', '-l9'],
            test => 0,
        },
    ],
};
sub cfbase32_rand {
    require Encode::Base32::Crockford;
    require Math::Random::Secure;
    require String::FillCharTemplate;

    my %args = @_;
    my ($gen, $from, $to, $fmt);
    if ($args{len}) {
        if ($args{len} >= 9) {
            $gen = sub { _gen_rand_cfbase32($args{len}, $args{len}, $args{zero_prefix}) };
        } else {
            $from = 32 ** ($args{len} - 1); $from = 0 if $from == 1;
            $to = 32 ** ($args{len}) - 1;
        }
    } elsif (defined($args{min_len})) {
        if ($args{min_len} >= 9 || $args{max_len} >= 9) {
            $gen = sub { _gen_rand_cfbase32($args{min_len}, $args{max_len}, $args{zero_prefix}) };
        } else {
            $from = 32 ** int($args{min_len} - 1); $from = 0 if $from == 1;
            $to   = 32 ** int($args{max_len}) - 1;
        }
    } elsif (defined($args{min_int})) {
        $from = int($args{min_int});
        $to   = int($args{max_int});
    } elsif (defined($args{min_base32})) {
        $from = Encode::Base32::Crockford::base32_decode($args{min_base32});
        $to   = Encode::Base32::Crockford::base32_decode($args{max_base32});
    } else {
        return [400, "Please specify range"];
    }
    log_trace "from: %s   to: %s", $from, $to;

    my %seen;
    if ($args{prev_file}) {
        open my $fh, "<", $args{prev_file} or return [500, "Can't open prev_file '$args{prev_file}': $!"];
        while (defined(my $line = <$fh>)) {
            chomp $line;
            $line = uc($line);
            $line =~ s/^($cfbase32_nondigit_re)+//g;
            next unless length $line;
            $seen{$line}++;
        }
        #use DD; dd \%seen;
    }

    my @res;
    my $i = 1;
    while ($i <= $args{num}) {
        my $enc;
        if ($gen) {
            $enc = $gen->();
        } else {
            my $num = $from + Math::Random::Secure::irand($to - $from + 1);
            #say "from=$from, to=$to, num=$num";
            $enc = Encode::Base32::Crockford::base32_encode($num);
        }
        if ($args{unique} && $seen{$enc}++) {
            next;
        }
        if (defined $args{fill_char_template}) {
            $enc = String::FillCharTemplate::fill_char_template($args{fill_char_template}, $enc);
        }
        push @res, $enc;
        $i++;
    }

    [200, "OK", \@res];
}

1;
# ABSTRACT: Utilities related to Crockford's Base 32 encoding

__END__

=pod

=encoding UTF-8

=head1 NAME

App::CrockfordBase32Utils - Utilities related to Crockford's Base 32 encoding

=head1 VERSION

This document describes version 0.005 of App::CrockfordBase32Utils (from Perl distribution App-CrockfordBase32Utils), released on 2026-01-28.

=head1 DESCRIPTION

This distribution contains the following CLIs:

=over

=item * L<cfbase32-decode>

=item * L<cfbase32-encode>

=item * L<cfbase32-rand>

=item * L<cfbase32-to-num>

=item * L<num-to-cfbase32>

=back

Keywords: base32, base 32, crockford's base 32

=head1 FUNCTIONS


=head2 cfbase32_decode

Usage:

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



( run in 0.639 second using v1.01-cache-2.11-cpan-13bb782fe5a )