Hi

This patch is buggy as it doesn't take buffer local variables from the
right buffer (so it goes wrong if the buffer changes while the process
is still running). I have a patch which seems to be correct but I want
to do a bit more testing before posting.

Best wishes

Mark



On Sat, 28 Jul 2012, Mark Walters <markwalters1009 at gmail.com> wrote:
> We separate out the json parser into its own function. 
> ---
>
> Hi
>
> Notmuch pick uses the new asynchronous json parser and the code to do so
> is almost identical to that for the search mode. Thus separate out the
> parsing in search mode into a more general function that can easily be
> used by both pick and search.
>
> This saves nearly 50 lines of duplicated code in notmuch-pick.el.
>
> The function notmuch-json-async-parse should probably be move in
> notmuch-lib but that can be a follow on patch.
>
> Best wishes
>
> Mark
>
>  emacs/notmuch.el |   46 ++++++++++++++++++++++++++++++++++++----------
>  1 files changed, 36 insertions(+), 10 deletions(-)
>
> diff --git a/emacs/notmuch.el b/emacs/notmuch.el
> index fd1836f..ee01028 100644
> --- a/emacs/notmuch.el
> +++ b/emacs/notmuch.el
> @@ -816,7 +816,32 @@ non-authors is found, assume that all of the authors 
> match."
>    "Incremental JSON parser for the search process filter.")
>  
>  (defun notmuch-search-process-filter (proc string)
> -  "Process and filter the output of \"notmuch search\""
> +  "Process and filter the output of  \"notmuch search\" using the 
> asynchronous parser."
> +  (setq notmuch-search-process-state
> +     (notmuch-json-async-parse proc
> +                               string
> +                               notmuch-search-process-state
> +                               notmuch-search-json-parser
> +                               'notmuch-search-show-result
> +                               'notmuch-search-show-error)))
> +
> +(defun notmuch-json-async-parse (proc string process-state parser 
> result-function error-function)
> +  "Process and filter the output using the asynchronous parser.
> +
> +This function steps into the first level of JSON nesting and then
> +applies RESULT-FUNCTION to each complete JSON object as it comes
> +in.
> +
> +PROC is the process: it should have a results buffer as
> +process-buffer and a 'parse-buf for the incoming json.
> +PROCESS-STATE the current state of filter process
> +STRING the incoming data
> +PARSER the parser
> +RESULT-FUNCTION a function to call on complete pieces of json
> +ERROR-FUNCTION the function to call on errors
> +
> +The function returns the new PROCESS-STATE"
> +
>    (let ((results-buf (process-buffer proc))
>       (parse-buf (process-get proc 'parse-buf))
>       (inhibit-read-only t)
> @@ -831,28 +856,28 @@ non-authors is found, assume that all of the authors 
> match."
>        (with-current-buffer results-buf
>       (while (not done)
>         (condition-case nil
> -           (case notmuch-search-process-state
> +           (case process-state
>               ((begin)
>                ;; Enter the results list
>                (if (eq (notmuch-json-begin-compound
> -                       notmuch-search-json-parser) 'retry)
> +                       parser) 'retry)
>                    (setq done t)
> -                (setq notmuch-search-process-state 'result)))
> +                (setq process-state 'result)))
>               ((result)
>                ;; Parse a result
> -              (let ((result (notmuch-json-read notmuch-search-json-parser)))
> +              (let ((result (notmuch-json-read parser)))
>                  (case result
>                    ((retry) (setq done t))
> -                  ((end) (setq notmuch-search-process-state 'end))
> -                  (otherwise (notmuch-search-show-result result)))))
> +                  ((end) (setq process-state 'end))
> +                  (otherwise (funcall result-function result)))))
>               ((end)
>                ;; Any trailing data is unexpected
> -              (notmuch-json-eof notmuch-search-json-parser)
> +              (notmuch-json-eof parser)
>                (setq done t)))
>           (json-error
>            ;; Do our best to resynchronize and ensure forward
>            ;; progress
> -          (notmuch-search-show-error
> +          (funcall error-function
>             "%s"
>             (with-current-buffer parse-buf
>               (let ((bad (buffer-substring (line-beginning-position)
> @@ -861,7 +886,8 @@ non-authors is found, assume that all of the authors 
> match."
>                 bad))))))
>       ;; Clear out what we've parsed
>       (with-current-buffer parse-buf
> -       (delete-region (point-min) (point)))))))
> +       (delete-region (point-min) (point))))
> +      process-state)))
>  
>  (defun notmuch-search-tag-all (&optional tag-changes)
>    "Add/remove tags from all messages in current search buffer.
> -- 
> 1.7.9.1

Reply via email to