;;;; 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))))