The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!perl

use strict;
use warnings;

use lib 'lib';

use Data::Dumper;
use Getopt::Long;
use BackPAN::Index;

my $index_url;
GetOptions( 'index' => \$index_url );

my $args = $index_url ? { backpan_index_url => $index_url } : {};
my $backpan = BackPAN::Index->new($args);

sub usage {
    my $cmd = shift;

    print STDERR <<USAGE if $cmd;
Unknown command '$cmd'

USAGE

    print STDERR <<USAGE;
Usage:
  $0 dist     <dist name>
  $0 dists_by <cpanid>
USAGE

    exit 1;
}

my $cmd = shift;
my $arg = shift;

my %Commands = (
    dist        => \&command_dist,
    dists_by    => \&command_dists_by
);

main($cmd, $arg);

sub main {
    my $func = $Commands{$cmd} || do { usage($cmd) };

    $func->($arg);
}

sub command_dist {
    my $name = shift;

    my $backpan = BackPAN::Index->new;
    my $dist = $backpan->dist($name);

    do { print "Unknown dist '$dist'.\n"; exit 1; } unless $dist;

    print <<OUT;
Name:      @{[ $dist->name ]}
Authors:   @{[ join ", ", $dist->authors ]}
Releases:
OUT

    for my $release ($dist->releases->search(undef, { order_by => "version" })) {
        my $distvname = $release->distvname;
        print "           $distvname\n";
    }
}


sub command_dists_by {
    my $cpanid = shift;

    my $backpan = BackPAN::Index->new;
    my @dists = $backpan->dists_by($cpanid);

    do { print "CPANID '$cpanid' has no distributions.\n"; exit 1; } unless @dists;

    print join "\n", map { $_->name } @dists;
}

__END__

=head1 NAME

examples/backpan.pl - a simple demo for BackPAN::Index

=head1 USAGE

  $ perl examples/backpan.pl dist Dist-Name

  $ perl examples/backpan.pl dist_by CPANID

=head1 DESCRIPTION

This demo creates a BackPAN::Index instance,
which downloads from web and parses a BACKPAN index
and then shows up either the distributions of a given
name or the the distributions of a certain CPAN author.

=cut