aboutsummaryrefslogtreecommitdiffstats
path: root/gitto/ui.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gitto/ui.scm')
-rw-r--r--gitto/ui.scm27
1 files changed, 26 insertions, 1 deletions
diff --git a/gitto/ui.scm b/gitto/ui.scm
index fffe080..093e784 100644
--- a/gitto/ui.scm
+++ b/gitto/ui.scm
@@ -17,8 +17,11 @@
;; along with gitto. If not, see <http://www.gnu.org/licenses/>.
(define-module (gitto ui)
+ #:use-module (ice-9 format)
+ #:use-module (ice-9 i18n)
#:use-module (ice-9 rdelim)
- #:export (y-or-n?))
+ #:export (y-or-n?
+ choose))
(define* (y-or-n? prompt #:key (default #f))
(format #t "~a [~a] " prompt (if default "Y/n" "y/N"))
@@ -35,3 +38,25 @@
(display "Invalid response, please use `y' or `n'.")
(newline)
(y-or-n? prompt #:default default)))))
+
+(define* (choose collection prompt #:optional (key identity))
+ "Ask the user to choose one of COLLECTION.
+
+PROMPT is the question to ask the user and KEY is the function to use
+to present the options to the user."
+ (format #t "~a~%~%Choose one:~%~%" prompt)
+
+ (do ((idx 1 (1+ idx))
+ (cll collection (cdr cll)))
+ ((null? cll))
+ (format #t "~3d. ~a~%" idx (key (car cll))))
+
+ (newline)
+ (display "Your Choice: ")
+
+ (let ((response (locale-string->integer (read-line))))
+ (if (and response (<= 1 response (length collection)))
+ (list-ref collection (1- response))
+ (begin
+ (format #t "Improper response.~%")
+ (choose collection prompt key)))))