From 5dce88bcad0a1263984b71fa19ef26393d781960 Mon Sep 17 00:00:00 2001 From: Matthew Fennell Date: Thu, 16 Apr 2026 08:15:35 +0100 Subject: Initial commit --- records.scm | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 records.scm (limited to 'records.scm') diff --git a/records.scm b/records.scm new file mode 100644 index 0000000..cff328f --- /dev/null +++ b/records.scm @@ -0,0 +1,151 @@ +;;; 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" #())) -- cgit v1.2.3