summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ccwl/ccwl.scm87
1 files changed, 47 insertions, 40 deletions
diff --git a/ccwl/ccwl.scm b/ccwl/ccwl.scm
index a9745b1..b1425f8 100644
--- a/ccwl/ccwl.scm
+++ b/ccwl/ccwl.scm
@@ -61,7 +61,6 @@
                          (cons 'default (input-default input)))))
     ,@(input-other input)))
 
-(define* (workflow steps outputs #:key (other '()))
 (define-immutable-record-type <step>
   (make-step id run in out)
   step?
@@ -111,47 +110,55 @@
   (string=? (input-id input1)
             (input-id input2)))
 
+(define* (workflow id steps outputs #:key (other '()))
   "Build a Workflow class CWL workflow."
-  `((cwlVersion . "v1.1")
-    (class . Workflow)
-    ,@other
-    (inputs . ,(delete-duplicates
-                (map input->tree
-                     (append
-                      (append-map (lambda (step)
-                                    (filter-map (match-lambda
-                                                  ((id . (? input? input)) input)
-                                                  ((? input? input) input)
-                                                  (_ #f))
+  (let* ((inputs
+          ;; When the same input is used by multiple steps, there will
+          ;; be duplicates. So, deduplicate.
+          (delete-duplicates
+           (append (append-map step-in steps)
+                   ;; If an input is directly copied to the output, an
+                   ;; output-source will be an <input> object.
+                   (filter-map (lambda (output)
+                                 (and (input? (output-source output))
+                                      (output-source output)))
+                               outputs))
+           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)))
+    (make-step id
+               `((cwlVersion . "v1.1")
+                 (class . Workflow)
+                 (requirements (Subworkflow-feature-requirement))
+                 ,@other
+                 (inputs . ,(map input->tree interface-inputs))
+                 (outputs . ,(map (lambda (output)
+                                    `(,(output-id output)
+                                      (type . ,(output-type output))
+                                      (output-source . ,(match (output-source output)
+                                                          ((? string? source) source)
+                                                          ((? input? input) (input-id input))))))
+                                  outputs))
+                 (steps . ,(map (lambda (step)
+                                  `(,(step-id step)
+                                    (in . ,(map (lambda (input)
+                                                  (cons (input-id input)
+                                                        (input-source input)))
                                                 (step-in step)))
-                                  steps)
-                      (filter-map (lambda (output)
-                                    (and (input? (workflow-output-source output))
-                                         (workflow-output-source output)))
-                                  outputs)))))
-    (outputs . ,(map (lambda (output)
-                       `(,(workflow-output-id output)
-                         (type . ,(workflow-output-type output))
-                         (output-source . ,(match (workflow-output-source output)
-                                             ((? string? source) source)
-                                             ((? input? input) (input-id input))))))
-                     outputs))
-    (steps . ,(map (lambda (step)
-                     `(,(step-id step)
-                       (in . ,(map (match-lambda
-                                     ((id . input)
-                                      (cons id (if (input? input)
-                                                   (input-id input)
-                                                   input)))
-                                     ((? input? input)
-                                      (cons (input-id input) (input-id input)))
-                                     ((? intermediate? intermediate)
-                                      (cons (input-id (intermediate-input intermediate))
-                                            (intermediate-output-source intermediate))))
-                                   (step-in step)))
-                       (out . ,(list->vector (step-out step)))
-                       (run . ,(step-run step))))
-                   steps))))
+                                    (out . ,(list->vector (map output-id (step-out step))))
+                                    (run . ,(match (step-run step)
+                                              ((? command? command)
+                                               (command->cwl command))
+                                              (tree tree)))))
+                                steps)))
+               interface-inputs
+               outputs)))
+
 (define (output->cwl output)
   `(,(output-id output)
     ,@(filter identity