diff options
author | Colin Okay <okay@toyful.space> | 2022-03-06 11:34:25 -0600 |
---|---|---|
committer | Colin Okay <okay@toyful.space> | 2022-03-06 11:34:25 -0600 |
commit | 18e44a06ddf3a379159afcaf14dd96800b54ebf2 (patch) | |
tree | 523cef284fd97b40a155d8adfc7d6e60498506d8 | |
parent | dd22216b2d84341c4aac2dec3692bf36d9655f5a (diff) |
moved prompt into its own package
-rw-r--r-- | oneliners.cli.asd | 3 | ||||
-rw-r--r-- | src/app.lisp | 11 | ||||
-rw-r--r-- | src/prompt.lisp | 33 |
3 files changed, 41 insertions, 6 deletions
diff --git a/oneliners.cli.asd b/oneliners.cli.asd index 86d69a9..eee30ba 100644 --- a/oneliners.cli.asd +++ b/oneliners.cli.asd @@ -13,7 +13,8 @@ "oneliners.api-client") :components ((:module "src" :components - ((:file "lib") + ((:file "prompt") + (:file "lib") (:file "app")))) :description "") diff --git a/src/app.lisp b/src/app.lisp index 812081f..c3b4c0a 100644 --- a/src/app.lisp +++ b/src/app.lisp @@ -186,9 +186,6 @@ than the users." (string-equal header (net.didierverna.clon::header item))) return item)) - -;;; MAIN ENTRY POINT - (defun prepare-oneliner-arguments (arguments) "Takes a list of arguments, as gathered by (REMAINDER), and returns a list that looks like (ID-OR-NAME . ARGS) where ID-OR-NAME is @@ -197,6 +194,8 @@ than the users." (cons id (rest arguments)) arguments)) +;;; MAIN ENTRY POINT + (defun main () "Entry point for our standalone application." (make-context) @@ -272,14 +271,16 @@ than the users." ((getopt :long-name "run") (cli::run-item id-or-name args :timeout (getopt :long-name "timeout"))) - (t + + (t ; arguments but no overriding flags, search wiki (cli::search-for-oneliners arguments (getopt :long-name "limit") (getopt :long-name "not-flagged") (getopt :long-name "all-flagged") (getopt :long-name "newest"))))) (uiop:quit)) - (t + + (t ; no arguments and no options, print help (help))) (uiop:quit)) (error (e) diff --git a/src/prompt.lisp b/src/prompt.lisp new file mode 100644 index 0000000..afe8604 --- /dev/null +++ b/src/prompt.lisp @@ -0,0 +1,33 @@ +;;;; prompt.lisp -- a function using readlline to collect text from the user + +(defpackage #:oneliners.cli.prompt + (:use #:cl) + (:local-nicknames (#:rl #:cl-readline)) + (:export #:prompt)) + +(in-package :oneliners.cli.prompt) + +(defun prompt (prompt + &key + (expect (constantly t)) + retry-text + (prefill "")) + ;; register a prefill hook + (rl:register-hook + :pre-input + (lambda () + (rl:insert-text prefill) + (rl:redisplay))) + (unwind-protect + (loop + with prompt-text = prompt + with should-retry-p = t + while should-retry-p + for line = (rl:readline :prompt prompt-text) + when (funcall expect line) + do (setf should-retry-p nil) + when retry-text + do (setf prompt-text retry-text) + finally (return line)) + ;; unregisters the hook. + (rl:register-hook :pre-input nil))) |