diff options
Diffstat (limited to 'lib/oneliner.lisp')
-rw-r--r-- | lib/oneliner.lisp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/oneliner.lisp b/lib/oneliner.lisp new file mode 100644 index 0000000..b7b404b --- /dev/null +++ b/lib/oneliner.lisp @@ -0,0 +1,59 @@ +;;;; oneliner.lisp -- holds a local representation of onelienrs. + +(in-package :oneliners.cli) + +(defstruct oneliner + id + name + oneliner + tags + brief + explanation + runstyle + createdat + editedat + createdby + isflagged + islocked) + + +(defun collect-positional-arguments (ol) + "Collects the names of all positional arguments in the oneliner, prefix included." + (remove-duplicates + (sort + (ppcre:all-matches-as-strings "#[1-9][0-9]*" (oneliner-oneliner ol)) + #'string<) + :test #'equal)) + +(defun collect-named-arguments (ol) + "Collects the names of all named arguments in the oneliner, prefix included" + (remove-duplicates + (ppcre:all-matches-as-strings "#[A-Za-z][A-Za-z0-9_]*" (oneliner-oneliner ol)) + :test #'equal)) + +(defun tags-from-oneliner (string) + "Splits a string using consequitive whitespace as a separator, +returning a set of tags" + (remove-duplicates + (remove-if-not #'executable-on-system-p (ppcre:split " +" string)) + :test #'equal)) + + + + +;;; VALIDATION OF ONELINER SLOT VALUES + +(defun valid-oneliner-string-p (string) + (and (not (find #\newline string)) + (tags-from-oneliner string))) + +(defun valid-brief-description-p (string) + (<= (length string) 72)) + +(defun valid-runstyle-p (string) + (member string '("auto" "manual") :test 'equalp)) + +(defun valid-oneliner-name-p (string) + (or (equal string "") + (and (< 2 (length string)) + (ppcre:scan "^[a-zA-Z][a-zA-Z0-9_\-]+$" string)))) |