aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Okay <okay@toyful.space>2022-03-06 11:34:25 -0600
committerColin Okay <okay@toyful.space>2022-03-06 11:34:25 -0600
commit18e44a06ddf3a379159afcaf14dd96800b54ebf2 (patch)
tree523cef284fd97b40a155d8adfc7d6e60498506d8
parentdd22216b2d84341c4aac2dec3692bf36d9655f5a (diff)
moved prompt into its own package
-rw-r--r--oneliners.cli.asd3
-rw-r--r--src/app.lisp11
-rw-r--r--src/prompt.lisp33
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)))