diff options
author | Arun Isaac | 2018-11-13 18:19:49 +0530 |
---|---|---|
committer | Arun Isaac | 2018-11-13 18:19:49 +0530 |
commit | 5fada5773429280293e5dfd25d5e6126b08ea59d (patch) | |
tree | 84d2d9df6acd184a049ae918c9ded794eb94d64a /email | |
parent | 45a88da4a544675ea42dc20011f4091950a1dcb3 (diff) | |
download | guile-email-5fada5773429280293e5dfd25d5e6126b08ea59d.tar.gz guile-email-5fada5773429280293e5dfd25d5e6126b08ea59d.tar.lz guile-email-5fada5773429280293e5dfd25d5e6126b08ea59d.zip |
email: Deduplicate email address parsing.
* email/email.scm (post-process-mailbox): New function.
(parse-email-address): Call post-process-mailbox instead of
reimplementing address parsing using regular expressions.
(parse-email-headers): Call post-process-mailbox.
Diffstat (limited to 'email')
-rw-r--r-- | email/email.scm | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/email/email.scm b/email/email.scm index 6ad2d93..2c9dea4 100644 --- a/email/email.scm +++ b/email/email.scm @@ -562,6 +562,23 @@ explained in RFC2045), and return that list." (values headers (read-while port get-line-with-delimiter identity)))))) +(define (post-process-mailbox . args) + (define (trim-address address) + (string-trim-right + (string-trim (string-trim-both address) #\<) + #\>)) + + (match args + ;; name-addr email address + (`(mailbox (display-name ,name) ,address) + `((name . ,(decode-mime-encoded-word + (string-trim-both name))) + (address . ,(trim-address address)))) + ;; addr-spec email address + (`(mailbox ,address) + `((address . ,(trim-address address)))) + (_ (error "Failed to parse mailbox")))) + (define (post-process-content-transfer-encoding _ value) (list 'content-transfer-encoding (string->lcase-symbol value))) @@ -634,16 +651,11 @@ For example, => ((name . \"Foo\") (address . \"foo@example.org\")) (parse-email-address \"foo@example.org\") => ((address . \"foo@example.org\"))" - (cond - ((string-match "([^<]*)<([^>]*)>" address) - => (lambda (match-record) - (let ((name (string-trim-both (match:substring match-record 1))) - (address (match:substring match-record 2))) - (if (string-null? name) - `((address . ,address)) - `((name . ,name) - (address . ,address)))))) - (else `((address . ,address))))) + (pre-post-order + (peg:tree (match-pattern mailbox address)) + `((mailbox . ,post-process-mailbox) + (*text* . ,(lambda (_ text) text)) + (*default* . ,(lambda tree tree))))) (define interpret-address (match-lambda @@ -716,11 +728,6 @@ message. Else, return a single <mime-entity> record." (define (parse-email-headers headers) "Parse string HEADERS as email headers and return an association list of header keys and values." - (define (trim-address address) - (string-trim-right - (string-trim (string-trim-both address) #\<) - #\>)) - (pre-post-order (peg:tree (match-pattern fields headers)) @@ -749,14 +756,7 @@ list of header keys and values." (+ (* 60 60 (string->number zone-hours)) (* 60 (string->number zone-minutes)))))))) (orig-date . ,(lambda (_ date) (list 'date date))) - (mailbox . ,(match-lambda* - (`(mailbox (display-name ,name) ,address) - `((name . ,(decode-mime-encoded-word - (string-trim-both name))) - (address . ,(trim-address address)))) - (`(mailbox ,address) - `((address . ,(trim-address address)))) - (_ (error "Failed to parse mailbox")))) + (mailbox . ,post-process-mailbox) (address-list *macro* . ,macro-process-address-list) (mailbox-list *macro* . ,macro-process-address-list) (optional-field . ,post-process-optional-field) |