From 4c14838f7ec72a348e97b908553506d882bbdc91 Mon Sep 17 00:00:00 2001 From: palo Date: Sat, 28 Oct 2023 00:27:39 +0200 Subject: [PATCH] Now when you order pizzas it tells you the cost - I'm not happy with the implementation though, in needs to be more idiomatic and more efficient --- scontrini.rkt | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/scontrini.rkt b/scontrini.rkt index e753502..cda8ad8 100644 --- a/scontrini.rkt +++ b/scontrini.rkt @@ -7,16 +7,16 @@ (define port 4444) (define hostname "127.0.0.1") -; Return a list of pizzas from the local file -(define (get-pizzas-list) - (let ((file (open-input-file "pizza_list.json"))) +; Return a list of all the pizzas from the local JSON file +(define (get-all-pizzas) + (let ((file (open-input-file "pizzas_list.json"))) (read-json file))) -; Send the pizza list as a JSON, prepending it with 4 bytes that contain the list length +; Send the list of all pizzas as a JSON, prepending it with 4 bytes that contain the list length (define (send-pizzas-list output) - (let ((pizzas-list (get-pizzas-list))) - (write-bytes (integer->integer-bytes (bytes-length (jsexpr->bytes pizzas-list)) 4 #f) output) - (write-json pizzas-list output))) + (let ((all-pizzas-list (get-all-pizzas))) + (write-bytes (integer->integer-bytes (bytes-length (jsexpr->bytes all-pizzas-list)) 4 #f) output) + (write-json all-pizzas-list output))) ; Print the to-print string on the printer ; TODO add synchronization to avoid race conditions @@ -25,12 +25,27 @@ (display (string-replace to-print "\n" "\n\n") file) ; always add an extra newline because the printer is a little messed up (close-output-port file))) -; Format the pizzas array from the JSON in a human-readable way -(define (format-pizza pizzas-list) - (let ((str "")) +; Return the price of the pizza * its quantity, searching in all-pizzas-list +(define (get-price-from-pizza pizza all-pizzas-list) + ; TODO rewrite in a more idiomatic way + (let ((found-price 0)) (for-each (lambda (pizza-hashmap) - (set! str (string-append str (format "~a : ~s\n" (hash-ref pizza-hashmap 'quantity) (hash-ref pizza-hashmap 'name))))) + (if (equal? (hash-ref pizza 'name) (hash-ref pizza-hashmap 'name)) + (set! found-price (hash-ref pizza-hashmap 'price)) + #f)) + all-pizzas-list) + (* found-price (hash-ref pizza 'quantity)))) + +; Format the pizzas list coming from the client in a human-readable way +(define (format-pizza pizzas-list) + (let ((str "") + (price 0) + (all-pizzas-list (hash-ref (get-pizzas-list) 'pizzas))) + (for-each (lambda (pizza-hashmap) + (set! str (string-append str (format "~a : ~s\n" (hash-ref pizza-hashmap 'quantity) (hash-ref pizza-hashmap 'name)))) + (set! price (+ price (get-price-from-pizza pizza-hashmap all-pizzas-list)))) pizzas-list) + (set! str (string-append str (format "Total price ~a" price))) str)) ; Parse the commands given in the JSON