mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +01:00
emacs: Split out the incremental json parser into its own function
This patch splits out the incremental json parser into its own function. It moves the main logic of the parser to happen inside the parse buffer rather than inside the results buffer, but makes sure all results and all errors are displayed in the results buffer. It also changes the local parser variables from being buffer local to the results buffer to being buffer local to the parse buffer, and sets them up automatically so the caller does not need to. Finally to keep the diff small this patch does not fix the whitespace, nor complete the code movement (these are done in subsequent patches) but it should contain all the functional changes.
This commit is contained in:
parent
35ebf0b321
commit
1dd76ab9b6
1 changed files with 27 additions and 12 deletions
|
@ -838,8 +838,28 @@ non-authors is found, assume that all of the authors match."
|
||||||
;; Insert new data
|
;; Insert new data
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(goto-char (point-max))
|
(goto-char (point-max))
|
||||||
(insert string)))
|
(insert string))
|
||||||
(with-current-buffer results-buf
|
(notmuch-json-parse-partial-list 'notmuch-search-show-result
|
||||||
|
'notmuch-search-show-error
|
||||||
|
results-buf)))))
|
||||||
|
|
||||||
|
(defun notmuch-json-parse-partial-list (result-function error-function results-buf)
|
||||||
|
"Parse a partial JSON list from current buffer.
|
||||||
|
|
||||||
|
This function consumes a JSON list from the current buffer,
|
||||||
|
applying RESULT-FUNCTION in buffer RESULT-BUFFER to each complete
|
||||||
|
value in the list. It operates incrementally and should be
|
||||||
|
called whenever the buffer has been extended with additional
|
||||||
|
data.
|
||||||
|
|
||||||
|
If there is a syntax error, this will attempt to resynchronize
|
||||||
|
with the input and will apply ERROR-FUNCTION in buffer
|
||||||
|
RESULT-BUFFER to any input that was skipped."
|
||||||
|
(let (done)
|
||||||
|
(unless (local-variable-p 'notmuch-search-json-parser)
|
||||||
|
(set (make-local-variable 'notmuch-search-json-parser)
|
||||||
|
(notmuch-json-create-parser (current-buffer)))
|
||||||
|
(set (make-local-variable 'notmuch-search-process-state) 'begin))
|
||||||
(while (not done)
|
(while (not done)
|
||||||
(condition-case nil
|
(condition-case nil
|
||||||
(case notmuch-search-process-state
|
(case notmuch-search-process-state
|
||||||
|
@ -855,7 +875,8 @@ non-authors is found, assume that all of the authors match."
|
||||||
(case result
|
(case result
|
||||||
((retry) (setq done t))
|
((retry) (setq done t))
|
||||||
((end) (setq notmuch-search-process-state 'end))
|
((end) (setq notmuch-search-process-state 'end))
|
||||||
(otherwise (notmuch-search-show-result result)))))
|
(otherwise (with-current-buffer results-buf
|
||||||
|
(funcall result-function result))))))
|
||||||
((end)
|
((end)
|
||||||
;; Any trailing data is unexpected
|
;; Any trailing data is unexpected
|
||||||
(notmuch-json-eof notmuch-search-json-parser)
|
(notmuch-json-eof notmuch-search-json-parser)
|
||||||
|
@ -863,16 +884,13 @@ non-authors is found, assume that all of the authors match."
|
||||||
(json-error
|
(json-error
|
||||||
;; Do our best to resynchronize and ensure forward
|
;; Do our best to resynchronize and ensure forward
|
||||||
;; progress
|
;; progress
|
||||||
(notmuch-search-show-error
|
|
||||||
"%s"
|
|
||||||
(with-current-buffer parse-buf
|
|
||||||
(let ((bad (buffer-substring (line-beginning-position)
|
(let ((bad (buffer-substring (line-beginning-position)
|
||||||
(line-end-position))))
|
(line-end-position))))
|
||||||
(forward-line)
|
(forward-line)
|
||||||
bad))))))
|
(with-current-buffer results-buf
|
||||||
|
(funcall error-function "%s" bad))))))
|
||||||
;; Clear out what we've parsed
|
;; Clear out what we've parsed
|
||||||
(with-current-buffer parse-buf
|
(delete-region (point-min) (point))))
|
||||||
(delete-region (point-min) (point)))))))
|
|
||||||
|
|
||||||
(defun notmuch-search-tag-all (&optional tag-changes)
|
(defun notmuch-search-tag-all (&optional tag-changes)
|
||||||
"Add/remove tags from all messages in current search buffer.
|
"Add/remove tags from all messages in current search buffer.
|
||||||
|
@ -984,9 +1002,6 @@ Other optional parameters are used as follows:
|
||||||
;; This buffer will be killed by the sentinel, which
|
;; This buffer will be killed by the sentinel, which
|
||||||
;; should be called no matter how the process dies.
|
;; should be called no matter how the process dies.
|
||||||
(parse-buf (generate-new-buffer " *notmuch search parse*")))
|
(parse-buf (generate-new-buffer " *notmuch search parse*")))
|
||||||
(set (make-local-variable 'notmuch-search-process-state) 'begin)
|
|
||||||
(set (make-local-variable 'notmuch-search-json-parser)
|
|
||||||
(notmuch-json-create-parser parse-buf))
|
|
||||||
(process-put proc 'parse-buf parse-buf)
|
(process-put proc 'parse-buf parse-buf)
|
||||||
(set-process-sentinel proc 'notmuch-search-process-sentinel)
|
(set-process-sentinel proc 'notmuch-search-process-sentinel)
|
||||||
(set-process-filter proc 'notmuch-search-process-filter)
|
(set-process-filter proc 'notmuch-search-process-filter)
|
||||||
|
|
Loading…
Reference in a new issue