Fix date parsing

This commit is contained in:
2025-10-25 20:44:40 -07:00
parent c2e8792c2c
commit e958aa99bf

View File

@ -132,10 +132,6 @@ least one range given will match (that is, the union of all given dates).~%"))
:multi-line-mode t) :multi-line-mode t)
func) func)
out))) out)))
(def-no-time "^$"
(lambda (source registers)
(declare (ignore source registers))
(local-time:now)))
(def-no-time "[0-9]+" (def-no-time "[0-9]+"
(lambda (source registers) (lambda (source registers)
(declare (ignore registers)) (declare (ignore registers))
@ -209,28 +205,34 @@ least one range given will match (that is, the union of all given dates).~%"))
(defun parse-date-range (string) (defun parse-date-range (string)
"Parse a date range from STRING." "Parse a date range from STRING."
(let ((sep (search ".." string))) (let ((sep (search ".." string)))
(when (not sep) (if (not sep)
(error 'date-parse-error (parse-date-time string)
:source string (progn
:message "expected \"..\" to separate start and end date"))
(let ((second-sep (search ".." string :start2 (1+ sep)))) (let ((second-sep (search ".." string :start2 (1+ sep))))
(when second-sep (when second-sep
(error 'date-parse-error :source string (error 'date-parse-error :source string
:position second-sep :position second-sep
:message "multiple \"..\" found"))) :message "multiple \"..\" found")))
(macrolet ((trim (str) (let* ((start (string-trim '(#\Tab #\Space #\Newline)
`(string-trim '(#\Tab #\Space #\Newline) ,str))) (subseq string 0 sep)))
(cons (parse-date-time (trim (subseq string 0 sep))) (end (string-trim '(#\Tab #\Space #\Newline)
(parse-date-time (trim (subseq string (+ sep 2)))))))) (subseq string (+ sep 2)))))
(when (and (zerop (length start))
(zerop (length end)))
(error "Invalid date range: ~S" string))
(cons (when (plusp (length start))
(parse-date-time start))
(when (plusp (length end))
(parse-date-time end))))))))
(defun timestamp-in-ranges (stamp ranges) (defun timestamp-in-ranges (stamp ranges)
"Return non-nil if STAMP is in one of RANGES." "Return non-nil if STAMP is in one of RANGES."
(some (lambda (range) (some (lambda (range)
(destructuring-bind (start . end) range (destructuring-bind (start . end) range
(when (local-time:timestamp> start end) (when (and start end (local-time:timestamp> start end))
(rotatef start end)) (rotatef start end))
(and (local-time:timestamp>= stamp start) (and (or (not start) (local-time:timestamp>= stamp start))
(local-time:timestamp<= stamp end)))) (or (not end) (local-time:timestamp<= stamp end)))))
ranges)) ranges))
(defclass option-multi-parsed (clingon:option) (defclass option-multi-parsed (clingon:option)