diff options
author | elioat <elioat@tilde.institute> | 2022-12-13 11:47:58 -0500 |
---|---|---|
committer | elioat <elioat@tilde.institute> | 2022-12-13 11:47:58 -0500 |
commit | 44bb45d2b4cea2186988020d692c9fd9b6eea78d (patch) | |
tree | 2f923ff78ea3553185163b7739b3355f3ab9fe66 /src/pokedex | |
parent | 1e75b821485dd166267b91fed2e50710aad5c5ad (diff) | |
download | december-2022-44bb45d2b4cea2186988020d692c9fd9b6eea78d.tar.gz |
cleaning up
Diffstat (limited to 'src/pokedex')
-rw-r--r-- | src/pokedex/pokedex.rkt | 59 | ||||
-rw-r--r-- | src/pokedex/tmp.rkt | 63 |
2 files changed, 122 insertions, 0 deletions
diff --git a/src/pokedex/pokedex.rkt b/src/pokedex/pokedex.rkt new file mode 100644 index 0000000..3aebea1 --- /dev/null +++ b/src/pokedex/pokedex.rkt @@ -0,0 +1,59 @@ + +#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)) ; this doesn't actually seem to work with URLs/PNGs diff --git a/src/pokedex/tmp.rkt b/src/pokedex/tmp.rkt new file mode 100644 index 0000000..089e066 --- /dev/null +++ b/src/pokedex/tmp.rkt @@ -0,0 +1,63 @@ +#lang racket + +; (require sugar) + +(define test-data '#hash(("id" . 12) + ("name" . "butterfree") + ("sprite" . "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png") + ("stats" + . (#hasheq((base_stat . 60) + (effort . 0) + (stat . #hasheq((name . "hp") (url . "https://pokeapi.co/api/v2/stat/1/")))) + #hasheq((base_stat . 45) + (effort . 0) + (stat . #hasheq((name . "attack") (url . "https://pokeapi.co/api/v2/stat/2/")))) + #hasheq((base_stat . 50) + (effort . 0) + (stat . #hasheq((name . "defense") (url . "https://pokeapi.co/api/v2/stat/3/")))) + #hasheq((base_stat . 90) + (effort . 2) + (stat . #hasheq((name . "special-attack") (url . "https://pokeapi.co/api/v2/stat/4/")))) + #hasheq((base_stat . 80) + (effort . 1) + (stat . #hasheq((name . "special-defense") (url . "https://pokeapi.co/api/v2/stat/5/")))) + #hasheq((base_stat . 70) + (effort . 0) + (stat . #hasheq((name . "speed") (url . "https://pokeapi.co/api/v2/stat/6/")))))) + ("types" + . (#hasheq((slot . 1) + (type . #hasheq((name . "bug") (url . "https://pokeapi.co/api/v2/type/7/")))) + #hasheq((slot . 2) + (type . #hasheq((name . "flying") (url . "https://pokeapi.co/api/v2/type/3/")))))))) + + +; (define d (dict->list test-data)) ; or...you know...could convert from hash table to list? + + +; (hash? (car (hash-ref test-data "stats"))) ; #t --- BOOM! this gets us a hash table! +; (display (car (hash-ref test-data "stats"))) +; (list? (hash-ref test-data "stats")) ;; #t + +;; "stats" and "types" AREN'T exactly nested hash tables! They're lists, with hash tables embedded in them! +;; SO! I need a way to test for if something is a LIST, and then if it is a LIST I think then I hash map through that! + +;; NEXT STEPS -> https://stackoverflow.com/questions/13504302/racket-scheme-filtering + +; (hash-ref test-data "stats") ; all stats +; (hash-ref (car (hash-ref test-data "stats")) 'base_stat) ; value for a given stat +; (hash-ref (hash-ref (car (hash-ref test-data "stats")) 'stat) 'name) ; name for a given stat + +; [(list? v) (map (lambda (x) (inspector x)) v)] +; [(hash? (car (hash-ref k "stats")) (map (lambda (x) (inspector x)) v))] + +(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) + (cond [(list? v) (cond + [(hash? (car (hash-ref k "stats")) (map (lambda (x) (inspector x) v)))] ; this is probably dumb, since it'll require at least another level of nesting... + [map (lambda (x) (inspector x)) v])] + [(display (~a " key: " k "\nvalue: " v "\n=====\n"))]))) + h) + +(inspector test-data) |