summaryrefslogtreecommitdiff
path: root/scripts/ccwl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ccwl')
-rwxr-xr-xscripts/ccwl111
1 files changed, 111 insertions, 0 deletions
diff --git a/scripts/ccwl b/scripts/ccwl
new file mode 100755
index 0000000..1521803
--- /dev/null
+++ b/scripts/ccwl
@@ -0,0 +1,111 @@
+#! /usr/bin/env guile
+!#
+;;; ccwl --- Concise Common Workflow Language
+;;; Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net>
+;;;
+;;; This file is part of ccwl.
+;;;
+;;; ccwl is free software: you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation, either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; ccwl is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with ccwl. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This script is the command-line interface to ccwl.
+
+;;; Code:
+
+(use-modules (srfi srfi-28)
+ (srfi srfi-37)
+ (ice-9 match)
+ (ccwl ccwl)
+ (ccwl cwl)
+ (ccwl graphviz))
+
+(define (invalid-option opt name arg result)
+ (error "Invalid option" name))
+
+(define (invalid-operand arg result)
+ (error "Invalid argument" arg))
+
+(define %help-option
+ (option (list "help") #f #t
+ (lambda (opt name arg result)
+ (acons 'help #t result))))
+
+(define main
+ (match-lambda*
+ ((program "compile" args ...)
+ (let* ((args (args-fold args
+ (list (option (list #\t "to") #t #f
+ (lambda (opt name arg result)
+ (let ((supported (list "cwl" "dot")))
+ (unless (member arg supported)
+ (scm-error 'misc-error
+ #f
+ "Invalid target ~A argument ~S. Supported targets are ~A."
+ (list (if (char? name)
+ (string #\- name)
+ (string-append "--" name))
+ arg
+ (string-join supported ", "))
+ #f)))
+ (acons 'to arg result)))
+ %help-option)
+ invalid-option
+ (lambda (arg result)
+ (acons 'source-file arg result))
+ '((to . "cwl")))))
+ (when (or (assq 'help args)
+ (not (assq-ref args 'source-file)))
+ (display (format "Usage: ~a compile [OPTIONS] SOURCE-FILE
+Compile SOURCE-FILE.
+
+ -t, --to=TARGET compile SOURCE-FILE to TARGET language;
+ Supported targets are cwl (default) and dot.
+
+"
+ program)
+ (current-error-port))
+ (exit (assq 'help args)))
+ ;; FIXME: Compiling ccwl files fails since the workflow macro is
+ ;; unable to access command definitions.
+ (set! %load-should-auto-compile #f)
+ (let ((to (assq-ref args 'to)))
+ ((cond
+ ((string=? to "cwl") workflow->cwl)
+ ((string=? to "dot") workflow->dot))
+ (load (canonicalize-path (assq-ref args 'source-file)))
+ (current-output-port)))))
+ ((program args ...)
+ (let ((args (args-fold args
+ (list %help-option)
+ (lambda (opt name arg result)
+ result)
+ (lambda (arg result)
+ result)
+ '())))
+ (display (format "Usage: ~a COMMAND [OPTIONS] [ARGS]
+
+COMMAND must be one of the sub-commands listed below:
+
+ compile compile a workflow
+
+To get usage information for one of these sub-commands, run
+ ~a COMMAND --help
+
+"
+ program program)
+ (current-error-port))
+ (exit (assq 'help args))))))
+
+(apply main (command-line))