WWW-Marvel

 view release on metacpan or  search on metacpan

scripts/characters.pl  view on Meta::CPAN

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Getopt::Long qw( :config no_ignore_case );
use Text::Autoformat qw( form );
use WWW::Marvel::Client;
use WWW::Marvel::Config::File;
use WWW::Marvel::Response;

my @FLAGS = (qw/ comics events series stories help /);
my %FILTERS = (
	name => 's',
	'nameStartsWith'	=> 's',
	'modifiedSince' => 's', # Date
#	comics => 'i',
#	series => 'i',
#	events => 'i',
#	stories => 'i',
	limit => 'i',
	offset => 'i',
);

sub commandline_options {
	my %opt = (
		config => undef,
		map({$_, 0} @FLAGS),
		map({$_, undef} keys %FILTERS),
		help => 0,
	);
	GetOptions(\%opt,
		'config=s',
		@FLAGS,
		map({"$_=$FILTERS{$_}"} keys %FILTERS),
	) or die "Error in cmdl args\n";

	if ($opt{help}) {
		print_help();
		exit 0;
	}

	return \%opt;
}

sub print_help {
	printf "Usage: %s [OPTIONS] [FILTERS] [FLAGS]\n", $0;
	printf "  OPTIONS:\n";
	printf "    --%-12s \t Config file\n", 'config <file>';
	printf "  FILTERS:\n";
	printf "    --%-12s \t Filter on %s [%s]\n", $_, $_, $FILTERS{$_} for (sort keys %FILTERS);
	printf "  FLAGS:\n";
	printf "    --%-12s \t Show %s\n", $_, $_ for (@FLAGS);
}

my $OPT = commandline_options();
my $cfg = WWW::Marvel::Config::File->new($OPT->{config});
my $client = WWW::Marvel::Client->new({
	public_key  => $cfg->get_public_key,
	private_key => $cfg->get_private_key,
});
my %filters =
	map { $_, $OPT->{$_} }
	grep { defined $OPT->{$_} }
	keys %FILTERS;

my $res_data = $client->characters(\%filters);
my $res = WWW::Marvel::Response->new($res_data);

my %FMT = (
	name => q{  >>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< },
	desc => q{  >>>>>>>>>>>> [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ },
	li   => q{               * <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< },
);

die("No results.\n", Dumper($res)) if $res->get_count < 1;

printf "Results: %s / %s\n", $res->get_count, $res->get_total;
while (my $c = $res->get_next_entity) {
	show_character($c);
}

sub show_character {
	my ($c) = @_;

	print form($FMT{name}, "Name:",        $c->get_name);
	print form($FMT{name}, "Id:",          $c->get_id);
	print form($FMT{desc}, "Picture:",     $c->get_picture);
	print form($FMT{desc}, "Description:", $c->get_description);
	print form($FMT{name}, "Uri:",         $c->get_resourceURI);
	print "\n";

	my $urls = $c->get_urls // [];
	for my $u (sort { $a->{type} cmp $b->{type} } @$urls) {
		print form($FMT{desc}, ucfirst($u->{type}).':', $u->{url});
	}
	print "\n";

	print_collection('Comics',   $c->get_comics)  if $OPT->{comics};
	print_collection('Events:',  $c->get_events)  if $OPT->{events};
	print_collection('Series:',  $c->get_series)  if $OPT->{series};
	print_collection('Stories:', $c->get_stories) if $OPT->{stories};
}

sub print_collection {
	my ($name, $c) = @_;
	print form($FMT{name}, $name, sprintf("%s/%s", $c->{returned}, $c->{available}));
	for my $i (@{ $c->{items} }) {
		print form($FMT{li}, $i->{name});
	}
	print form($FMT{name}, "Uri:", $c->{collectionURI});
	print "\n";
}

# urls : ARRAY(0x2b289e8)
# comics : HASH(0x2c3f790)
# events : HASH(0x2b273d8)
# series : HASH(0x320fca0)
# stories : HASH(0x2b269d0)
#	available : 11



( run in 0.543 second using v1.01-cache-2.11-cpan-39bf76dae61 )