diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-07-21 19:51:49 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-07-21 19:51:49 +0100 |
| commit | 26f7fa8c0578eb35fe29073dcb3a02382fe80e7b (patch) | |
| tree | a29a1b4fdf25129e6a0f8a6b4f81254a130edbe4 | |
| parent | 1215426fe58b6cad2cd666afd4b76e5f10bada61 (diff) | |
| parent | 57705a37be99020fa71adc4125dd83373ed5ad27 (diff) | |
| download | perlweeklychallenge-club-26f7fa8c0578eb35fe29073dcb3a02382fe80e7b.tar.gz perlweeklychallenge-club-26f7fa8c0578eb35fe29073dcb3a02382fe80e7b.tar.bz2 perlweeklychallenge-club-26f7fa8c0578eb35fe29073dcb3a02382fe80e7b.zip | |
Merge pull request #406 from randyl/week17
BhagavadGita API in perl6
| -rw-r--r-- | challenge-017/randy-lauen/README | 1 | ||||
| -rw-r--r-- | challenge-017/randy-lauen/perl6/BhagavadGita.pm6 | 55 | ||||
| -rw-r--r-- | challenge-017/randy-lauen/perl6/ch-3.p6 | 80 |
3 files changed, 136 insertions, 0 deletions
diff --git a/challenge-017/randy-lauen/README b/challenge-017/randy-lauen/README new file mode 100644 index 0000000000..17fac69a1c --- /dev/null +++ b/challenge-017/randy-lauen/README @@ -0,0 +1 @@ +Solution by Randy Lauen diff --git a/challenge-017/randy-lauen/perl6/BhagavadGita.pm6 b/challenge-017/randy-lauen/perl6/BhagavadGita.pm6 new file mode 100644 index 0000000000..d53961b82b --- /dev/null +++ b/challenge-017/randy-lauen/perl6/BhagavadGita.pm6 @@ -0,0 +1,55 @@ +use Cro::HTTP::Client; + +class BhagavadGita { + constant $base-uri = 'https://bhagavadgita.io'; + has $.access-token; + has $!client = Cro::HTTP::Client.new( + http => '1.1', # See https://github.com/croservices/cro-http/issues/74 + base-uri => $base-uri, + content-type => 'application/json', + auth => { bearer => $!access-token }, + ); + + # Class method + method get-access-token( :$client-id!, :$client-secret! ) returns Str { + my $response = await Cro::HTTP::Client.post( + "$base-uri/auth/oauth/token", + content-type => 'application/x-www-form-urlencoded', + body => %( + client_id => $client-id, + client_secret => $client-secret, + grant_type => 'client_credentials', + scope => 'verse chapter', + ), + ); + my $json = await $response.body; + return $json<access_token>; + } + + method chapters() { + return self!get-json( uri => '/api/v1/chapters' ); + } + + method chapter( :$chapter! ) { + return self!get-json( uri => "/api/v1/chapters/$chapter" ); + } + + multi method verses() { + return self!get-json( uri => '/api/v1/verses' ); + } + + multi method verses( :$chapter! ) { + return self!get-json( uri => "/api/v1/chapters/$chapter/verses" ); + } + + method verse( :$chapter!, :$verse! ) { + return self!get-json( uri => "/api/v1/chapters/$chapter/verses/$verse" ); + } + + method !get-json( :$uri ) { + my $response = await $!client.get( $uri ); + return await $response.body; + } +} + + diff --git a/challenge-017/randy-lauen/perl6/ch-3.p6 b/challenge-017/randy-lauen/perl6/ch-3.p6 new file mode 100644 index 0000000000..e359de2b67 --- /dev/null +++ b/challenge-017/randy-lauen/perl6/ch-3.p6 @@ -0,0 +1,80 @@ +#!/usr/bin/env perl6 + +use lib '.'; +use BhagavadGita; + +# Usage: +# +# Print out your access token +# ./ch-3.p6 --client-id=FOO --client-secret=BAR +# +# Print list of chapters: +# ./ch-3.p6 --access-token=TOKEN --chapters +# +# Print specific verse: +# ./ch-3.p6 --access-token=TOKEN --chapter=1 --verse=1 +# +# etc + + +# Print out access token +multi MAIN( :$client-id!, :$client-secret! ) { + say BhagavadGita.get-access-token( :$client-id, :$client-secret ); +} + +# Print list of chapters +multi MAIN( :$access-token!, Bool :$chapters! ) { + my $api = BhagavadGita.new( :$access-token ); + my $json = $api.chapters(); + + say $json.map( + { "Chapter: {.<chapter_number>}, {.<name_meaning>}, Verses Count: {.<verses_count>}" } + ).join("\n"); +} + +# Print chapter summary +multi MAIN( :$access-token!, Int :$chapter! ) { + my $api = BhagavadGita.new( :$access-token ); + my $json = $api.chapter( :$chapter ); + + say qq:to/END/; + Chapter: {$json.<chapter_number>}, {$json.<name_meaning>} + Verses Count: {$json.<verses_count>} + Summary: + {$json.<chapter_summary>} + END +} + +# Print all verses of all chapters (takes a while) +multi MAIN( :$access-token!, Bool :$verses! ) { + my $api = BhagavadGita.new( :$access-token ); + my $json = $api.verses(); + + say $json.map( + { "Chapter {.<chapter_number>}, Verse {.<verse_number>}: {.<meaning>}" } + ).join("\n"); +} + +# Print all verses in a chapter +multi MAIN( :$access-token!, Int :$chapter!, Bool :$verses! ) { + my $api = BhagavadGita.new( :$access-token ); + my $json = $api.verses( :$chapter ); + + say "Chapter: $json[0].<chapter_number>"; + say $json.map( + { "Verse {.<verse_number>}: {.<meaning>}" } + ).join("\n"); +} + +# Print a specific verse of a specific chapter +multi MAIN( :$access-token!, Int :$chapter!, Int :$verse! ) { + my $api = BhagavadGita.new( :$access-token ); + my $json = $api.verse( :$chapter, :$verse ); + + say qq:to/END/; + Chapter: {$json.<chapter_number>}, Verse: {$json.<verse_number>} + {$json.<meaning>} + END +} + + |
