;;; SPDX-FileCopyrightText: 2026 Matthew Fennell ;;; ;;; SPDX-License-Identifier: AGPL-3.0-or-later (use-modules (ice-9 string-fun) (json) (srfi srfi-9) (srfi srfi-26)) (define-record-type (make-booking venue activity start end) booking? (venue booking-venue) (activity booking-activity) (start booking-start) (end booking-end)) (set-record-type-printer! (lambda (booking port) (let* ((date-str ((compose date->api-string booking-start) booking)) (start-str ((compose time->api-string booking-start) booking)) (end-str ((compose time->api-string booking-end) booking)) (venue (booking-venue booking)) (activity (booking-activity booking))) (for-each (lambda (obj) (display obj port)) `(,activity "@" ,venue "@" ,date-str "T" ,start-str "-" ,end-str))))) (define (time-data->booking time) (let* ((date-str-format "~Y-~m-~d ~H:~M") (start-str (string-append (time-data-date time) " " ((compose at-time time-data-start) time))) (end-str (string-append (time-data-date time) " " ((compose at-time time-data-end) time))) (venue ((compose string->symbol time-data-venue) time)) (activity ((compose string->symbol time-data-activity) time)) (start (string->date start-str date-str-format)) (end (string->date end-str date-str-format))) (make-booking venue activity start end))) (define (activity-name->activity-slug name) (let ((string-replace-substring (lambda (from to str) (string-replace-substring str from to)))) ((compose string-downcase (cut string-replace-substring " " "-" <>)) name))) (define (bookings-response-data->booking data) (let* ((date-str-format "~Y-~m-~d ~H:~M") (date-str ((compose booking-date-raw booking-item-date bookings-response-data-item) data)) (start-str (string-append date-str " " ((compose at-time booking-item-start bookings-response-data-item) data))) (end-str (string-append date-str " " ((compose at-time booking-item-end bookings-response-data-item) data))) (venue ((compose string->symbol booking-location-venue booking-item-location bookings-response-data-item) data)) (activity ((compose string->symbol activity-name->activity-slug bookings-response-data-category) data)) (start (string->date start-str date-str-format)) (end (string->date end-str date-str-format))) (make-booking venue activity start end))) (define-json-type (username) (password)) (define-json-type (token)) (define-json-type (time "format_24_hour")) (define-json-type (venue "venue_slug") (activity "category_slug") (date) (start "starts_at" ) (end "ends_at" ) (key "composite_key") (spaces)) (define-json-type (data "data" #())) (define-json-type (id) (restriction-ids "restriction_ids") (pricing-option-id "pricing_option_id") (type "cart_type") (spaces)) (define-json-type (data "data" #())) (define-json-type (id) (type)) (define-json-type (items "items" #())) (define-json-type (total) (item-hash "itemHash")) (define-json-type (data "data" )) (define-json-type (amount) (type)) (define-json-type (cart-source "cart_source") (credits-to-reserve "credits_to_reserve" #()) (selected-user-id "selected_user_id")) (define-json-type (message)) (define-json-type (tender-type "tender_type") (amount) (info)) (define-json-type (completed-waivers "completed_waivers") (payments "payments" #()) (selected-user-id "selected_user_id") (source) (terms) (item-hash "item_hash")) (define-json-type (raw)) (define-json-type (name) (venue "venue_slug")) (define-json-type (date "date" ) (start "starts_at" ) (end "ends_at" ) (location "location" )) (define-json-type (item "item" ) (category)) (define-json-type (data "data" #()))