Exercises-API

 view release on metacpan or  search on metacpan

lib/Exercises/API.pm  view on Meta::CPAN

# ABSTRACT: API Ninja's Exercises API

use v5.38;
use strict;
use warnings;
use Moose;
use LWP;
use JSON;
use Carp;
use Readonly;

use Exercises::API::Exercise;

our $VERSION = '0.001';

Readonly my $API_BASE_URL => 'https://api.api-ninjas.com/v1/exercises';

has 'ua' => (
    isa        => 'LWP::UserAgent',
    is         => 'ro',
    lazy_build => 1,
);

has 'apikey' => (
    required => 1,
    isa      => 'Maybe[Str]',
    is       => 'ro'
);

sub exercises( $self, %args ) {
    my $path           = $self->_build_path(%args);
    my $exercises_list = $self->_request($path);
    my @exercises;

    for my $exercise (@$exercises_list) {
        push @exercises, Exercises::API::Exercise->new($exercise);
    }

    return @exercises;
}

sub _build_path( $self, %args ) {
    my $uri = URI->new($API_BASE_URL);

    $uri->query( $uri->query_form(%args) ) if %args;

    return $uri;
}

sub _build_ua($self) {

    my $ua = LWP::UserAgent->new;
    $ua->default_header( 'X-Api-Key' => $self->apikey );

    return $ua;
}

sub _request( $self, $uri ) {
    my $response = $self->ua->get($uri);
    if ( $response->is_success ) {
        return decode_json( $response->decoded_content );
    }
    else {
        my $code = $response->code;
        confess "Exercises API status code ($code)\n"
          . "Error: "
          . $response->status_line;
    }
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Exercises::API - API Ninja's Exercises API

=head1 VERSION

version 0.001

=head1 SYNOPSIS

    use Exercises::API;

    # Set API Ninja Exercise API Key
    my $ea = Exercises::API->new(apikey => $ENV{'AN_EXERCISES_APIKEY'});

    # A list of exercises
    my @exercises = $ea->exercises;

    for my $exercise (@exercises){
        print "Name: " . $exercise->name . "\n";
        print "Type: " . $exercise->type . "\n";
        print "Muscle: " . $exercise->muscle . "\n";
        print "Equipment: " . $exercise->equipment . "\n";
        print "Difficulty: " . $exercise->difficulty . "\n";
        print "Instructions: " . $exercise->instructions . "\n";

    }

    # Specifying the parameters
    my %args = (
        name => 'press',
        type => 'strength',
        muscle => 'chest',
        difficulty => 'beginner',
        # offset => 0 (is a premium feature/parameter)
    );

    # A list of exercises based on the specified parameters
    my @exercisesParams = $ea->exercises(%args);

    for my $exercise (@exercises){
        print "Name: " . $exercise->name . "\n";
        print "Type: " . $exercise->type . "\n";



( run in 1.312 second using v1.01-cache-2.11-cpan-df04353d9ac )