aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-07-21 19:51:49 +0100
committerGitHub <noreply@github.com>2019-07-21 19:51:49 +0100
commit26f7fa8c0578eb35fe29073dcb3a02382fe80e7b (patch)
treea29a1b4fdf25129e6a0f8a6b4f81254a130edbe4
parent1215426fe58b6cad2cd666afd4b76e5f10bada61 (diff)
parent57705a37be99020fa71adc4125dd83373ed5ad27 (diff)
downloadperlweeklychallenge-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/README1
-rw-r--r--challenge-017/randy-lauen/perl6/BhagavadGita.pm655
-rw-r--r--challenge-017/randy-lauen/perl6/ch-3.p680
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
+}
+
+