From dbb7ab7fd8f54408946e7cd08ec03409ec84a2fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Thu, 16 Mar 2023 12:04:51 +0100 Subject: [PATCH] Load members, find them by id or nick. --- brmsaptool.scm | 18 +++++++++++--- members-base.scm | 62 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 62 insertions(+), 18 deletions(-) diff --git a/brmsaptool.scm b/brmsaptool.scm index e0e754f..938952b 100644 --- a/brmsaptool.scm +++ b/brmsaptool.scm @@ -52,6 +52,9 @@ ;; Command-line options and configurable parameters (define *members-directory* (make-parameter "members")) +(define -member-id- (make-parameter #f)) +(define -member-nick- (make-parameter #f)) +(define -action- (make-parameter #f)) ;; Arguments parsing (command-line @@ -65,11 +68,20 @@ (-MB (dir) "Members base directory" (*members-directory* dir)) (-mfkw () "Member-File invalid Key Warning" (*member-file-check-syntax* 'warning)) (-mfkq () "Member-File invalid Key Quiet" (*member-file-check-syntax* 'quiet)) - (-mfec (n) "Member-File parser Error Context (lines)" (*member-file-context* (string->number n)))) + (-mfec (n) "Member-File parser Error Context (lines)" (*member-file-context* (string->number n))) + (-mi (id) "Specif member by id" (-member-id- (string->number id))) + (-mn (nick) "Specify member by nick" (-member-nick- nick)) + ) ;; Load the members database (required for everything anyway) -(define MB (load-members "members" #t)) -(print MB) +(define MB (load-members (*members-directory*) #t)) + +;; If a member is specified by either id or nick, get its record +(define mr (if (-member-id-) + (find-member-by-id MB (-member-id-)) + (if (-member-nick-) + (find-member-by-nick (-member-nick-)) + #f))) ;; ... (void) diff --git a/members-base.scm b/members-base.scm index ae64717..59e142b 100644 --- a/members-base.scm +++ b/members-base.scm @@ -29,6 +29,10 @@ members-base ( load-members + find-member-by-id + find-member-by-nick + list-members-ids + list-members-nicks members-base-tests! ) @@ -162,32 +166,60 @@ (files+symlinks->files-dictionary (get-files+symlinks dn)))) (mb0 (dict-map - (lambda (symfn symlinks) - (when progress? - (display ".")) - (members-base-load-member dn - symfn - symlinks)) - fss)) - (mb (dict-reduce (make-dict) - (lambda (acc symfn mr) - (dict-set acc (dict-ref mr 'id) mr)) - mb0))) + (lambda (symfn symlinks) + (when progress? + (display ".")) + (members-base-load-member dn + symfn + symlinks)) + fss)) + (mb1 (dict-reduce (make-dict) + (lambda (acc symfn mr) + (dict-set acc (dict-ref mr 'id) mr)) + mb0)) + (mb (dict-reduce '() + (lambda (acc id mr) + (cons mr acc)) + mb1))) (when progress? (print " ok.")) mb))) + ;; Gets member based by generic predicate + (define (find-member-by-predicate mb pred) + (let loop ((mdb mb)) + (if (null? mdb) + #f + (let ((mr (car mdb))) + (if (pred mr) + mr + (loop (cdr mdb))))))) + + ;; Returns member record found by id (define (find-member-by-id mb id) - #f) + (find-member-by-predicate + mb + (lambda (mr) + (eq? (dict-ref mr 'id) id)))) + ;; Returns member record found by id (define (find-member-by-nick mb nick) - #f) + (find-member-by-predicate + mb + (lambda (mr) + (equal? + (dict-ref + (dict-ref mr 'info) + 'nick) + nick)))) + ;; Returns all ids found in the database (define (list-members-ids mb) - #f) + (map (lambda (mr) (dict-ref mr 'id)) mb)) + ;; Returns all nicks found in the database (define (list-members-nicks mb) - #f) + (map (lambda (mr) (dict-ref (dict-ref mr 'info) 'nick)) mb)) ;; Performs self-tests of this module. (define (members-base-tests!)