Streamline symbols in member-record.

This commit is contained in:
Dominik Pantůček 2023-03-25 20:43:11 +01:00
parent 4dac92b197
commit 350353608e
2 changed files with 46 additions and 9 deletions

View file

@ -246,4 +246,4 @@
(import member-parser)
(member-parser-tests!)
(print (load-member-file (make-member-record "joe" "members/joe" '())))
(print (load-member-file (make-member-record "joe" "members/joe" '(2803))))

View file

@ -47,18 +47,42 @@
member-student?
member-existing?
member-nick
member-id
member-record-tests!
)
(import scheme
(chicken base)
(chicken keyword)
(chicken irregex)
dictionary
testing
month
period
configuration)
;; Checks whether given string is a 4-digit decimal number.
(define (is-4digit-string? s)
(if (irregex-search (irregex "^[0-9]{4}$") s)
#t
#f))
;; checks whether given symbol is a 4-digit one.
(define (is-4digit-symbol? s)
(is-4digit-string?
(symbol->string s)))
;; Returns the first 4-digit symbol from the list.
(define (get-4digit-symbol-from-list lst)
(let loop ((lst lst))
(if (null? lst)
#f
(if (is-4digit-symbol? (car lst))
(car lst)
(loop (cdr lst))))))
;; Creates new member record based on the file and symlinks
;; information received from the members directory. Any keyword
;; arguments are converted to respective symbols in the dictionary.
@ -66,7 +90,10 @@
(let loop ((args args)
(pairs `((file-name . ,file-name)
(file-path . ,file-path)
(symlinks . ,symlinks))))
(symlinks . ,symlinks)
(id . ,(string->number
(symbol->string
(get-4digit-symbol-from-list (cons file-name symlinks))))))))
(if (null? args)
(make-dict pairs)
(if (not (keyword? (car args)))
@ -173,21 +200,31 @@
(and joined
(month<=? joined (*current-month*)))))
;; Nickname as string
(define (member-nick mr)
(member-record-info mr 'nick))
;; Returns member id
(define (member-id mr)
(dict-ref mr 'id))
;; Self-tests
(define (member-record-tests!)
(run-tests
member-record
(test-equal? make-member-record
(make-member-record "1234" "members/1234" '("member"))
'((file-name . "1234")
(make-member-record '|1234| "members/1234" '(|member|))
'((file-name . |1234|)
(file-path . "members/1234")
(symlinks "member")))
(symlinks |member|)
(id . 1234)))
(test-equal? make-member-record
(make-member-record "1234" "members/1234" '("member") #:id 1234)
'((id . 1234)
(file-name . "1234")
(make-member-record '|1234| "members/1234" '(|member|) #:msg "msg")
'((msg . "msg")
(file-name . |1234|)
(file-path . "members/1234")
(symlinks "member")))
(symlinks |member|)
(id . 1234)))
(test-equal? member-record-set
(member-record-set '() #:id 1234)
'((id . 1234)))