forked from FG42/FG42
47 lines
1.7 KiB
EmacsLisp
47 lines
1.7 KiB
EmacsLisp
;;; dsl --- A dsl to be used with project configurations.
|
|
;;; Commentary:
|
|
;;; Code:
|
|
(defvar open-project-configurations (make-hash-table :test 'equal)
|
|
"This hashmap is responsible for storing project configurations.")
|
|
|
|
;; DSL -----------------------------------------------------
|
|
(defmacro deftask (name &rest body)
|
|
"Create a new task for the project with the given NAME and BODY."
|
|
`(let ((pmap (gethash __project-name__
|
|
open-project-configurations
|
|
(make-hash-table :test 'equal))))
|
|
|
|
(puthash ,(symbol-name name) (lambda (project-path buffer) ,@body) pmap)
|
|
(puthash __project-name__ pmap open-project-configurations)))
|
|
|
|
(defmacro run-shell-command (command)
|
|
"Run the given shell COMMAND on the run buffer."
|
|
`(async-shell-command ,command buffer))
|
|
|
|
;; TASK RUNNERS --------------------------------------------
|
|
(defun with-buffer (name action)
|
|
"Create a buffer with the given NAME for the given ACTION."
|
|
(get-buffer-create (format "*%s %s*" name action)))
|
|
|
|
(defun run-task-buffer (project-name)
|
|
"Create or get the buffer which hold the output of run task.
|
|
|
|
The buffer name will contains PROJECT-NAME."
|
|
(with-buffer project-name "run"))
|
|
|
|
(defun execute-task (project task-name)
|
|
"Run the task for PROJECT with the given TASK-NAME."
|
|
(let* ((project-hash (gethash project open-project-configurations))
|
|
(task (gethash task-name project-hash))
|
|
(buf (with-buffer project task-name)))
|
|
(funcall task project buf)))
|
|
|
|
(defun execute-run-task ()
|
|
"Execute the :run task for the current project."
|
|
(interactive)
|
|
(let ((project (cdr (project-current))))
|
|
(execute-task project "run")))
|
|
|
|
(provide 'projects/dsl)
|
|
;;; dsl ends here
|