diff options
Diffstat (limited to 'scripts/ccwl')
-rwxr-xr-x | scripts/ccwl | 111 |
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)) |