aboutsummaryrefslogtreecommitdiff
path: root/lib/oneliner.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/oneliner.lisp')
-rw-r--r--lib/oneliner.lisp59
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))))