blob: d8830c61624971c99de5a823145973b3de1201ec (
plain) (
tree)
|
|
#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 slideshow/pict racket/draw)
;; 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))
(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 (list? v) (map ; consider making this if a cond and testing for lists/hash tables to recursively dive into nested data
(lambda (x) (inspector x)) v)
(display (~a " key: " k "\nvalue: " v "\n=====\n")))))
h)
(inspector (dex-entry 11))
(inspector (dex-entry "bulbasaur"))
(define img (hash-ref (dex-entry 11) "sprite"))
(define display-image (bitmap (make-object bitmap% img)))
(frame (scale display-image 0.3))
|