(in-package #:candle) (defun import-package (pkg) (asdf:load-system pkg)) (defun run-task (task) (format t "~%~c[1;33mRunning ~:(~A~)~c[0m~%" #\Esc (getf task :name) #\Esc) (if (eval (getf task :directions)) (progn (format t "~c[1;32m- ~:(~A~) Passed!~c[0m~%" #\Esc (getf task :name) #\Esc) t) (format t "~c[1;31m- ~:(~A~) Failed!~c[0m~%" #\Esc (getf task :name) #\Esc))) (defun list-tasks () "LIST-TASKS => TASKS TASKS: TASK* ARGUMENTS AND VALUES: TASK: a keyword, representing a task that can be run DESCRIPTION: Get a list of tasks available in the current .candle file." (if (not (probe-file ".candle")) :dot-candle-absent (with-open-file (str ".candle") (asdf:initialize-source-registry `(:source-registry (:tree ,(car (directory "."))) :INHERIT-CONFIGURATION)) (mapcar #'import-package (cdr (read str))) (mapcar (lambda (task) (getf task :name)) (getf (read str) :tasks))))) (defun run (&optional specified-task) "RUN &optional SPECIFIED-TASK => RESULT ARGUMENTS AND VALUES: SPECIFIED-TASK: a keyword, the task to run RESULT: a boolean, whether the process was successful DESCRIPTION: Runs the script specified by the .candle file in the current directory. When completed, the boolean will be returned if it was successful or not. If SPECIFIED-TASK exists, only that task is run." (if (not (probe-file ".candle")) :dot-candle-absent (with-open-file (str ".candle") (asdf:initialize-source-registry `(:source-registry (:tree ,(car (directory "."))) :INHERIT-CONFIGURATION)) (mapcar #'import-package (cdr (read str))) (let ((candle-definition (read str))) (format t "Running tasks for ~(~A~)~%" (getf candle-definition :name)) (every #'identity (mapcar #'run-task (remove-if (lambda (task) (and specified-task (not (eql (getf task :name) specified-task)))) (getf candle-definition :tasks))))))))