From b19eaf10074004a829891eabc35e6fb14598cab9 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Fri, 10 Jan 2025 16:53:35 +0000 Subject: [PATCH] Add task conditions --- modules/ordo/condition.scm | 38 ++++++++++++++++++++++++++++++++++++++ modules/ordo/task.scm | 25 +++++++++++++++---------- 2 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 modules/ordo/condition.scm diff --git a/modules/ordo/condition.scm b/modules/ordo/condition.scm new file mode 100644 index 0000000..caee868 --- /dev/null +++ b/modules/ordo/condition.scm @@ -0,0 +1,38 @@ +(define-module (ordo condition) + #:use-moudle (ordo context) + #:use-module (ordo action filesystem)) + +(define (cond:any preds) + (lambda (ctx) + (let loop ((preds preds)) + (if (null? preds) + #f + (let ((p (car preds))) + (if (p ctx) + #t + (loop (cdr preds)))))))) + +(define (cond:every preds) + (lambda (ctx) + (let loop ((preds preds)) + (if (null? preds) + #t + (let ((p (car preds))) + (if (p ctx) + (loop (cdr preds)) + #f)))))) + +(define (cond:command-available? cmd-name) + (lambda (ctx) + (let ((_ rc) (run "which" `(,cmd-name))) + (zero? rc)))) + +(define (cond:directory? path) + (lambda (ctx) + (let ((st ((action:stat path) ctx))) + (and st (string=? "directory" (assoc-ref st 'file-type)))))) + +(define (cond:regular-file? path) + (lambda (ctx) + (let ((st ((action:stat path) ctx))) + (and st (string=? "regular-file" (assoc-ref st 'file-type)))))) diff --git a/modules/ordo/task.scm b/modules/ordo/task.scm index a307d0a..fa3f694 100644 --- a/modules/ordo/task.scm +++ b/modules/ordo/task.scm @@ -7,28 +7,33 @@ #:export (task task? task-description + task-condition task-action task-register task-triggers run-task)) (define-record-type - (make-task description action register triggers) + (make-task description condition action register triggers) task? (description task-description) + (condition task-condition) (action task-action) (register task-register) (triggers task-triggers)) -(define* (task description action #:key (register #f) (triggers '())) - (make-task description action register triggers)) +(define* (task description action #:key (condition (const #t)) (register #f) (triggers '())) + (make-task description condition action register triggers)) (define (run-task ctx t) (match t - (($ description action register triggers) - (format #t "RUNNING TASK ~a~%" description) - (let ((result (action ctx))) - (when register - (register-context-var! ctx register result)) - (when triggers - (add-context-triggers! ctx triggers)))))) + (($ description condition action register triggers) + (if (not (condition ctx)) + (format #t "SKIPPING TASK ~a (precondition not met)~%" description) + (begin + (format #t "RUNNING TASK ~a~%" description) + (let ((result (action ctx))) + (when register + (register-context-var! ctx register result)) + (when triggers + (add-context-triggers! ctx triggers))))))))