branch: elpa/beancount
commit f55912cdef42a02e0f543bf9ec72fd82eb031a81
Author: Akira Komamura <akira.komam...@gmail.com>
Commit: Martin Blais <bl...@furius.ca>

    Add flymake-bean-check
---
 flymake-bean-check.el | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)

diff --git a/flymake-bean-check.el b/flymake-bean-check.el
new file mode 100644
index 0000000000..d70a8d48f8
--- /dev/null
+++ b/flymake-bean-check.el
@@ -0,0 +1,100 @@
+;;; flymake-bean-check.el --- A Flymake backend for bean-check -*- 
lexical-binding: t -*-
+
+;; Copyright (C) 2023 Akira Komamura
+
+;; Author: Akira Komamura <akira.komam...@gmail.com>
+;; Version: 0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: languages tools
+;; URL: https://github.com/akirak/flymake-bean-check
+
+;; This file is not part of GNU Emacs.
+
+;;; License:
+
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library provides a flymake backend for bean-check
+;; 
<https://beancount.github.io/docs/running_beancount_and_generating_reports.html#bean-check>.
+
+;; To use this library, run `flymake-bean-check-enable' in the file buffer of a
+;; beancount journal. A recommended way is to add the function to
+;; `beancount-mode-hook'.
+
+;;; Code:
+
+(defgroup flymake-bean-check nil
+  "A Flymake backend for bean-check."
+  :group 'flymake
+  :group 'beancount-mode)
+
+(defconst flymake-bean-check-location-regexp
+  (rx bol (not (any blank)) (*? anything)
+      ":" (group (+ digit)) ":"
+      (+ blank)
+      (group (+ nonl))))
+
+(defcustom flymake-bean-check-executable "bean-check"
+  "Executable file of bean-check."
+  :type 'file)
+
+(defvar-local flymake-bean-check-process nil)
+
+;;;###autoload
+(defun flymake-bean-check-enable ()
+  (interactive nil beancount-mode)
+  (when (buffer-file-name)
+    (flymake-mode t)
+    (add-hook 'flymake-diagnostic-functions 'flymake-bean-check--run nil t)))
+
+(defun flymake-bean-check--run (report-fn &rest _ignored)
+  (unless (executable-find flymake-bean-check-executable)
+    (error "The executable %s doesn't exist. See 
`flymake-bean-check-executable'"
+           flymake-bean-check-executable))
+  (when (and flymake-bean-check-process
+             (process-live-p flymake-bean-check-process))
+    (kill-process flymake-bean-check-process))
+  (let ((source (current-buffer))
+        (buffer (generate-new-buffer "*flymake-bean-check*")))
+    (setq flymake-bean-check-process
+          (make-process :buffer buffer
+                        :name "flymake-bean-check"
+                        :noquery t
+                        :connection-type 'pipe
+                        :command (list flymake-bean-check-executable
+                                       (expand-file-name (buffer-file-name)))
+                        :sentinel
+                        (lambda (proc _event)
+                          (when (memq (process-status proc) '(exit signal))
+                            (unwind-protect
+                                (with-current-buffer buffer
+                                  (goto-char (point-min))
+                                  (let (result)
+                                    (while (re-search-forward 
flymake-bean-check-location-regexp
+                                                              nil t)
+                                      (pcase-let*
+                                          ((message (match-string 2))
+                                           (`(,begin . ,end) 
(flymake-diag-region
+                                                              source
+                                                              
(string-to-number (match-string 1)))))
+                                        (push (flymake-make-diagnostic source 
begin end
+                                                                       :error 
message)
+                                              result)))
+                                    (funcall report-fn (nreverse result))))
+                              (kill-buffer buffer))))))))
+
+(provide 'flymake-bean-check)
+;;; flymake-bean-check.el ends here

Reply via email to