about summary refs log tree commit diff stats
path: root/src/pokedex.rkt
blob: 67710f6d9e6761b9ba32a6f501c52811671f7bce (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#lang racket

;; let's try to make a pokedex in racket!

;; first step will be to write a function to query the pokeAPI
;; like so, https://pokeapi.co/api/v2/pokemon/ditto

;; once there is a function in place that returns data I will
;; have a choice to make -- do I want to always query the API,
;; do I want to cache results, or do I want to create an offline
;; repository of poke-data to search through and sometimes update?


;; basic GET request
(require net/url)
(require json)
; (require nested-hash) ;; this hasn't helped me with anything yet...


;; API URL
(define *POKE-API* "https://pokeapi.co/api/v2/")


(define (get-pokemon id)
    "queries the api, returns a butt ton of info"
	(call/input-url (string->url (~a *POKE-API* "pokemon/" id)) ; ~a, like string-append but appends *either* strings or numbers to a string
                get-pure-port
                (compose string->jsexpr port->string))) ;; QUESTION: could I use read-json here, instead?

(define (dex-entry id)
    "selects the info we need from the api, builds a hash table of the data that will build the entry"
    (let ([poke-data (get-pokemon id)])
        (define entry-data (make-hash))
        (hash-set! entry-data "name" (hash-ref poke-data 'name))
        (hash-set! entry-data "id" (hash-ref poke-data 'id))
        (hash-set! entry-data "sprite" (hash-ref (hash-ref poke-data 'sprites) 'front_default))
        (hash-set! entry-data "stats" (hash-ref poke-data 'stats))
        (hash-set! entry-data "types" (hash-ref poke-data 'types))
        entry-data))

; (dex-entry 12) ;; QUESTION: would this all be easier to handle if it were a vector or list instead of a hash table?

;; TOMORROW I'll start to figure out how to present this data

(define (inspector h)
    "display the contents of a hash table for human eyeballs and let the hash table fall back out"
    (hash-map h
        (lambda (k v)
          (if (hash? v) (~a "value " v " was a hash table!\n") ;; test to see if a value is a hash table
            (display (~a "key: " k ", value: " v "\n")))) ; QUESTION: is there a functional difference between hash-map and hash-for-each here?
    h))

; (hash-ref (dex-entry 5) "types") ;; struggling to figure out how to access the nested hash tables stats and types...

;; the other option not yet considered is to make individual API calls for each bit of data, rather than 1 call and plucking out the data I want.
;; this may lead to an easier data shape, but means a lot more network traffic.

(inspector (dex-entry 11))