;; ;; member-print.scm ;; ;; Procedures working with complete member record (as loaded by the ;; members-base). ;; ;; ISC License ;; ;; Copyright 2023 Brmlab, z.s. ;; Dominik Pantůček ;; ;; Permission to use, copy, modify, and/or distribute this software ;; for any purpose with or without fee is hereby granted, provided ;; that the above copyright notice and this permission notice appear ;; in all copies. ;; ;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL ;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED ;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE ;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR ;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS ;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, ;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN ;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;; (declare (unit member-print)) (module member-print ( print-member-info print-member-table print-member-source ) (import scheme (chicken base) (chicken string) (chicken sort) (chicken format) dictionary member-record month utils table listing ansi) ;; Prints human-readable information (define (print-member-info mr) (let* ((id (dict-ref mr 'id)) (aliases (dict-ref mr 'symlinks)) (info (dict-ref mr 'info)) (sinfo (sort info (lambda (a b) (stringstring (car a)) (symbol->string (car b))))))) (print "User " id " alias(es): " (string-intersperse (map symbol->string aliases) ", ")) (when (member-suspended? mr) (print " Suspended for " (member-suspended-months mr) " months.")) (newline) (let loop ((sinfo sinfo)) (when (not (null? sinfo)) (let* ((kv (car sinfo)) (k (car kv)) (v (cdr kv))) (loop (cdr sinfo))))))) ;; Prints nicely formatted table (define (print-member-table mr) (let* ((aliases (dict-ref mr 'symlinks)) (head (list (list "ID:" (member-id mr)) (list (sprintf "Alias~A:" (if (> (length aliases) 1) "es" "")) (string-intersperse (map symbol->string aliases) ", ")) (if (member-suspended? mr) (list "Suspended for:" (let ((msm (member-suspended-months mr))) (sprintf "~A month~A" msm (if (> msm 1) "s" "")))) #f))) (info (dict-ref mr 'info)) (sikeys (sort (dict-keys info) (lambda (a b) (stringstring a) (symbol->string b))))) (body (map (lambda (k) (let ((v (dict-ref info k))) (case k ((joined) (list k (month->string v))) ((card desfire credit) (list k (table->string (map (lambda (c) (list (car c) (cdr c))) v) #:col-border #t))) ((suspend student) (list k (table->string (cons (list "Since" "Until") (map (lambda (p) (list (month->string (car p)) (month->string (cdr p)))) v)) #:col-border #t))) (else (list k v))))) sikeys)) (result (filter identity (append head body)))) (print (table->string result #:table-border #t #:row-border #t #:col-border #t)))) ;; Nicely prints the member source with any errors recorded. (define (print-member-source mr) (let* ((lines (dict-ref mr 'source mr)) (file-name (dict-ref mr 'file-name)) (hls (dict-ref mr 'highlights))) (print file-name ":") (print-source-listing lines hls -1 a:error a:default "" "" ; Not used "..." ; Not used ))) )