summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ccwl/ccwl.scm41
1 files changed, 34 insertions, 7 deletions
diff --git a/ccwl/ccwl.scm b/ccwl/ccwl.scm
index e49225a..5e97331 100644
--- a/ccwl/ccwl.scm
+++ b/ccwl/ccwl.scm
@@ -116,9 +116,39 @@
   (string=? (input-id input1)
             (input-id input2)))
 
+(define (auto-connect steps)
+  "Auto-connect STEPS by matching inputs to outputs using their unique
+identifiers. If any inputs are already matched, they are not
+re-matched."
+  (map (lambda (step)
+         (set-step-in step
+                      (map (lambda (input)
+                             ;; If input is already connected, return
+                             ;; it unaltered. Else, try to connect it
+                             ;; to a source.
+                             (cond
+                              ((input-source input)
+                               input)
+                              ;; Input that should be connected to
+                              ;; some intermediate output
+                              ((find (lambda (step)
+                                       (member (input-id input)
+                                               (map output-id (step-out step))))
+                                     steps)
+                               => (lambda (source-step)
+                                    (set-input-source input
+                                                      (string-append (step-id source-step)
+                                                                     "/" (input-id input)))))
+                              ;; Non-internal input that should be
+                              ;; interfaced with the outside world
+                              (else input)))
+                           (step-in step))))
+       steps))
+
 (define* (workflow id steps outputs #:key (other '()))
   "Build a Workflow class CWL workflow."
-  (let* ((inputs
+  (let* ((steps (auto-connect steps))
+         (inputs
           ;; When the same input is used by multiple steps, there will
           ;; be duplicates. So, deduplicate.
           (delete-duplicates
@@ -132,11 +162,7 @@
            input=?))
          ;; List of non-internal inputs that should be interfaced with
          ;; the outside world.
-         (interface-inputs
-          (filter (lambda (input)
-                    (string=? (input-id input)
-                              (input-source input)))
-                  inputs)))
+         (interface-inputs (remove input-source inputs)))
     (make-step id
                `((cwlVersion . "v1.1")
                  (class . Workflow)
@@ -154,7 +180,8 @@
                                   `(,(step-id step)
                                     (in . ,(map (lambda (input)
                                                   (cons (input-id input)
-                                                        (input-source input)))
+                                                        (or (input-source input)
+                                                            (input-id input))))
                                                 (step-in step)))
                                     (out . ,(list->vector (map output-id (step-out step))))
                                     (run . ,(match (step-run step)