diff options
-rw-r--r-- | ccwl/ccwl.scm | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/ccwl/ccwl.scm b/ccwl/ccwl.scm index b1425f8..e49225a 100644 --- a/ccwl/ccwl.scm +++ b/ccwl/ccwl.scm @@ -12,7 +12,8 @@ workflow input output - step)) + step + pipeline)) (define-immutable-record-type <input> (make-input id type label default binding source other) @@ -48,6 +49,11 @@ "Build and return an <output> object." (make-output id type binding source other)) +(define %stdin + (input "stdin" #:type 'File)) + +(define %stdout + (output "stdout" #:type 'stdout)) (define (input->tree input) "Convert INPUT, an <input> object, to a tree." @@ -159,6 +165,38 @@ interface-inputs outputs))) +(define (pipeline id steps outputs) + ;; Error out if any step does not encapsulate a command. + (cond + ((find (lambda (step) + (not (command? (step-run step)))) + steps) + => (lambda (step) + (error "Step does not encapsulate command" step)))) + (workflow id + (reverse + (fold (lambda (step result) + (match result + ((previous-step tail ...) + (cons* + ;; Add an stdin input that is connected to the stdout + ;; of the previous step. + (let ((stdin (set-input-source %stdin + (string-append (step-id previous-step) "/" (output-id %stdout))))) + (append-step-in (modify-step-run step + (cut set-command-stdin <> stdin)) + stdin)) + previous-step + tail)) + (() (list step)))) + (list) + ;; Add an stdout output to all steps. + (map (lambda (step) + (append-step-out (modify-step-run step (cut append-command-outputs <> %stdout)) + %stdout)) + steps))) + outputs)) + (define (output->cwl output) `(,(output-id output) ,@(filter identity |