scm: return empty lists instead of #f for some methods

Some methods that returned lists would return ~#f~ when there were no
results (e.g., to, from, cc, bcc, references, labels); however, it's
nicer to return an empty list instead, which what we now do. Technically a
breaking change, but justified while we are still 'experimental'.
This commit is contained in:
Dirk-Jan C. Binnema
2025-11-29 12:31:29 +02:00
committed by Seth Ladygo
parent 20efd31f3d
commit 52f44653b0
4 changed files with 66 additions and 34 deletions

View File

@ -40,6 +40,11 @@
(let ((recip (car (to msg))))
(test-equal "Bilbo Baggins" (assoc-ref recip 'name))
(test-equal "bilbo@anotherexample.com" (assoc-ref recip 'email)))
;; cc, bc
(test-equal '() (cc msg))
(test-equal '() (bcc msg))
;; no date
(test-assert (not (date msg)))
;; flags
@ -90,7 +95,7 @@
(test-equal "gcc include search order" (subject msg))
(test-equal "klub" (header msg "precedence"))
(test-equal "gcc-help.gcc.gnu.org" (mailing-list msg))
(test-equal #f (references msg))
(test-equal '() (references msg))
(test-equal "3BE9E6535E3029448670913581E7A1A20D852173@emss35m06.us.lmco.com" (message-id msg))
(test-equal "3BE9E6535E3029448670913581E7A1A20D852173@emss35m06.us.lmco.com" (thread-id msg))
@ -98,11 +103,15 @@
(test-equal "gcc include search order" (assoc-ref alist 'subject))
(test-equal 'normal (assoc-ref alist 'priority))
(test-equal '((email . "anon@example.com") (name . "Mickey Mouse"))
(car (assoc-ref alist 'from))))
(car (assoc-ref alist 'from)))
;; cc, bc, labels
(test-equal '() (cc msg))
(test-equal '() (bcc msg))
(test-equal '() (labels msg)))
(test-end "test-message-more"))
(define (test-message-parts)
(test-begin "test-message-parts")
(let* ((msg (car (mfind "flag:attach")))

View File

@ -348,16 +348,16 @@ Return #f otherwise."
(assoc-ref (message->alist message) 'size))
(define-method (references (message <message>))
"Get the list of reference of MESSAGE or #f if not available.
"Get the list of reference of MESSAGE
with the oldest first and the direct parent as the last one. Note, any
reference (message-id) will appear at most once, duplicates and
fake-message-id (see impls) are filtered out. If there are no references, return
#f."
(assoc-ref (message->alist message) 'references))
(or (assoc-ref (message->alist message) 'references) '()))
(define-method (labels (message <message>))
"Get the list of labels for MESSAGE or #f if not available."
(assoc-ref (message->alist message) 'labels))
"Get the list of labels for MESSAGE."
(or (assoc-ref (message->alist message) 'labels) '()))
(define-method (thread-id (message <message>))
"Get the oldest (first) reference for MESSAGE, or message-id if there are none.
@ -376,14 +376,11 @@ This is method is useful to determine the thread a message is in."
(define-method (flags (message <message>))
"Get the size of the MESSAGE in bytes or #f if not available."
(assoc-ref (message->alist message) 'flags))
(or (assoc-ref (message->alist message) 'flags) '()))
(define-method (flag? (message <message>) flag)
"Does MESSAGE have some FLAG?"
(let ((flgs (flags message)))
(if flgs
(if (member flag flgs) #t #f)
#f)))
(if (member flag (flags message)) #t #f))
(define-method (draft? (message <message>))
"Is MESSAGE a draft message?"
@ -442,22 +439,21 @@ This is method is useful to determine the thread a message is in."
(flag? message 'calendar))
(define-method (from (message <message>))
"Get the sender (the From: field) for MESSAGE or #f if not found."
(assoc-ref (message->alist message) 'from))
"Get the list of sender (the From: field) for MESSAGE."
(or (assoc-ref (message->alist message) 'from) '()))
(define-method (to (message <message>))
"Get the (intended) recipient for MESSAGE (the To: field) or #f if not found."
(assoc-ref (message->alist message) 'to))
"Get the list of (intended) recipients for MESSAGE (the To: field)."
(or (assoc-ref (message->alist message) 'to) '()))
(define-method (cc (message <message>))
"Get the (intended) carbon-copy recipient for MESSAGE (the Cc: field) or #f if
not found."
(assoc-ref (message->alist message) 'cc))
"Get the list of (intended) carbon-copy recipient for MESSAGE (the Cc: field)."
(or (assoc-ref (message->alist message) 'cc) '()))
(define-method (bcc (message <message>))
"Get the (intended) blind carbon-copy recipient for MESSAGE (the Bcc: field) or
#f if not found."
(assoc-ref (message->alist message) 'bcc))
"Get the list of (intended) blind carbon-copy recipient for MESSAGE (the Bcc:
field)."
(or (assoc-ref (message->alist message) 'bcc) '()))
(define* (body message #:key (html? #f))
"Get the MESSAGE body or #f if not found

View File

@ -455,7 +455,7 @@ Example usage:
@deffn {Scheme Procedure} mcount
@end deffn
Returns the number of messages in the store.
Return the number of messages in the store.
Example usage:
@lisp
@ -475,9 +475,35 @@ Example:
(root-maildir . "/home/user/Maildir") (schema-version . 500))
@end lisp
More fields may be added.
@deffn {Scheme Procedure} root-maildir
@end deffn
Get the root maildir directory, that is, the root of under the directory under
which all messages reside.
This is equivalent to @code{(assoc-ref (store->alist) 'root-maildir)}.
@deffn {Scheme Procedure} personal-addresses
@end deffn
Get the list of personal-addresses as defined in the @code{mu} database, which
may be empty.
This is equivalent to @code{(assoc-ref (store->alist) 'personal-addresses)}. Any
element in this list is either a plain e-mail address, or a PCRE-compatible
regular expression when the first and last characters are @t{/} (forward-slash);
see @t{pcre(3)} for further details.
@deffn {Scheme Procedure} labels
@end deffn
Get the list of all labels present in the store, or @code{#f} if there are none.
Get the list of all labels present in the store, which may be empty. Not to be
confused with @code{labels} procedure for a @code{message} object.
@deffn {Scheme Procedure} labels
@end deffn
Get the list of all labels present in the store, which may empty.
Not to be confused with @code{labels} procedure for a @code{message} object.
@node Message
@ -682,23 +708,19 @@ Each contact is an alist with at least an @code{email} and optionally a
@deffn {Scheme Procedure} from message
@end deffn
Get the list of message senders (usually only one). Returns either a list
of contacts or @t{#f}.
Get the list of message senders (usually a single one).
@deffn {Scheme Procedure} to message
@end deffn
Get the message's intended @t{To:} recipients. Returns either
a list of contacts or @t{#f} if not found.
Get the message's intended @t{To:} recipients list.
@deffn {Scheme Procedure} cc message
@end deffn
Get the message's intended carbon-copy @t{Cc:} recipients. Returns either a list
of contacts or @t{#f} if not found.
Get the message's intended carbon-copy @t{Cc:} recipients list.
@deffn {Scheme Procedure} bcc message
@end deffn
Get the message's intended blind carbon-copy @t{Bcc:} recipients. Returns either
a list of contacts or @t{#f} if not found.
Get the message's intended blind carbon-copy @t{Bcc:} recipients list.
@subsection Flags
@ -824,8 +846,8 @@ For example:
@deffn {Scheme Procedure} labels message
@end deffn
Get the list of labels for this message, or @code{#f} if there are none.
Not to be confused with the @code{labels} procedure for a Store.
Get the list of labels for this message. Not to be confused with the
@code{labels} procedure for a store.
For example:
@lisp