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 )