Acme-Free-Advice-Slip

 view release on metacpan or  search on metacpan

lib/Acme/Free/Advice/Slip.pm  view on Meta::CPAN

    #
    sub _http ($uri) {
        state $http
            //= HTTP::Tiny->new( default_headers => { Accept => 'application/json' }, agent => sprintf '%s/%.2f ', __PACKAGE__, our $VERSION );
        my $res = $http->get($uri);    # {success} is true even when advice is not found but we'll at least know when we have valid JSON
        $res->{success} ? decode_json( $res->{content} ) : ();
    }
    #
    sub advice ( $slip_id //= () ) {
        my $res = _http( 'https://api.adviceslip.com/advice' . ( $slip_id ? '/' . $slip_id : '' ) );
        defined $res->{slip} ? bless $res->{slip}, __PACKAGE__ : ();
    }

    sub search ($query) {
        my $res = _http( 'https://api.adviceslip.com/advice/search/' . $query );
        map { bless $_, __PACKAGE__ } @{ $res->{slips} // [] };
    }
}
1;
__END__

=encoding utf-8

=head1 NAME

Acme::Free::Advice::Slip - Seek Advice from the Advice Slip API

script/advice_slip.pl  view on Meta::CPAN

#~ @ARGV = qw[-json -id 333];
#~ @ARGV = qw[-json -id 2];
#~ @ARGV = qw[-help];
#
my $raw = 0;
my ( $id, $query );

sub _echo ($slip) {    # JSON::Tiny is loaded in Acme::Free::Advice::* anyway
    $raw ?
        JSON::Tiny::encode_json(
        builtin::blessed $slip ? {%$slip} : [
            map {
                {%$_}
            } @$slip
        ]
        ) :
        $slip;
}
GetOptions( 'json' => \$raw, 'help' => sub { pod2usage( -exitval => 1 ) }, 'id=i' => \$id, 'search=s' => \$query );
if ( defined $query ) {
    my @slips = Acme::Free::Advice::Slip::search($query);

t/00_compile.t  view on Meta::CPAN

imported_ok qw[advice search];
#
ok +advice(), 'stringify';
#
subtest 'random advice' => sub {
    is my $slip = advice(), hash {
        field advice => D();
        field id     => D();
        end()
    }, 'advice() returns a random slip';
    isa_ok $slip, ['Acme::Free::Advice::Slip'], 'slips are blessed hashes';
};
subtest 'specific advice' => sub {
    is my $slip = advice(224), hash {
        field advice => string q[Don't drink bleach.];
        field id     => number 224;
        end;
    }, 'advice(1) returns a known slip';
    is advice(100000), U(), 'advice(100000) returns undef';
};
subtest 'search for advice' => sub {
    is my $list = [ search('time') ], array {
        all_items hash {
            field advice => D();
            field date   => D();
            field id     => D();
            end;
        };
        etc;
    }, 'search("time") returns a list of slips';
    isa_ok $list->[0], ['Acme::Free::Advice::Slip'], 'elements are blessed hashes';
    is [ search('tfcsqfdafdsa') ], [], 'search("tfcsqfdafdsa") returns an empty list';
};
#
done_testing;



( run in 1.066 second using v1.01-cache-2.11-cpan-de7293f3b23 )